]>
git.ipfire.org Git - thirdparty/openssl.git/blob - crypto/sm3/sm3.c
2 * Copyright 2017 The OpenSSL Project Authors. All Rights Reserved.
3 * Copyright 2017 Ribose Inc. All Rights Reserved.
4 * Ported from Ribose contributions from Botan.
6 * Licensed under the OpenSSL license (the "License"). You may not use
7 * this file except in compliance with the License. You can obtain a copy
8 * in the file LICENSE in the source distribution or at
9 * https://www.openssl.org/source/license.html
14 #ifndef OPENSSL_NO_SM3
17 #include <openssl/opensslv.h>
19 int SM3_Init(SM3_CTX
*c
)
21 memset(c
, 0, sizeof(*c
));
33 unsigned char *SM3(const unsigned char *d
, size_t n
, unsigned char *md
)
36 static unsigned char m
[SM3_DIGEST_LENGTH
];
44 OPENSSL_cleanse(&c
, sizeof(c
)); /* security consideration */
48 void sm3_block_data_order(SM3_CTX
*ctx
, const void *p
, size_t num
)
50 const unsigned char *data
= p
;
51 register unsigned MD32_REG_T A
, B
, C
, D
, E
, F
, G
, H
;
53 unsigned MD32_REG_T W00
, W01
, W02
, W03
, W04
, W05
, W06
, W07
,
54 W08
, W09
, W10
, W11
, W12
, W13
, W14
, W15
;
68 * We have to load all message bytes immediately since SM3 reads
69 * them slightly out of order.
71 (void)HOST_c2l(data
, W00
);
72 (void)HOST_c2l(data
, W01
);
73 (void)HOST_c2l(data
, W02
);
74 (void)HOST_c2l(data
, W03
);
75 (void)HOST_c2l(data
, W04
);
76 (void)HOST_c2l(data
, W05
);
77 (void)HOST_c2l(data
, W06
);
78 (void)HOST_c2l(data
, W07
);
79 (void)HOST_c2l(data
, W08
);
80 (void)HOST_c2l(data
, W09
);
81 (void)HOST_c2l(data
, W10
);
82 (void)HOST_c2l(data
, W11
);
83 (void)HOST_c2l(data
, W12
);
84 (void)HOST_c2l(data
, W13
);
85 (void)HOST_c2l(data
, W14
);
86 (void)HOST_c2l(data
, W15
);
88 R1(A
, B
, C
, D
, E
, F
, G
, H
, 0x79CC4519, W00
, W00
^ W04
);
89 W00
= EXPAND(W00
, W07
, W13
, W03
, W10
);
90 R1(D
, A
, B
, C
, H
, E
, F
, G
, 0xF3988A32, W01
, W01
^ W05
);
91 W01
= EXPAND(W01
, W08
, W14
, W04
, W11
);
92 R1(C
, D
, A
, B
, G
, H
, E
, F
, 0xE7311465, W02
, W02
^ W06
);
93 W02
= EXPAND(W02
, W09
, W15
, W05
, W12
);
94 R1(B
, C
, D
, A
, F
, G
, H
, E
, 0xCE6228CB, W03
, W03
^ W07
);
95 W03
= EXPAND(W03
, W10
, W00
, W06
, W13
);
96 R1(A
, B
, C
, D
, E
, F
, G
, H
, 0x9CC45197, W04
, W04
^ W08
);
97 W04
= EXPAND(W04
, W11
, W01
, W07
, W14
);
98 R1(D
, A
, B
, C
, H
, E
, F
, G
, 0x3988A32F, W05
, W05
^ W09
);
99 W05
= EXPAND(W05
, W12
, W02
, W08
, W15
);
100 R1(C
, D
, A
, B
, G
, H
, E
, F
, 0x7311465E, W06
, W06
^ W10
);
101 W06
= EXPAND(W06
, W13
, W03
, W09
, W00
);
102 R1(B
, C
, D
, A
, F
, G
, H
, E
, 0xE6228CBC, W07
, W07
^ W11
);
103 W07
= EXPAND(W07
, W14
, W04
, W10
, W01
);
104 R1(A
, B
, C
, D
, E
, F
, G
, H
, 0xCC451979, W08
, W08
^ W12
);
105 W08
= EXPAND(W08
, W15
, W05
, W11
, W02
);
106 R1(D
, A
, B
, C
, H
, E
, F
, G
, 0x988A32F3, W09
, W09
^ W13
);
107 W09
= EXPAND(W09
, W00
, W06
, W12
, W03
);
108 R1(C
, D
, A
, B
, G
, H
, E
, F
, 0x311465E7, W10
, W10
^ W14
);
109 W10
= EXPAND(W10
, W01
, W07
, W13
, W04
);
110 R1(B
, C
, D
, A
, F
, G
, H
, E
, 0x6228CBCE, W11
, W11
^ W15
);
111 W11
= EXPAND(W11
, W02
, W08
, W14
, W05
);
112 R1(A
, B
, C
, D
, E
, F
, G
, H
, 0xC451979C, W12
, W12
^ W00
);
113 W12
= EXPAND(W12
, W03
, W09
, W15
, W06
);
114 R1(D
, A
, B
, C
, H
, E
, F
, G
, 0x88A32F39, W13
, W13
^ W01
);
115 W13
= EXPAND(W13
, W04
, W10
, W00
, W07
);
116 R1(C
, D
, A
, B
, G
, H
, E
, F
, 0x11465E73, W14
, W14
^ W02
);
117 W14
= EXPAND(W14
, W05
, W11
, W01
, W08
);
118 R1(B
, C
, D
, A
, F
, G
, H
, E
, 0x228CBCE6, W15
, W15
^ W03
);
119 W15
= EXPAND(W15
, W06
, W12
, W02
, W09
);
120 R2(A
, B
, C
, D
, E
, F
, G
, H
, 0x9D8A7A87, W00
, W00
^ W04
);
121 W00
= EXPAND(W00
, W07
, W13
, W03
, W10
);
122 R2(D
, A
, B
, C
, H
, E
, F
, G
, 0x3B14F50F, W01
, W01
^ W05
);
123 W01
= EXPAND(W01
, W08
, W14
, W04
, W11
);
124 R2(C
, D
, A
, B
, G
, H
, E
, F
, 0x7629EA1E, W02
, W02
^ W06
);
125 W02
= EXPAND(W02
, W09
, W15
, W05
, W12
);
126 R2(B
, C
, D
, A
, F
, G
, H
, E
, 0xEC53D43C, W03
, W03
^ W07
);
127 W03
= EXPAND(W03
, W10
, W00
, W06
, W13
);
128 R2(A
, B
, C
, D
, E
, F
, G
, H
, 0xD8A7A879, W04
, W04
^ W08
);
129 W04
= EXPAND(W04
, W11
, W01
, W07
, W14
);
130 R2(D
, A
, B
, C
, H
, E
, F
, G
, 0xB14F50F3, W05
, W05
^ W09
);
131 W05
= EXPAND(W05
, W12
, W02
, W08
, W15
);
132 R2(C
, D
, A
, B
, G
, H
, E
, F
, 0x629EA1E7, W06
, W06
^ W10
);
133 W06
= EXPAND(W06
, W13
, W03
, W09
, W00
);
134 R2(B
, C
, D
, A
, F
, G
, H
, E
, 0xC53D43CE, W07
, W07
^ W11
);
135 W07
= EXPAND(W07
, W14
, W04
, W10
, W01
);
136 R2(A
, B
, C
, D
, E
, F
, G
, H
, 0x8A7A879D, W08
, W08
^ W12
);
137 W08
= EXPAND(W08
, W15
, W05
, W11
, W02
);
138 R2(D
, A
, B
, C
, H
, E
, F
, G
, 0x14F50F3B, W09
, W09
^ W13
);
139 W09
= EXPAND(W09
, W00
, W06
, W12
, W03
);
140 R2(C
, D
, A
, B
, G
, H
, E
, F
, 0x29EA1E76, W10
, W10
^ W14
);
141 W10
= EXPAND(W10
, W01
, W07
, W13
, W04
);
142 R2(B
, C
, D
, A
, F
, G
, H
, E
, 0x53D43CEC, W11
, W11
^ W15
);
143 W11
= EXPAND(W11
, W02
, W08
, W14
, W05
);
144 R2(A
, B
, C
, D
, E
, F
, G
, H
, 0xA7A879D8, W12
, W12
^ W00
);
145 W12
= EXPAND(W12
, W03
, W09
, W15
, W06
);
146 R2(D
, A
, B
, C
, H
, E
, F
, G
, 0x4F50F3B1, W13
, W13
^ W01
);
147 W13
= EXPAND(W13
, W04
, W10
, W00
, W07
);
148 R2(C
, D
, A
, B
, G
, H
, E
, F
, 0x9EA1E762, W14
, W14
^ W02
);
149 W14
= EXPAND(W14
, W05
, W11
, W01
, W08
);
150 R2(B
, C
, D
, A
, F
, G
, H
, E
, 0x3D43CEC5, W15
, W15
^ W03
);
151 W15
= EXPAND(W15
, W06
, W12
, W02
, W09
);
152 R2(A
, B
, C
, D
, E
, F
, G
, H
, 0x7A879D8A, W00
, W00
^ W04
);
153 W00
= EXPAND(W00
, W07
, W13
, W03
, W10
);
154 R2(D
, A
, B
, C
, H
, E
, F
, G
, 0xF50F3B14, W01
, W01
^ W05
);
155 W01
= EXPAND(W01
, W08
, W14
, W04
, W11
);
156 R2(C
, D
, A
, B
, G
, H
, E
, F
, 0xEA1E7629, W02
, W02
^ W06
);
157 W02
= EXPAND(W02
, W09
, W15
, W05
, W12
);
158 R2(B
, C
, D
, A
, F
, G
, H
, E
, 0xD43CEC53, W03
, W03
^ W07
);
159 W03
= EXPAND(W03
, W10
, W00
, W06
, W13
);
160 R2(A
, B
, C
, D
, E
, F
, G
, H
, 0xA879D8A7, W04
, W04
^ W08
);
161 W04
= EXPAND(W04
, W11
, W01
, W07
, W14
);
162 R2(D
, A
, B
, C
, H
, E
, F
, G
, 0x50F3B14F, W05
, W05
^ W09
);
163 W05
= EXPAND(W05
, W12
, W02
, W08
, W15
);
164 R2(C
, D
, A
, B
, G
, H
, E
, F
, 0xA1E7629E, W06
, W06
^ W10
);
165 W06
= EXPAND(W06
, W13
, W03
, W09
, W00
);
166 R2(B
, C
, D
, A
, F
, G
, H
, E
, 0x43CEC53D, W07
, W07
^ W11
);
167 W07
= EXPAND(W07
, W14
, W04
, W10
, W01
);
168 R2(A
, B
, C
, D
, E
, F
, G
, H
, 0x879D8A7A, W08
, W08
^ W12
);
169 W08
= EXPAND(W08
, W15
, W05
, W11
, W02
);
170 R2(D
, A
, B
, C
, H
, E
, F
, G
, 0x0F3B14F5, W09
, W09
^ W13
);
171 W09
= EXPAND(W09
, W00
, W06
, W12
, W03
);
172 R2(C
, D
, A
, B
, G
, H
, E
, F
, 0x1E7629EA, W10
, W10
^ W14
);
173 W10
= EXPAND(W10
, W01
, W07
, W13
, W04
);
174 R2(B
, C
, D
, A
, F
, G
, H
, E
, 0x3CEC53D4, W11
, W11
^ W15
);
175 W11
= EXPAND(W11
, W02
, W08
, W14
, W05
);
176 R2(A
, B
, C
, D
, E
, F
, G
, H
, 0x79D8A7A8, W12
, W12
^ W00
);
177 W12
= EXPAND(W12
, W03
, W09
, W15
, W06
);
178 R2(D
, A
, B
, C
, H
, E
, F
, G
, 0xF3B14F50, W13
, W13
^ W01
);
179 W13
= EXPAND(W13
, W04
, W10
, W00
, W07
);
180 R2(C
, D
, A
, B
, G
, H
, E
, F
, 0xE7629EA1, W14
, W14
^ W02
);
181 W14
= EXPAND(W14
, W05
, W11
, W01
, W08
);
182 R2(B
, C
, D
, A
, F
, G
, H
, E
, 0xCEC53D43, W15
, W15
^ W03
);
183 W15
= EXPAND(W15
, W06
, W12
, W02
, W09
);
184 R2(A
, B
, C
, D
, E
, F
, G
, H
, 0x9D8A7A87, W00
, W00
^ W04
);
185 W00
= EXPAND(W00
, W07
, W13
, W03
, W10
);
186 R2(D
, A
, B
, C
, H
, E
, F
, G
, 0x3B14F50F, W01
, W01
^ W05
);
187 W01
= EXPAND(W01
, W08
, W14
, W04
, W11
);
188 R2(C
, D
, A
, B
, G
, H
, E
, F
, 0x7629EA1E, W02
, W02
^ W06
);
189 W02
= EXPAND(W02
, W09
, W15
, W05
, W12
);
190 R2(B
, C
, D
, A
, F
, G
, H
, E
, 0xEC53D43C, W03
, W03
^ W07
);
191 W03
= EXPAND(W03
, W10
, W00
, W06
, W13
);
192 R2(A
, B
, C
, D
, E
, F
, G
, H
, 0xD8A7A879, W04
, W04
^ W08
);
193 R2(D
, A
, B
, C
, H
, E
, F
, G
, 0xB14F50F3, W05
, W05
^ W09
);
194 R2(C
, D
, A
, B
, G
, H
, E
, F
, 0x629EA1E7, W06
, W06
^ W10
);
195 R2(B
, C
, D
, A
, F
, G
, H
, E
, 0xC53D43CE, W07
, W07
^ W11
);
196 R2(A
, B
, C
, D
, E
, F
, G
, H
, 0x8A7A879D, W08
, W08
^ W12
);
197 R2(D
, A
, B
, C
, H
, E
, F
, G
, 0x14F50F3B, W09
, W09
^ W13
);
198 R2(C
, D
, A
, B
, G
, H
, E
, F
, 0x29EA1E76, W10
, W10
^ W14
);
199 R2(B
, C
, D
, A
, F
, G
, H
, E
, 0x53D43CEC, W11
, W11
^ W15
);
200 R2(A
, B
, C
, D
, E
, F
, G
, H
, 0xA7A879D8, W12
, W12
^ W00
);
201 R2(D
, A
, B
, C
, H
, E
, F
, G
, 0x4F50F3B1, W13
, W13
^ W01
);
202 R2(C
, D
, A
, B
, G
, H
, E
, F
, 0x9EA1E762, W14
, W14
^ W02
);
203 R2(B
, C
, D
, A
, F
, G
, H
, E
, 0x3D43CEC5, W15
, W15
^ W03
);