mirror of
https://github.com/guanzhi/GmSSL.git
synced 2026-05-13 11:56:28 +08:00
Update sm3.c
This commit is contained in:
152
src/sm3.c
152
src/sm3.c
@@ -55,6 +55,7 @@ static uint32_t K[64] = {
|
||||
0xa7a879d8U, 0x4f50f3b1U, 0x9ea1e762U, 0x3d43cec5U,
|
||||
};
|
||||
|
||||
#if ENABLE_SMALL_FOOTPRINT
|
||||
void sm3_compress_blocks(uint32_t digest[8], const uint8_t *data, size_t blocks)
|
||||
{
|
||||
uint32_t A;
|
||||
@@ -131,6 +132,145 @@ void sm3_compress_blocks(uint32_t digest[8], const uint8_t *data, size_t blocks)
|
||||
data += 64;
|
||||
}
|
||||
}
|
||||
#else
|
||||
|
||||
#define SM3_ROUND_0(j,A,B,C,D,E,F,G,H) \
|
||||
SS1 = ROTL((ROTL(A, 12) + E + K[j]), 7); \
|
||||
SS2 = SS1 ^ ROTL(A, 12); \
|
||||
D += FF00(A, B, C) + SS2 + (W[j] ^ W[j + 4]); \
|
||||
SS1 += GG00(E, F, G) + H + W[j]; \
|
||||
B = ROTL(B, 9); \
|
||||
H = P0(SS1); \
|
||||
F = ROTL(F, 19); \
|
||||
W[j+16] = P1(W[j] ^ W[j+7] ^ ROTL(W[j+13], 15)) ^ ROTL(W[j+3], 7) ^ W[j+10];
|
||||
|
||||
#define SM3_ROUND_1(j,A,B,C,D,E,F,G,H) \
|
||||
SS1 = ROTL((ROTL(A, 12) + E + K[j]), 7); \
|
||||
SS2 = SS1 ^ ROTL(A, 12); \
|
||||
D += FF16(A, B, C) + SS2 + (W[j] ^ W[j + 4]); \
|
||||
SS1 += GG16(E, F, G) + H + W[j]; \
|
||||
B = ROTL(B, 9); \
|
||||
H = P0(SS1); \
|
||||
F = ROTL(F, 19); \
|
||||
W[j+16] = P1(W[j] ^ W[j+7] ^ ROTL(W[j+13], 15)) ^ ROTL(W[j+3], 7) ^ W[j+10];
|
||||
|
||||
|
||||
#define SM3_ROUND_2(j,A,B,C,D,E,F,G,H) \
|
||||
SS1 = ROTL((ROTL(A, 12) + E + K[j]), 7); \
|
||||
SS2 = SS1 ^ ROTL(A, 12); \
|
||||
D += FF16(A, B, C) + SS2 + (W[j] ^ W[j + 4]); \
|
||||
SS1 += GG16(E, F, G) + H + W[j]; \
|
||||
B = ROTL(B, 9); \
|
||||
H = P0(SS1); \
|
||||
F = ROTL(F, 19);
|
||||
|
||||
void sm3_compress_blocks(uint32_t digest[8], const uint8_t *data, size_t blocks)
|
||||
{
|
||||
uint32_t A;
|
||||
uint32_t B;
|
||||
uint32_t C;
|
||||
uint32_t D;
|
||||
uint32_t E;
|
||||
uint32_t F;
|
||||
uint32_t G;
|
||||
uint32_t H;
|
||||
uint32_t W[68];
|
||||
uint32_t SS1, SS2;
|
||||
int j;
|
||||
|
||||
while (blocks--) {
|
||||
|
||||
A = digest[0];
|
||||
B = digest[1];
|
||||
C = digest[2];
|
||||
D = digest[3];
|
||||
E = digest[4];
|
||||
F = digest[5];
|
||||
G = digest[6];
|
||||
H = digest[7];
|
||||
|
||||
for (j = 0; j < 16; j++) {
|
||||
W[j] = GETU32(data + j*4);
|
||||
}
|
||||
|
||||
SM3_ROUND_0( 0, A,B,C,D, E,F,G,H);
|
||||
SM3_ROUND_0( 1, D,A,B,C, H,E,F,G);
|
||||
SM3_ROUND_0( 2, C,D,A,B, G,H,E,F);
|
||||
SM3_ROUND_0( 3, B,C,D,A, F,G,H,E);
|
||||
SM3_ROUND_0( 4, A,B,C,D, E,F,G,H);
|
||||
SM3_ROUND_0( 5, D,A,B,C, H,E,F,G);
|
||||
SM3_ROUND_0( 6, C,D,A,B, G,H,E,F);
|
||||
SM3_ROUND_0( 7, B,C,D,A, F,G,H,E);
|
||||
SM3_ROUND_0( 8, A,B,C,D, E,F,G,H);
|
||||
SM3_ROUND_0( 9, D,A,B,C, H,E,F,G);
|
||||
SM3_ROUND_0(10, C,D,A,B, G,H,E,F);
|
||||
SM3_ROUND_0(11, B,C,D,A, F,G,H,E);
|
||||
SM3_ROUND_0(12, A,B,C,D, E,F,G,H);
|
||||
SM3_ROUND_0(13, D,A,B,C, H,E,F,G);
|
||||
SM3_ROUND_0(14, C,D,A,B, G,H,E,F);
|
||||
SM3_ROUND_0(15, B,C,D,A, F,G,H,E);
|
||||
SM3_ROUND_1(16, A,B,C,D, E,F,G,H);
|
||||
SM3_ROUND_1(17, D,A,B,C, H,E,F,G);
|
||||
SM3_ROUND_1(18, C,D,A,B, G,H,E,F);
|
||||
SM3_ROUND_1(19, B,C,D,A, F,G,H,E);
|
||||
SM3_ROUND_1(20, A,B,C,D, E,F,G,H);
|
||||
SM3_ROUND_1(21, D,A,B,C, H,E,F,G);
|
||||
SM3_ROUND_1(22, C,D,A,B, G,H,E,F);
|
||||
SM3_ROUND_1(23, B,C,D,A, F,G,H,E);
|
||||
SM3_ROUND_1(24, A,B,C,D, E,F,G,H);
|
||||
SM3_ROUND_1(25, D,A,B,C, H,E,F,G);
|
||||
SM3_ROUND_1(26, C,D,A,B, G,H,E,F);
|
||||
SM3_ROUND_1(27, B,C,D,A, F,G,H,E);
|
||||
SM3_ROUND_1(28, A,B,C,D, E,F,G,H);
|
||||
SM3_ROUND_1(29, D,A,B,C, H,E,F,G);
|
||||
SM3_ROUND_1(30, C,D,A,B, G,H,E,F);
|
||||
SM3_ROUND_1(31, B,C,D,A, F,G,H,E);
|
||||
SM3_ROUND_1(32, A,B,C,D, E,F,G,H);
|
||||
SM3_ROUND_1(33, D,A,B,C, H,E,F,G);
|
||||
SM3_ROUND_1(34, C,D,A,B, G,H,E,F);
|
||||
SM3_ROUND_1(35, B,C,D,A, F,G,H,E);
|
||||
SM3_ROUND_1(36, A,B,C,D, E,F,G,H);
|
||||
SM3_ROUND_1(37, D,A,B,C, H,E,F,G);
|
||||
SM3_ROUND_1(38, C,D,A,B, G,H,E,F);
|
||||
SM3_ROUND_1(39, B,C,D,A, F,G,H,E);
|
||||
SM3_ROUND_1(40, A,B,C,D, E,F,G,H);
|
||||
SM3_ROUND_1(41, D,A,B,C, H,E,F,G);
|
||||
SM3_ROUND_1(42, C,D,A,B, G,H,E,F);
|
||||
SM3_ROUND_1(43, B,C,D,A, F,G,H,E);
|
||||
SM3_ROUND_1(44, A,B,C,D, E,F,G,H);
|
||||
SM3_ROUND_1(45, D,A,B,C, H,E,F,G);
|
||||
SM3_ROUND_1(46, C,D,A,B, G,H,E,F);
|
||||
SM3_ROUND_1(47, B,C,D,A, F,G,H,E);
|
||||
SM3_ROUND_1(48, A,B,C,D, E,F,G,H);
|
||||
SM3_ROUND_1(49, D,A,B,C, H,E,F,G);
|
||||
SM3_ROUND_1(50, C,D,A,B, G,H,E,F);
|
||||
SM3_ROUND_1(51, B,C,D,A, F,G,H,E);
|
||||
SM3_ROUND_2(52, A,B,C,D, E,F,G,H);
|
||||
SM3_ROUND_2(53, D,A,B,C, H,E,F,G);
|
||||
SM3_ROUND_2(54, C,D,A,B, G,H,E,F);
|
||||
SM3_ROUND_2(55, B,C,D,A, F,G,H,E);
|
||||
SM3_ROUND_2(56, A,B,C,D, E,F,G,H);
|
||||
SM3_ROUND_2(57, D,A,B,C, H,E,F,G);
|
||||
SM3_ROUND_2(58, C,D,A,B, G,H,E,F);
|
||||
SM3_ROUND_2(59, B,C,D,A, F,G,H,E);
|
||||
SM3_ROUND_2(60, A,B,C,D, E,F,G,H);
|
||||
SM3_ROUND_2(61, D,A,B,C, H,E,F,G);
|
||||
SM3_ROUND_2(62, C,D,A,B, G,H,E,F);
|
||||
SM3_ROUND_2(63, B,C,D,A, F,G,H,E);
|
||||
|
||||
digest[0] ^= A;
|
||||
digest[1] ^= B;
|
||||
digest[2] ^= C;
|
||||
digest[3] ^= D;
|
||||
digest[4] ^= E;
|
||||
digest[5] ^= F;
|
||||
digest[6] ^= G;
|
||||
digest[7] ^= H;
|
||||
|
||||
data += 64;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void sm3_init(SM3_CTX *ctx)
|
||||
{
|
||||
@@ -202,15 +342,3 @@ void sm3_finish(SM3_CTX *ctx, uint8_t *digest)
|
||||
PUTU32(digest + i*4, ctx->digest[i]);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
void sm3_digest(const uint8_t *msg, size_t msglen,
|
||||
uint8_t dgst[SM3_DIGEST_SIZE])
|
||||
{
|
||||
SM3_CTX ctx;
|
||||
sm3_init(&ctx);
|
||||
sm3_update(&ctx, msg, msglen);
|
||||
sm3_finish(&ctx, dgst);
|
||||
memset(&ctx, 0, sizeof(ctx));
|
||||
}
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user