]> gitweb.factorcode.org Git - factor.git/commitdiff
implementing sha2 512
authorDoug Coleman <erg@jobim.local>
Sat, 9 May 2009 00:00:06 +0000 (19:00 -0500)
committerSascha Matzke <sascha.matzke@didolo.org>
Sun, 10 May 2009 21:21:44 +0000 (23:21 +0200)
basis/checksums/common/common.factor
basis/checksums/sha2/sha2-tests.factor
basis/checksums/sha2/sha2.factor

index 0ae4328446c1d1e4aa8295c7165f70845277f75b..01cc2cb739a4944859be396400758fca0c2fe702 100644 (file)
@@ -9,6 +9,9 @@ SYMBOL: bytes-read
 : calculate-pad-length ( length -- length' )
     [ 56 < 55 119 ? ] keep - ;
 
+: calculate-pad-length-long ( length -- length' )
+    [ 112 < 111 249 ? ] keep - ;
+
 : pad-last-block ( str big-endian? length -- str )
     [
         [ % ] 2dip HEX: 80 ,
index 1476f04e75fa1558c52a494e79a9940c1f6a6950..f224d497a67f88bb2ea3e9a8e446fa589745677f 100644 (file)
@@ -34,3 +34,9 @@ IN: checksums.sha2.tests
     "12345678901234567890123456789012345678901234567890123456789012345678901234567890"
     sha-256 test-checksum
 ] unit-test
+
+
+
+
+[ "8e959b75dae313da8cf4f72814fc143f8f7779c6eb9f7fa17299aeadb6889018501d289e4900f7e4331b99dec4b5433ac7d329eeb6dd26545e96e55b874be909" ]
+[ "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu" sha-512 test-checksum ] unit-test
index 6a695b096543ccac13c2eb839683e610bfdae2f4..1abed088a3b0ab6f521f66ad52e2666940996100 100644 (file)
@@ -6,9 +6,31 @@ sbufs strings combinators.smart math.ranges fry combinators
 accessors locals ;
 IN: checksums.sha2
 
-<PRIVATE
+SINGLETON: sha-224
+SINGLETON: sha-256
+SINGLETON: sha-384
+SINGLETON: sha-512
+
+INSTANCE: sha-224 checksum
+INSTANCE: sha-256 checksum
+INSTANCE: sha-384 checksum
+INSTANCE: sha-512 checksum
+
+TUPLE: sha2-state K H word-size block-size ;
+
+TUPLE: sha2-short < sha2-state ;
 
-SYMBOL: sha2
+TUPLE: sha2-long < sha2-state ;
+
+TUPLE: sha-224-state < sha2-short ;
+
+TUPLE: sha-256-state < sha2-short ;
+
+TUPLE: sha-384-state < sha2-long ;
+
+TUPLE: sha-512-state < sha2-long ;
+
+<PRIVATE
 
 CONSTANT: a 0
 CONSTANT: b 1
@@ -77,6 +99,10 @@ CONSTANT: K-256
 
 CONSTANT: K-384
     {
+
+        HEX: 428a2f98d728ae22 HEX: 7137449123ef65cd HEX: b5c0fbcfec4d3b2f HEX: e9b5dba58189dbbc 
+        HEX: 3956c25bf348b538 HEX: 59f111f1b605d019 HEX: 923f82a4af194f9b HEX: ab1c5ed5da6d8118 
+        HEX: d807aa98a3030242 HEX: 12835b0145706fbe HEX: 243185be4ee4b28c HEX: 550c7dc3d5ffb4e2
         HEX: 72be5d74f27b896f HEX: 80deb1fe3b1696b1 HEX: 9bdc06a725c71235 HEX: c19bf174cf692694 
         HEX: e49b69c19ef14ad2 HEX: efbe4786384f25e3 HEX: 0fc19dc68b8cd5b5 HEX: 240ca1cc77ac9c65 
         HEX: 2de92c6f592b0275 HEX: 4a7484aa6ea6e483 HEX: 5cb0a9dcbd41fbd4 HEX: 76f988da831153b5 
@@ -144,14 +170,25 @@ ALIAS: K-512 K-384
 : slice3 ( n seq -- a b c )
     [ dup 3 + ] dip <slice> first3 ; inline
 
-: pad-initial-bytes ( string -- padded-string )
+GENERIC: pad-initial-bytes ( string sha2 -- padded-string )
+
+M: sha2-short pad-initial-bytes ( string sha2 -- padded-string )
+    drop
     dup [
         HEX: 80 ,
         length
-        [ HEX: 3f bitand calculate-pad-length 0 <string> % ]
+        [ 64 mod calculate-pad-length 0 <string> % ]
         [ 3 shift 8 >be % ] bi
     ] "" make append ;
 
+M: sha2-long pad-initial-bytes ( string sha2 -- padded-string )
+    drop dup [
+        HEX: 80 ,
+        length
+        [ 128 mod calculate-pad-length-long 0 <string> % ]
+        [ 3 shift 16 >be % ] bi
+    ] "" make append ;
+
 : seq>byte-array ( seq n -- string )
     '[ _ >be ] map B{ } join ;
 
@@ -179,7 +216,7 @@ ALIAS: K-512 K-384
 : prepare-message-schedule ( seq sha2 -- w-seq )
     [ word-size>> <sliced-groups> [ be> ] map ]
     [
-        block-size>> 0 pad-tail 16 64 [a,b) over
+        block-size>> [ 0 pad-tail 16 ] keep [a,b) over
         '[ _ process-M-256 ] each
     ] bi ; inline
 
@@ -199,25 +236,9 @@ ALIAS: K-512 K-384
     ] each ;
 
 : byte-array>sha2 ( bytes state -- )
-    [ [ pad-initial-bytes ] [ block-size>> ] bi* <sliced-groups> ]
+    [ [ pad-initial-bytes ] [ nip block-size>> ] 2bi <sliced-groups> ]
     [ sha2-steps ] bi ;
 
-PRIVATE>
-
-SINGLETON: sha-224
-SINGLETON: sha-256
-SINGLETON: sha-384
-SINGLETON: sha-512
-
-INSTANCE: sha-224 checksum
-INSTANCE: sha-256 checksum
-INSTANCE: sha-384 checksum
-INSTANCE: sha-512 checksum
-
-TUPLE: sha2-state K H word-size block-size ;
-
-TUPLE: sha-224-state < sha2-state ;
-
 : <sha-224-state> ( -- sha2-state )
     sha-224-state new
         K-256 >>K
@@ -225,8 +246,6 @@ TUPLE: sha-224-state < sha2-state ;
         4 >>word-size
         64 >>block-size ;
 
-TUPLE: sha-256-state < sha2-state ;
-
 : <sha-256-state> ( -- sha2-state )
     sha-256-state new
         K-256 >>K
@@ -234,6 +253,22 @@ TUPLE: sha-256-state < sha2-state ;
         4 >>word-size
         64 >>block-size ;
 
+: <sha-384-state> ( -- sha2-state )
+    sha-384-state new
+        K-384 >>K
+        initial-H-384 >>H
+        8 >>word-size
+        80 >>block-size ;
+
+: <sha-512-state> ( -- sha2-state )
+    sha-512-state new
+        K-512 >>K
+        initial-H-512 >>H
+        8 >>word-size
+        80 >>block-size ;
+
+PRIVATE>
+
 M: sha-224 checksum-bytes
     drop <sha-224-state>
     [ byte-array>sha2 ]
@@ -243,3 +278,13 @@ M: sha-256 checksum-bytes
     drop <sha-256-state>
     [ byte-array>sha2 ]
     [ H>> 4 seq>byte-array ] bi ;
+
+M: sha-384 checksum-bytes
+    drop <sha-384-state>
+    [ byte-array>sha2 ]
+    [ H>> 6 head 8 seq>byte-array ] bi ;
+
+M: sha-512 checksum-bytes
+    drop <sha-512-state>
+    [ byte-array>sha2 ]
+    [ H>> 8 seq>byte-array ] bi ;