-
Notifications
You must be signed in to change notification settings - Fork 0
/
aead_cipher.go
69 lines (57 loc) · 1.49 KB
/
aead_cipher.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package cipher
import (
"crypto/aes"
"crypto/cipher"
"golang.org/x/crypto/chacha20poly1305"
)
var info = []byte("ss-subkey")
type AEADCipher interface {
KeySize() int
SaltSize() int
GetEncrypter([]byte) (cipher.AEAD, error)
GetDecrypter([]byte) (cipher.AEAD, error)
}
type metaAEADCipher struct {
key []byte
saltSize int
makeAEAD func(key []byte) (cipher.AEAD, error)
}
func (c *metaAEADCipher) KeySize() int { return len(c.key) }
func (c *metaAEADCipher) SaltSize() int { return c.saltSize }
func (c *metaAEADCipher) GetEncrypter(salt []byte) (cipher.AEAD, error) {
outKey := make([]byte, c.KeySize())
hkdfSha1(c.key, salt, info, outKey)
return c.makeAEAD(outKey)
}
func (c *metaAEADCipher) GetDecrypter(salt []byte) (cipher.AEAD, error) {
outKey := make([]byte, c.KeySize())
hkdfSha1(c.key, salt, info, outKey)
return c.makeAEAD(outKey)
}
func AesGcm(key []byte, saltSize int) (AEADCipher, error) {
return &metaAEADCipher{
key: key,
saltSize: saltSize,
makeAEAD: func(key []byte) (cipher.AEAD, error) {
blk, err := aes.NewCipher(key)
if err != nil {
return nil, err
}
return cipher.NewGCM(blk)
},
}, nil
}
func Chacha20Poly1305(key []byte, saltSize int) (AEADCipher, error) {
return &metaAEADCipher{
key: key,
saltSize: saltSize,
makeAEAD: chacha20poly1305.New,
}, nil
}
func XChacha20Poly1305(key []byte, saltSize int) (AEADCipher, error) {
return &metaAEADCipher{
key: key,
saltSize: saltSize,
makeAEAD: chacha20poly1305.NewX,
}, nil
}