-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathenc_kx_encryptor.go
98 lines (79 loc) · 1.89 KB
/
enc_kx_encryptor.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package crypka
import "bytes"
type encKxEncryptor struct {
algo *EncAsymKXAlgo
public KXPublic
ctx KeyContext
encoding intEncoding
wrappedEncryptor Encryptor
cachedError error
}
func (enc *encKxEncryptor) GetEncInfo() EncInfo {
return EncInfo{
RequiresFinalization: enc.algo.GetInfo().RequiresFinalization,
EncType: enc.algo.GetInfo().EncType,
}
}
func (enc *encKxEncryptor) Encrypt(in, appendTo []byte) (res []byte, err error) {
if enc.cachedError != nil {
err = enc.cachedError
return
}
defer func() {
if err != nil {
enc.cachedError = err
}
}()
if enc.wrappedEncryptor != nil {
return enc.wrappedEncryptor.Encrypt(in, appendTo)
}
res = appendTo
ephPublic, ephSecret, err := enc.algo.KXAlgo.GenerateKXPair(enc.ctx, enc.algo.EphemeralRNG)
if err != nil {
return
}
buf := make([]byte, enc.algo.KXResultLength)
err = enc.algo.KXAlgo.PerformExchange(enc.ctx, enc.public, ephSecret, buf)
if err != nil {
return
}
var keyRNG RNG
if enc.algo.RNGAlgo == nil {
keyRNG = bytes.NewReader(buf)
} else {
keyRNG, err = enc.algo.RNGAlgo.MakeRng(enc.ctx, buf)
if err != nil {
return
}
}
sk, err := enc.algo.EncSymmAlgo.GenerateKey(enc.ctx, keyRNG)
if err != nil {
return
}
enc.wrappedEncryptor, err = sk.MakeEncryptor(enc.ctx)
if err != nil {
return
}
ephPubMar, err := MarshalKeyToSlice(ephPublic)
if err != nil {
return
}
res, _ = enc.encoding.AppendToBuf(res, uint64(len(ephPubMar)))
res = append(res, ephPubMar...)
res, err = enc.wrappedEncryptor.Encrypt(in, res)
return
}
func (enc *encKxEncryptor) Finalize(appendTo []byte) (res []byte, err error) {
if enc.cachedError != nil {
err = enc.cachedError
return
}
if enc.GetEncInfo().RequiresFinalization && enc.wrappedEncryptor == nil {
err = ErrEncAuthFiled
return
}
if enc.wrappedEncryptor != nil {
return enc.wrappedEncryptor.Finalize(appendTo)
}
return
}