]> gitweb.factorcode.org Git - factor.git/blob - extra/crypto/sha2/sha2.factor
Initial import
[factor.git] / extra / crypto / sha2 / sha2.factor
1 USING: crypto.common kernel splitting math sequences namespaces
2 io.binary ;
3 IN: crypto.sha2
4
5 <PRIVATE
6
7 SYMBOL: vars
8 SYMBOL: M
9 SYMBOL: K
10 SYMBOL: H
11 SYMBOL: S0
12 SYMBOL: S1
13 SYMBOL: process-M
14 SYMBOL: word-size
15 SYMBOL: block-size
16 SYMBOL: >word
17
18 : a 0 ;
19 : b 1 ;
20 : c 2 ;
21 : d 3 ;
22 : e 4 ;
23 : f 5 ;
24 : g 6 ;
25 : h 7 ;
26
27 : initial-H-256 ( -- seq )
28     {
29         HEX: 6a09e667 HEX: bb67ae85 HEX: 3c6ef372 HEX: a54ff53a
30         HEX: 510e527f HEX: 9b05688c HEX: 1f83d9ab HEX: 5be0cd19
31     } ;
32
33 : K-256 ( -- seq )
34     {
35         HEX: 428a2f98 HEX: 71374491 HEX: b5c0fbcf HEX: e9b5dba5
36         HEX: 3956c25b HEX: 59f111f1 HEX: 923f82a4 HEX: ab1c5ed5
37         HEX: d807aa98 HEX: 12835b01 HEX: 243185be HEX: 550c7dc3
38         HEX: 72be5d74 HEX: 80deb1fe HEX: 9bdc06a7 HEX: c19bf174
39         HEX: e49b69c1 HEX: efbe4786 HEX: 0fc19dc6 HEX: 240ca1cc
40         HEX: 2de92c6f HEX: 4a7484aa HEX: 5cb0a9dc HEX: 76f988da
41         HEX: 983e5152 HEX: a831c66d HEX: b00327c8 HEX: bf597fc7
42         HEX: c6e00bf3 HEX: d5a79147 HEX: 06ca6351 HEX: 14292967
43         HEX: 27b70a85 HEX: 2e1b2138 HEX: 4d2c6dfc HEX: 53380d13
44         HEX: 650a7354 HEX: 766a0abb HEX: 81c2c92e HEX: 92722c85
45         HEX: a2bfe8a1 HEX: a81a664b HEX: c24b8b70 HEX: c76c51a3
46         HEX: d192e819 HEX: d6990624 HEX: f40e3585 HEX: 106aa070
47         HEX: 19a4c116 HEX: 1e376c08 HEX: 2748774c HEX: 34b0bcb5
48         HEX: 391c0cb3 HEX: 4ed8aa4a HEX: 5b9cca4f HEX: 682e6ff3
49         HEX: 748f82ee HEX: 78a5636f HEX: 84c87814 HEX: 8cc70208
50         HEX: 90befffa HEX: a4506ceb HEX: bef9a3f7 HEX: c67178f2
51     } ;
52
53 : s0-256 ( x -- x' )
54     [ -7 bitroll-32 ] keep
55     [ -18 bitroll-32 ] keep
56     -3 shift bitxor bitxor ; inline
57
58 : s1-256 ( x -- x' )
59     [ -17 bitroll-32 ] keep
60     [ -19 bitroll-32 ] keep
61     -10 shift bitxor bitxor ; inline
62
63 : process-M-256 ( seq n -- )
64     [ 16 - swap nth ] 2keep
65     [ 15 - swap nth s0-256 ] 2keep
66     [ 7 - swap nth ] 2keep
67     [ 2 - swap nth s1-256 ] 2keep
68     >r >r + + w+ r> r> swap set-nth ; inline
69
70 : prepare-message-schedule ( seq -- w-seq )
71     word-size get group [ be> ] map block-size get 0 pad-right
72     dup 16 64 dup <slice> [
73         process-M-256
74     ] curry* each ;
75
76 : ch ( x y z -- x' )
77     [ bitxor bitand ] keep bitxor ;
78
79 : maj ( x y z -- x' )
80     >r [ bitand ] 2keep bitor r> bitand bitor ;
81
82 : S0-256 ( x -- x' )
83     [ -2 bitroll-32 ] keep
84     [ -13 bitroll-32 ] keep
85     -22 bitroll-32 bitxor bitxor ; inline
86
87 : S1-256 ( x -- x' )
88     [ -6 bitroll-32 ] keep
89     [ -11 bitroll-32 ] keep
90     -25 bitroll-32 bitxor bitxor ; inline
91
92 : T1 ( W n -- T1 )
93     [ swap nth ] keep
94     K get nth +
95     e vars get slice3 ch +
96     e vars get nth S1-256 +
97     h vars get nth w+ ;
98
99 : T2 ( -- T2 )
100     a vars get nth S0-256
101     a vars get slice3 maj w+ ;
102
103 : update-vars ( T1 T2 -- )
104     vars get
105     h g pick exchange
106     g f pick exchange
107     f e pick exchange
108     pick d pick nth w+ e pick set-nth
109     d c pick exchange
110     c b pick exchange
111     b a pick exchange
112     >r w+ a r> set-nth ;
113
114 : process-chunk ( M -- )
115     H get clone vars set
116     prepare-message-schedule block-size get [
117         T1 T2 update-vars
118     ] curry* each vars get H get [ w+ ] 2map H set ;
119
120 : seq>string ( n seq -- string )
121     [ swap [ >be % ] curry each ] "" make ;
122
123 : string>sha2 ( string -- string )
124     t preprocess-plaintext
125     block-size get group [ process-chunk ] each
126     4 H get seq>string ;
127
128 PRIVATE>
129
130 : string>sha-256 ( string -- string )
131     [
132         K-256 K set
133         initial-H-256 H set
134         4 word-size set
135         64 block-size set
136         \ >32-bit >word set
137         string>sha2
138     ] with-scope ;
139
140 : string>sha-256-string ( string -- hexstring )
141     string>sha-256 hex-string ;
142