@@ -59,24 +59,28 @@ type WrapParams struct {
59
59
KeySym []byte
60
60
}
61
61
62
+ // Contains a successfully decrypted message prior to parsing and validating
62
63
type ReceivedMessage interface {
63
64
ValidateAndParse () bool
64
65
GetPayload () []byte
65
66
GetSrc () * ecdsa.PublicKey
66
67
}
67
68
69
+ // Crypto contains methods from MessageCrypto, CryptoBackend and CryptoUtils
68
70
type Crypto interface {
69
71
MessageCrypto
70
72
CryptoBackend
71
73
CryptoUtils
72
74
}
73
75
76
+ // MessageCrypto contains methods for wrapping(encrypting) and unwrapping(decrypting) messages
74
77
type MessageCrypto interface {
75
78
WrapMessage (msgData []byte , params * WrapParams ) (data []byte , err error )
76
79
UnWrapSymmetric (encryptedData , key []byte ) (ReceivedMessage , error )
77
80
UnWrapAsymmetric (encryptedData []byte , key * ecdsa.PrivateKey ) (ReceivedMessage , error )
78
81
}
79
82
83
+ // CryptoBackend contains key manipulation methods
80
84
type CryptoBackend interface {
81
85
82
86
// Key store functions
@@ -92,7 +96,7 @@ type CryptoBackend interface {
92
96
CompressPubkey (pubkey * ecdsa.PublicKey ) []byte
93
97
}
94
98
95
- //Used only in tests
99
+ // CryptoUtils contains utility methods for tests
96
100
type CryptoUtils interface {
97
101
GenerateKey () (* ecdsa.PrivateKey , error )
98
102
NewKeyPair (ctx context.Context ) (string , error )
@@ -125,13 +129,14 @@ type receivedMessage struct {
125
129
Src * ecdsa.PublicKey // Source public key used for signing the message
126
130
Dst * ecdsa.PublicKey // Destination public key used for encrypting the msessage asymmetrically
127
131
128
- crypto defaultCryptoBackend
132
+ crypto * defaultCryptoBackend
129
133
}
130
134
131
135
func (msg receivedMessage ) GetSrc () * ecdsa.PublicKey {
132
136
return msg .Src
133
137
}
134
138
139
+ // ValidateAndParse checks that the format and the signnature are correct. It also set Payload as the parsed message
135
140
func (msg * receivedMessage ) ValidateAndParse () bool {
136
141
end := len (msg .Raw )
137
142
if end < 1 {
@@ -166,12 +171,13 @@ func (msg *receivedMessage) ValidateAndParse() bool {
166
171
return true
167
172
}
168
173
174
+ // GetPayload obtains the parsed payload of the message. Should be called after ValidateAndParse
169
175
func (msg receivedMessage ) GetPayload () []byte {
170
176
return msg .Payload
171
177
}
172
178
173
179
// sigToPubKey returns the public key associated to the message's signature.
174
- // should only be called id message has been signed
180
+ // should only be called if message has been signed
175
181
func (msg * receivedMessage ) sigToPubKey () * ecdsa.PublicKey {
176
182
defer func () { recover () }() // in case of invalid signature
177
183
@@ -188,6 +194,14 @@ func (msg *receivedMessage) sigToPubKey() *ecdsa.PublicKey {
188
194
return pub
189
195
}
190
196
197
+ func newReceivedMessage (decrypted []byte , salt []byte , crypto * defaultCryptoBackend ) * receivedMessage {
198
+ return & receivedMessage {
199
+ Raw : decrypted ,
200
+ Salt : salt ,
201
+ crypto : crypto ,
202
+ }
203
+ }
204
+
191
205
func New () Crypto {
192
206
cryptoBackend = defaultCryptoBackend {
193
207
symKeys : make (map [string ][]byte ),
@@ -205,7 +219,7 @@ func NewCryptoUtils() CryptoUtils {
205
219
206
220
// == Message Crypto ==
207
221
208
- func (crypto defaultCryptoBackend ) WrapMessage (payload []byte , params * WrapParams ) (data []byte , err error ) {
222
+ func (crypto * defaultCryptoBackend ) WrapMessage (payload []byte , params * WrapParams ) (data []byte , err error ) {
209
223
var padding []byte
210
224
if createPadding {
211
225
padding , err = crypto .generateSecureRandomData (defaultPaddingByteSize )
@@ -248,20 +262,20 @@ func (crypto defaultCryptoBackend) WrapMessage(payload []byte, params *WrapParam
248
262
return
249
263
}
250
264
251
- func (crypto defaultCryptoBackend ) UnWrapSymmetric (encryptedData , key []byte ) (ReceivedMessage , error ) {
265
+ func (crypto * defaultCryptoBackend ) UnWrapSymmetric (encryptedData , key []byte ) (ReceivedMessage , error ) {
252
266
decrypted , salt , err := crypto .decryptSymmetric (encryptedData , key )
253
267
if err != nil {
254
268
return nil , err
255
269
}
256
- msg := newDecryptedMessage (decrypted , salt )
270
+ msg := newReceivedMessage (decrypted , salt , & crypto )
257
271
return msg , err
258
272
}
259
273
260
- func (crypto defaultCryptoBackend ) UnWrapAsymmetric (encryptedData []byte , key * ecdsa.PrivateKey ) (ReceivedMessage , error ) {
274
+ func (crypto * defaultCryptoBackend ) UnWrapAsymmetric (encryptedData []byte , key * ecdsa.PrivateKey ) (ReceivedMessage , error ) {
261
275
decrypted , err := crypto .decryptAsymmetric (encryptedData , key )
262
276
switch err {
263
277
case nil :
264
- message := newDecryptedMessage (decrypted , nil )
278
+ message := newReceivedMessage (decrypted , nil , & crypto )
265
279
return message , nil
266
280
case ecies .ErrInvalidPublicKey : // addressed to somebody else
267
281
return nil , err
@@ -270,14 +284,7 @@ func (crypto defaultCryptoBackend) UnWrapAsymmetric(encryptedData []byte, key *e
270
284
}
271
285
}
272
286
273
- func newDecryptedMessage (decrypted []byte , salt []byte ) * receivedMessage {
274
- return & receivedMessage {
275
- Raw : decrypted ,
276
- Salt : salt ,
277
- }
278
- }
279
-
280
- func (crypto defaultCryptoBackend ) addPayloadSizeField (rawBytes rawMessage , payload []byte ) rawMessage {
287
+ func (crypto * defaultCryptoBackend ) addPayloadSizeField (rawBytes rawMessage , payload []byte ) rawMessage {
281
288
fieldSize := getSizeOfPayloadSizeField (payload )
282
289
field := make ([]byte , 4 )
283
290
binary .LittleEndian .PutUint32 (field , uint32 (len (payload )))
@@ -289,7 +296,7 @@ func (crypto defaultCryptoBackend) addPayloadSizeField(rawBytes rawMessage, payl
289
296
290
297
// appendPadding appends the padding specified in params.
291
298
// If no padding is provided in params, then random padding is generated.
292
- func (crypto defaultCryptoBackend ) appendPadding (rawBytes , payload []byte , src * ecdsa.PrivateKey ) (rawMessage , error ) {
299
+ func (crypto * defaultCryptoBackend ) appendPadding (rawBytes , payload []byte , src * ecdsa.PrivateKey ) (rawMessage , error ) {
293
300
rawSize := flagsLength + getSizeOfPayloadSizeField (payload ) + len (payload )
294
301
if src != nil {
295
302
rawSize += signatureLength
@@ -311,7 +318,7 @@ func (crypto defaultCryptoBackend) appendPadding(rawBytes, payload []byte, src *
311
318
312
319
// sign calculates and sets the cryptographic signature for the message,
313
320
// also setting the sign flag.
314
- func (crypto defaultCryptoBackend ) sign (rawBytes rawMessage , key * ecdsa.PrivateKey ) (rawMessage , error ) {
321
+ func (crypto * defaultCryptoBackend ) sign (rawBytes rawMessage , key * ecdsa.PrivateKey ) (rawMessage , error ) {
315
322
if isMessageSigned (rawBytes [0 ]) {
316
323
// this should not happen, but no reason to panic
317
324
log .Error ("failed to sign the message: already signed" )
0 commit comments