* Naming
* If this is not some OpenPGP standard I follow rule that `DES` should be
upper case as it is abreviation and `Triple` should be camel-case as it
is normal word hence `TripleDES`
* rename `errors2` -> `errorsPGP`
* long lines
* https://github.com/golang/go/wiki/CodeReviewComments#line-length
* I bit improved long lines based on my folding
* reuse type in definition if possible i.e. `a string, b string, c string` -> `a,b,c string`
* `if long_statetent(); err!=nil {` -> `long_statement;↵ if err!=nil {`
* spaces around operators (e.g. `a + b` -> `a+b`)
* removing empty lines on start and end of scope
* comments
* on all exported functions
* start with function name
* import:
* order in alphabet
* separate native, golang.org/x/ and our libs
33 lines
1,022 B
Go
33 lines
1,022 B
Go
package crypto
|
|
|
|
import (
|
|
"crypto/aes"
|
|
"crypto/cipher"
|
|
|
|
"golang.org/x/crypto/scrypt"
|
|
)
|
|
|
|
// EncryptWithoutIntegrity encrypts data with AES-CTR. Note: this encryption
|
|
// mode is not secure when stored/sent on an untrusted medium.
|
|
func EncryptWithoutIntegrity(key, input, iv []byte) (output []byte, err error) {
|
|
var block cipher.Block
|
|
if block, err = aes.NewCipher(key); err != nil {
|
|
return
|
|
}
|
|
output = make([]byte, len(input))
|
|
stream := cipher.NewCTR(block, iv)
|
|
stream.XORKeyStream(output, input)
|
|
return
|
|
}
|
|
|
|
// DecryptWithoutIntegrity decrypts data encrypted with AES-CTR.
|
|
func DecryptWithoutIntegrity(key, input, iv []byte) ([]byte, error) {
|
|
// AES-CTR decryption is identical to encryption.
|
|
return EncryptWithoutIntegrity(key, input, iv)
|
|
}
|
|
|
|
// DeriveKey derives a key from a password using scrypt. N should be set to the
|
|
// highest power of 2 you can derive within 100 milliseconds.
|
|
func DeriveKey(password string, salt []byte, N int) ([]byte, error) {
|
|
return scrypt.Key([]byte(password), salt, N, 8, 1, 32)
|
|
}
|