1+ // Package andotp implements functions to encrypt/decrypt andOTP files.
12package andotp
23
34import (
@@ -6,51 +7,52 @@ import (
67 "crypto/sha1"
78 "encoding/binary"
89 "fmt"
9- "io/ioutil"
1010 "math/rand"
1111
1212 "golang.org/x/crypto/pbkdf2"
1313)
1414
1515const (
16- IV_LEN int = 12
17- KEY_LEN int = 32
18- ITERATION_LEN int = 4
19- SALT_LEN int = 12
20- MAX_ITERATIONS int = 160000
21- MIN_ITERATIONS int = 140000
16+ ivLen int = 12
17+ keyLen int = 32
18+ iterationLen int = 4
19+ saltLen int = 12
20+ maxIterations int = 160000
21+ minIterations int = 140000
2222)
2323
24+ // Encrypt encrypts plaintext with password according to andotp encryption standard.
25+ // It returns encrypted byte array and any error encountered.
2426func Encrypt (plaintext []byte , password string ) ([]byte , error ) {
2527
2628 var finalCipher []byte
27- iter := make ([]byte , ITERATION_LEN )
28- iv := make ([]byte , IV_LEN )
29- salt := make ([]byte , SALT_LEN )
29+ iter := make ([]byte , iterationLen )
30+ iv := make ([]byte , ivLen )
31+ salt := make ([]byte , saltLen )
3032
31- iterations := rand .Intn (MAX_ITERATIONS - MIN_ITERATIONS ) + MIN_ITERATIONS
33+ iterations := rand .Intn (maxIterations - minIterations ) + minIterations
3234 binary .BigEndian .PutUint32 (iter , uint32 (iterations ))
3335
3436 _ , err := rand .Read (iv )
3537 if err != nil {
36- return nil , FormatError (err .Error ())
38+ return nil , formatError (err .Error ())
3739 }
3840
3941 _ , err = rand .Read (salt )
4042 if err != nil {
41- return nil , FormatError (err .Error ())
43+ return nil , formatError (err .Error ())
4244 }
4345
44- secretKey := pbkdf2 .Key ([]byte (password ), salt , iterations , KEY_LEN , sha1 .New )
46+ secretKey := pbkdf2 .Key ([]byte (password ), salt , iterations , keyLen , sha1 .New )
4547
4648 block , err := aes .NewCipher (secretKey )
4749 if err != nil {
48- return nil , FormatError (err .Error ())
50+ return nil , formatError (err .Error ())
4951 }
5052
5153 aesgcm , err := cipher .NewGCM (block )
5254 if err != nil {
53- return nil , FormatError (err .Error ())
55+ return nil , formatError (err .Error ())
5456 }
5557
5658 cipherText := aesgcm .Seal (nil , iv , plaintext , nil )
@@ -64,37 +66,35 @@ func Encrypt(plaintext []byte, password string) ([]byte, error) {
6466
6567}
6668
69+ // Decrypt decrypts encryptedtext using password.
70+ // It returns decrypted byte array and any error encountered.
6771func Decrypt (encryptedtext []byte , password string ) ([]byte , error ) {
6872
69- iterations := encryptedtext [:ITERATION_LEN ]
70- salt := encryptedtext [ITERATION_LEN : ITERATION_LEN + SALT_LEN ]
71- iv := encryptedtext [ITERATION_LEN + SALT_LEN : ITERATION_LEN + SALT_LEN + IV_LEN ]
72- cipherText := encryptedtext [ITERATION_LEN + SALT_LEN + IV_LEN :]
73+ iterations := encryptedtext [:iterationLen ]
74+ salt := encryptedtext [iterationLen : iterationLen + saltLen ]
75+ iv := encryptedtext [iterationLen + saltLen : iterationLen + saltLen + ivLen ]
76+ cipherText := encryptedtext [iterationLen + saltLen + ivLen :]
7377 iter := int (binary .BigEndian .Uint32 (iterations ))
74- secretKey := pbkdf2 .Key ([]byte (password ), salt , iter , KEY_LEN , sha1 .New )
78+ secretKey := pbkdf2 .Key ([]byte (password ), salt , iter , keyLen , sha1 .New )
7579
7680 block , err := aes .NewCipher (secretKey )
7781 if err != nil {
78- return nil , FormatError (err .Error ())
82+ return nil , formatError (err .Error ())
7983 }
8084
8185 aesgcm , err := cipher .NewGCM (block )
8286 if err != nil {
83- return nil , FormatError (err .Error ())
87+ return nil , formatError (err .Error ())
8488 }
8589
8690 plaintextbytes , err := aesgcm .Open (nil , iv , cipherText , nil )
8791 if err != nil {
88- return nil , FormatError (err .Error ())
92+ return nil , formatError (err .Error ())
8993 }
9094
9195 return plaintextbytes , nil
9296}
9397
94- func FormatError (e string ) error {
98+ func formatError (e string ) error {
9599 return fmt .Errorf ("error: %s" , e )
96100}
97-
98- func ReadFile (file string ) ([]byte , error ) {
99- return ioutil .ReadFile (file )
100- }
0 commit comments