@@ -257,7 +257,7 @@ pub fn test_af_alg_cipher() {
257
257
pub fn test_af_alg_aead ( ) {
258
258
use libc;
259
259
use nix:: sys:: uio:: IoVec ;
260
- use nix:: unistd:: read;
260
+ use nix:: unistd:: { read, close } ;
261
261
use nix:: sys:: socket:: { socket, sendmsg, bind, accept, setsockopt,
262
262
AddressFamily , SockType , SockFlag , SockAddr ,
263
263
ControlMessage , MsgFlags } ;
@@ -275,20 +275,26 @@ pub fn test_af_alg_aead() {
275
275
let iv = vec ! [ 1u8 ; iv_len] ;
276
276
// 256-bytes plain payload
277
277
let payload_len = 256 ;
278
- let mut payload = vec ! [ 2u8 ; payload_len + ( assoc_size as usize ) ] ;
278
+ let mut payload = vec ! [ 2u8 ; payload_len + ( assoc_size as usize ) + auth_size ] ;
279
279
280
280
for i in 0 ..assoc_size {
281
281
payload[ i as usize ] = 10 ;
282
282
}
283
283
284
+ let len = payload. len ( ) ;
285
+
286
+ for i in 0 ..auth_size {
287
+ payload[ len - 1 - i] = 0 ;
288
+ }
289
+
284
290
let sock = socket ( AddressFamily :: Alg , SockType :: SeqPacket , SockFlag :: empty ( ) , None )
285
291
. expect ( "socket failed" ) ;
286
292
287
293
let sockaddr = SockAddr :: new_alg ( alg_type, alg_name) ;
288
294
bind ( sock, & sockaddr) . expect ( "bind failed" ) ;
289
295
290
- setsockopt ( sock, AlgSetKey :: default ( ) , & key) . expect ( "setsockopt AlgSetKey" ) ;
291
296
setsockopt ( sock, AlgSetAeadAuthSize , & auth_size) . expect ( "setsockopt AlgSetAeadAuthSize" ) ;
297
+ setsockopt ( sock, AlgSetKey :: default ( ) , & key) . expect ( "setsockopt AlgSetKey" ) ;
292
298
let session_socket = accept ( sock) . expect ( "accept failed" ) ;
293
299
294
300
let msgs = [
@@ -302,11 +308,18 @@ pub fn test_af_alg_aead() {
302
308
let mut encrypted = vec ! [ 0u8 ; ( assoc_size as usize ) + payload_len + auth_size] ;
303
309
let num_bytes = read ( session_socket, & mut encrypted) . expect ( "read encrypt" ) ;
304
310
assert_eq ! ( num_bytes, payload_len + auth_size + ( assoc_size as usize ) ) ;
311
+ close ( session_socket) . expect ( "close" ) ;
312
+
313
+ for i in 0 ..assoc_size {
314
+ encrypted[ i as usize ] = 10 ;
315
+ }
305
316
306
317
let iov = IoVec :: from_slice ( & encrypted) ;
307
318
308
319
let iv = vec ! [ 1u8 ; iv_len] ;
309
320
321
+ let session_socket = accept ( sock) . expect ( "accept failed" ) ;
322
+
310
323
let msgs = [
311
324
ControlMessage :: AlgSetOp ( & libc:: ALG_OP_DECRYPT ) ,
312
325
ControlMessage :: AlgSetIv ( iv. as_slice ( ) ) ,
@@ -315,11 +328,11 @@ pub fn test_af_alg_aead() {
315
328
sendmsg ( session_socket, & [ iov] , & msgs, MsgFlags :: empty ( ) , None ) . expect ( "sendmsg decrypt" ) ;
316
329
317
330
// allocate buffer for decrypted data
318
- let mut decrypted = vec ! [ 0u8 ; payload_len + ( assoc_size as usize ) ] ;
331
+ let mut decrypted = vec ! [ 0u8 ; payload_len + ( assoc_size as usize ) + auth_size ] ;
319
332
let num_bytes = read ( session_socket, & mut decrypted) . expect ( "read decrypt" ) ;
320
333
321
- assert_eq ! ( num_bytes, payload_len + ( assoc_size as usize ) ) ;
322
- assert_eq ! ( decrypted, payload) ;
334
+ assert ! ( num_bytes >= payload_len + ( assoc_size as usize ) ) ;
335
+ assert_eq ! ( decrypted[ ( assoc_size as usize ) .. ( payload_len + ( assoc_size as usize ) ) ] , payload[ ( assoc_size as usize ) ..payload_len + ( assoc_size as usize ) ] ) ;
323
336
}
324
337
325
338
/// Tests that passing multiple fds using a single `ControlMessage` works.
0 commit comments