@@ -3,6 +3,7 @@ const math = @import("../math/index.zig");
3
3
const endian = @import ("../endian.zig" );
4
4
const debug = @import ("../debug/index.zig" );
5
5
const builtin = @import ("builtin" );
6
+ const htest = @import ("test.zig" );
6
7
7
8
/////////////////////
8
9
// Sha224 + Sha256
@@ -57,7 +58,6 @@ pub const Sha256 = Sha2_32(Sha256Params);
57
58
58
59
fn Sha2_32 (comptime params : Sha2Params32 ) - > type { return struct {
59
60
const Self = this ;
60
- const ReturnType = @IntType (false , params .out_len );
61
61
62
62
s : [8 ]u32 ,
63
63
// Streaming Cache
@@ -84,10 +84,10 @@ fn Sha2_32(comptime params: Sha2Params32) -> type { return struct {
84
84
d .total_len = 0 ;
85
85
}
86
86
87
- pub fn hash (b : []const u8 ) - > ReturnType {
87
+ pub fn hash (b : []const u8 , out : [] u8 ) {
88
88
var d = Self .init ();
89
89
d .update (b );
90
- return d .final ();
90
+ d .final (out );
91
91
}
92
92
93
93
pub fn update (d : & Self , b : []const u8 ) {
@@ -114,7 +114,9 @@ fn Sha2_32(comptime params: Sha2Params32) -> type { return struct {
114
114
d .total_len += b .len ;
115
115
}
116
116
117
- pub fn final (d : & Self ) - > ReturnType {
117
+ pub fn final (d : & Self , out : []u8 ) {
118
+ debug .assert (out .len >= params .out_len / 8 );
119
+
118
120
// The buffer here will never be completely full.
119
121
mem .set (u8 , d .buf [d .buf_len .. ], 0 );
120
122
@@ -142,14 +144,9 @@ fn Sha2_32(comptime params: Sha2Params32) -> type { return struct {
142
144
// May truncate for possible 224 output
143
145
const rr = d .s [0 .. params .out_len / 32 ];
144
146
145
- var j : u8 = u8 (rr .len - 1 ) * 32 ;
146
- var r : ReturnType = 0 ;
147
- for (rr ) | p | {
148
- r |= ReturnType (p ) << j ;
149
- j -%= 32 ;
147
+ for (rr ) | s , j | {
148
+ mem .writeInt (out [4 * j .. 4 * j + 4 ], s , builtin .Endian .Big );
150
149
}
151
-
152
- return endian .swapIfBe (ReturnType , r );
153
150
}
154
151
155
152
fn round (d : & Self , b : []const u8 ) {
@@ -270,47 +267,55 @@ fn Sha2_32(comptime params: Sha2Params32) -> type { return struct {
270
267
};}
271
268
272
269
test "sha224 single" {
273
- debug . assert ( 0xd14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f == Sha224 . hash ( "" ) );
274
- debug . assert ( 0x23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7 == Sha224 . hash ( "abc" ) );
275
- debug . assert ( 0xc97ca9a559850ce97a04a96def6d99a9e0e0e2ab14e6b8df265fc0b3 == Sha224 . hash ( "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu" ) );
270
+ htest . assertEqualHash ( Sha224 , "d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f" , "" );
271
+ htest . assertEqualHash ( Sha224 , "23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7" , "abc" );
272
+ htest . assertEqualHash ( Sha224 , "c97ca9a559850ce97a04a96def6d99a9e0e0e2ab14e6b8df265fc0b3" , "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu" );
276
273
}
277
274
278
275
test "sha224 streaming" {
279
276
var h = Sha224 .init ();
277
+ var out : [28 ]u8 = undefined ;
280
278
281
- debug .assert (0xd14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f == h .final ());
279
+ h .final (out [0.. ]);
280
+ htest .assertEqual ("d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f" , out [0.. ]);
282
281
283
282
h .reset ();
284
283
h .update ("abc" );
285
- debug .assert (0x23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7 == h .final ());
284
+ h .final (out [0.. ]);
285
+ htest .assertEqual ("23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7" , out [0.. ]);
286
286
287
287
h .reset ();
288
288
h .update ("a" );
289
289
h .update ("b" );
290
290
h .update ("c" );
291
- debug .assert (0x23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7 == h .final ());
291
+ h .final (out [0.. ]);
292
+ htest .assertEqual ("23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7" , out [0.. ]);
292
293
}
293
294
294
295
test "sha256 single" {
295
- debug . assert ( 0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 == Sha256 . hash ( "" ) );
296
- debug . assert ( 0xba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad == Sha256 . hash ( "abc" ) );
297
- debug . assert ( 0xcf5b16a778af8380036ce59e7b0492370b249b11e8f07a51afac45037afee9d1 == Sha256 . hash ( "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu" ) );
296
+ htest . assertEqualHash ( Sha256 , "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" , "" );
297
+ htest . assertEqualHash ( Sha256 , "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad" , "abc" );
298
+ htest . assertEqualHash ( Sha256 , "cf5b16a778af8380036ce59e7b0492370b249b11e8f07a51afac45037afee9d1" , "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu" );
298
299
}
299
300
300
301
test "sha256 streaming" {
301
302
var h = Sha256 .init ();
303
+ var out : [32 ]u8 = undefined ;
302
304
303
- debug .assert (0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 == h .final ());
305
+ h .final (out [0.. ]);
306
+ htest .assertEqual ("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" , out [0.. ]);
304
307
305
308
h .reset ();
306
309
h .update ("abc" );
307
- debug .assert (0xba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad == h .final ());
310
+ h .final (out [0.. ]);
311
+ htest .assertEqual ("ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad" , out [0.. ]);
308
312
309
313
h .reset ();
310
314
h .update ("a" );
311
315
h .update ("b" );
312
316
h .update ("c" );
313
- debug .assert (0xba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad == h .final ());
317
+ h .final (out [0.. ]);
318
+ htest .assertEqual ("ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad" , out [0.. ]);
314
319
}
315
320
316
321
@@ -367,7 +372,6 @@ pub const Sha512 = Sha2_64(Sha512Params);
367
372
368
373
fn Sha2_64 (comptime params : Sha2Params64 ) - > type { return struct {
369
374
const Self = this ;
370
- const ReturnType = @IntType (false , params .out_len );
371
375
const u9 = @IntType (false , 9 );
372
376
373
377
s : [8 ]u64 ,
@@ -395,10 +399,10 @@ fn Sha2_64(comptime params: Sha2Params64) -> type { return struct {
395
399
d .total_len = 0 ;
396
400
}
397
401
398
- pub fn hash (b : []const u8 ) - > ReturnType {
402
+ pub fn hash (b : []const u8 , out : [] u8 ) {
399
403
var d = Self .init ();
400
404
d .update (b );
401
- return d .final ();
405
+ d .final (out );
402
406
}
403
407
404
408
pub fn update (d : & Self , b : []const u8 ) {
@@ -425,7 +429,9 @@ fn Sha2_64(comptime params: Sha2Params64) -> type { return struct {
425
429
d .total_len += b .len ;
426
430
}
427
431
428
- pub fn final (d : & Self ) - > ReturnType {
432
+ pub fn final (d : & Self , out : []u8 ) {
433
+ debug .assert (out .len >= params .out_len / 8 );
434
+
429
435
// The buffer here will never be completely full.
430
436
mem .set (u8 , d .buf [d .buf_len .. ], 0 );
431
437
@@ -453,14 +459,9 @@ fn Sha2_64(comptime params: Sha2Params64) -> type { return struct {
453
459
// May truncate for possible 384 output
454
460
const rr = d .s [0 .. params .out_len / 64 ];
455
461
456
- var j : u9 = u9 (rr .len - 1 ) * 64 ;
457
- var r : ReturnType = 0 ;
458
- for (rr ) | p | {
459
- r |= ReturnType (p ) << j ;
460
- j -%= 64 ;
462
+ for (rr ) | s , j | {
463
+ mem .writeInt (out [8 * j .. 8 * j + 8 ], s , builtin .Endian .Big );
461
464
}
462
-
463
- return endian .swapIfBe (ReturnType , r );
464
465
}
465
466
466
467
fn round (d : & Self , b : []const u8 ) {
@@ -601,61 +602,69 @@ fn Sha2_64(comptime params: Sha2Params64) -> type { return struct {
601
602
};}
602
603
603
604
test "sha384 single" {
604
- const h1 = 0x38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b ;
605
- debug . assert ( h1 == Sha384 . hash ( "" ) );
605
+ const h1 = "38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b" ;
606
+ htest . assertEqualHash ( Sha384 , h1 , "" );
606
607
607
- const h2 = 0xcb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7 ;
608
- debug . assert ( h2 == Sha384 . hash ( "abc" ) );
608
+ const h2 = "cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7" ;
609
+ htest . assertEqualHash ( Sha384 , h2 , "abc" );
609
610
610
- const h3 = 0x09330c33f71147e83d192fc782cd1b4753111b173b3b05d22fa08086e3b0f712fcc7c71a557e2db966c3e9fa91746039 ;
611
- debug . assert ( h3 == Sha384 . hash ( "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu" ) );
611
+ const h3 = "09330c33f71147e83d192fc782cd1b4753111b173b3b05d22fa08086e3b0f712fcc7c71a557e2db966c3e9fa91746039" ;
612
+ htest . assertEqualHash ( Sha384 , h3 , "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu" );
612
613
}
613
614
614
615
test "sha384 streaming" {
615
616
var h = Sha384 .init ();
617
+ var out : [48 ]u8 = undefined ;
616
618
617
- const h1 = 0x38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b ;
618
- debug .assert (h1 == h .final ());
619
+ const h1 = "38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b" ;
620
+ h .final (out [0.. ]);
621
+ htest .assertEqual (h1 , out [0.. ]);
619
622
620
- const h2 = 0xcb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7 ;
623
+ const h2 = "cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7" ;
621
624
622
625
h .reset ();
623
626
h .update ("abc" );
624
- debug .assert (h2 == h .final ());
627
+ h .final (out [0.. ]);
628
+ htest .assertEqual (h2 , out [0.. ]);
625
629
626
630
h .reset ();
627
631
h .update ("a" );
628
632
h .update ("b" );
629
633
h .update ("c" );
630
- debug .assert (h2 == h .final ());
634
+ h .final (out [0.. ]);
635
+ htest .assertEqual (h2 , out [0.. ]);
631
636
}
632
637
633
638
test "sha512 single" {
634
- const h1 = 0xcf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e ;
635
- debug . assert ( h1 == Sha512 . hash ( "" ) );
639
+ const h1 = "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e" ;
640
+ htest . assertEqualHash ( Sha512 , h1 , "" );
636
641
637
- const h2 = 0xddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f ;
638
- debug . assert ( h2 == Sha512 . hash ( "abc" ) );
642
+ const h2 = "ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f" ;
643
+ htest . assertEqualHash ( Sha512 , h2 , "abc" );
639
644
640
- const h3 = 0x8e959b75dae313da8cf4f72814fc143f8f7779c6eb9f7fa17299aeadb6889018501d289e4900f7e4331b99dec4b5433ac7d329eeb6dd26545e96e55b874be909 ;
641
- debug . assert ( h3 == Sha512 . hash ( "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu" ) );
645
+ const h3 = "8e959b75dae313da8cf4f72814fc143f8f7779c6eb9f7fa17299aeadb6889018501d289e4900f7e4331b99dec4b5433ac7d329eeb6dd26545e96e55b874be909" ;
646
+ htest . assertEqualHash ( Sha512 , h3 , "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu" );
642
647
}
643
648
644
649
test "sha512 streaming" {
645
650
var h = Sha512 .init ();
651
+ var out : [64 ]u8 = undefined ;
646
652
647
- const h1 = 0xcf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e ;
648
- debug .assert (h1 == h .final ());
653
+ const h1 = "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e" ;
654
+ h .final (out [0.. ]);
655
+ htest .assertEqual (h1 , out [0.. ]);
649
656
650
- const h2 = 0xddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f ;
657
+ const h2 = "ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f" ;
651
658
652
659
h .reset ();
653
660
h .update ("abc" );
654
- debug .assert (h2 == h .final ());
661
+ h .final (out [0.. ]);
662
+ htest .assertEqual (h2 , out [0.. ]);
655
663
656
664
h .reset ();
657
665
h .update ("a" );
658
666
h .update ("b" );
659
667
h .update ("c" );
660
- debug .assert (h2 == h .final ());
668
+ h .final (out [0.. ]);
669
+ htest .assertEqual (h2 , out [0.. ]);
661
670
}
0 commit comments