@@ -65,12 +65,18 @@ func New(key []byte, aeadType AEADTypeEnum, IVBitLen int, useHKDF bool, forceDec
65
65
66
66
// Initialize EME for filename encryption.
67
67
var emeCipher * eme.EMECipher
68
+ var err error
68
69
{
69
- emeKey := key
70
+ var emeBlockCipher cipher. Block
70
71
if useHKDF {
71
- emeKey = hkdfDerive (key , hkdfInfoEMENames , KeyLen )
72
+ emeKey := hkdfDerive (key , hkdfInfoEMENames , KeyLen )
73
+ emeBlockCipher , err = aes .NewCipher (emeKey )
74
+ for i := range emeKey {
75
+ emeKey [i ] = 0
76
+ }
77
+ } else {
78
+ emeBlockCipher , err = aes .NewCipher (key )
72
79
}
73
- emeBlockCipher , err := aes .NewCipher (emeKey )
74
80
if err != nil {
75
81
log .Panic (err )
76
82
}
@@ -80,9 +86,11 @@ func New(key []byte, aeadType AEADTypeEnum, IVBitLen int, useHKDF bool, forceDec
80
86
// Initialize an AEAD cipher for file content encryption.
81
87
var aeadCipher cipher.AEAD
82
88
if aeadType == BackendOpenSSL || aeadType == BackendGoGCM {
83
- gcmKey := key
89
+ var gcmKey [] byte
84
90
if useHKDF {
85
91
gcmKey = hkdfDerive (key , hkdfInfoGCMContent , KeyLen )
92
+ } else {
93
+ gcmKey = append ([]byte {}, key ... )
86
94
}
87
95
switch aeadType {
88
96
case BackendOpenSSL :
@@ -100,22 +108,29 @@ func New(key []byte, aeadType AEADTypeEnum, IVBitLen int, useHKDF bool, forceDec
100
108
log .Panic (err )
101
109
}
102
110
}
111
+ for i := range gcmKey {
112
+ gcmKey [i ] = 0
113
+ }
103
114
} else if aeadType == BackendAESSIV {
104
115
if IVLen != 16 {
105
116
// SIV supports any nonce size, but we only use 16.
106
117
log .Panic ("AES-SIV must use 16-byte nonces" )
107
118
}
119
+ // AES-SIV uses 1/2 of the key for authentication, 1/2 for
120
+ // encryption, so we need a 64-bytes key for AES-256. Derive it from
121
+ // the 32-byte master key using HKDF, or, for older filesystems, with
122
+ // SHA256.
108
123
var key64 []byte
109
124
if useHKDF {
110
125
key64 = hkdfDerive (key , hkdfInfoSIVContent , siv_aead .KeyLen )
111
126
} else {
112
- // AES-SIV uses 1/2 of the key for authentication, 1/2 for
113
- // encryption, so we need a 64-bytes key for AES-256. Derive it from
114
- // the master key by hashing it with SHA-512.
115
127
s := sha512 .Sum512 (key )
116
128
key64 = s [:]
117
129
}
118
130
aeadCipher = siv_aead .New (key64 )
131
+ for i := range key64 {
132
+ key64 [i ] = 0
133
+ }
119
134
} else {
120
135
log .Panic ("unknown backend cipher" )
121
136
}
@@ -129,20 +144,25 @@ func New(key []byte, aeadType AEADTypeEnum, IVBitLen int, useHKDF bool, forceDec
129
144
}
130
145
}
131
146
147
+ type wiper interface {
148
+ Wipe ()
149
+ }
150
+
132
151
// Wipe tries to wipe secret keys from memory by overwriting them with zeros
133
152
// and/or setting references to nil.
134
153
//
135
154
// This is not bulletproof due to possible GC copies, but
136
155
// still raises to bar for extracting the key.
137
156
func (c * CryptoCore ) Wipe () {
138
- if c .AEADBackend == BackendOpenSSL {
139
- tlog .Debug .Print ("CryptoCore.Wipe: Wiping stupidgcm key" )
157
+ be := c .AEADBackend
158
+ if be == BackendOpenSSL || be == BackendAESSIV {
159
+ tlog .Debug .Printf ("CryptoCore.Wipe: Wiping AEADBackend %d key" , be )
140
160
// We don't use "x, ok :=" because we *want* to crash loudly if the
141
- // type assertion fails (it should never fail) .
142
- sgcm := c .AEADCipher .(* stupidgcm. StupidGCM )
143
- sgcm .Wipe ()
161
+ // type assertion fails.
162
+ w := c .AEADCipher .(wiper )
163
+ w .Wipe ()
144
164
} else {
145
- tlog .Debug .Print ("CryptoCore.Wipe: niling stdlib refs" )
165
+ tlog .Debug .Print ("CryptoCore.Wipe: Only nil'ing stdlib refs" )
146
166
}
147
167
// We have no access to the keys (or key-equivalents) stored inside the
148
168
// Go stdlib. Best we can is to nil the references and force a GC.
0 commit comments