diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/libcrypto/sm4/sm4.c | 55 |
1 files changed, 27 insertions, 28 deletions
diff --git a/src/lib/libcrypto/sm4/sm4.c b/src/lib/libcrypto/sm4/sm4.c index cf9d55634c..a6c072de3b 100644 --- a/src/lib/libcrypto/sm4/sm4.c +++ b/src/lib/libcrypto/sm4/sm4.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: sm4.c,v 1.3 2025/01/22 09:37:07 jsing Exp $ */ | 1 | /* $OpenBSD: sm4.c,v 1.4 2025/01/22 09:42:27 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2017, 2019 Ribose Inc | 3 | * Copyright (c) 2017, 2019 Ribose Inc |
4 | * | 4 | * |
@@ -142,45 +142,44 @@ SM4_T(uint32_t X) | |||
142 | crypto_rol_u32(SM4_SBOX_T[(uint8_t)X], 8); | 142 | crypto_rol_u32(SM4_SBOX_T[(uint8_t)X], 8); |
143 | } | 143 | } |
144 | 144 | ||
145 | /* | ||
146 | * SM4 Family Key | ||
147 | */ | ||
148 | static const uint32_t SM4_FK[4] = { | ||
149 | 0xa3b1bac6, 0x56aa3350, 0x677d9197, 0xb27022dc, | ||
150 | }; | ||
151 | |||
152 | /* | ||
153 | * SM4 Constant Key | ||
154 | */ | ||
155 | static const uint32_t SM4_CK[32] = { | ||
156 | 0x00070E15, 0x1C232A31, 0x383F464D, 0x545B6269, | ||
157 | 0x70777E85, 0x8C939AA1, 0xA8AFB6BD, 0xC4CBD2D9, | ||
158 | 0xE0E7EEF5, 0xFC030A11, 0x181F262D, 0x343B4249, | ||
159 | 0x50575E65, 0x6C737A81, 0x888F969D, 0xA4ABB2B9, | ||
160 | 0xC0C7CED5, 0xDCE3EAF1, 0xF8FF060D, 0x141B2229, | ||
161 | 0x30373E45, 0x4C535A61, 0x686F767D, 0x848B9299, | ||
162 | 0xA0A7AEB5, 0xBCC3CAD1, 0xD8DFE6ED, 0xF4FB0209, | ||
163 | 0x10171E25, 0x2C333A41, 0x484F565D, 0x646B7279, | ||
164 | }; | ||
165 | |||
145 | int | 166 | int |
146 | SM4_set_key(const uint8_t *key, SM4_KEY *k) | 167 | SM4_set_key(const uint8_t *key, SM4_KEY *k) |
147 | { | 168 | { |
148 | struct sm4_key *ks = (struct sm4_key *)k; | 169 | struct sm4_key *ks = (struct sm4_key *)k; |
149 | |||
150 | /* | ||
151 | * Family Key | ||
152 | */ | ||
153 | static const uint32_t FK[4] = { | ||
154 | 0xa3b1bac6, 0x56aa3350, 0x677d9197, 0xb27022dc, | ||
155 | }; | ||
156 | |||
157 | /* | ||
158 | * Constant Key | ||
159 | */ | ||
160 | static const uint32_t CK[32] = { | ||
161 | 0x00070E15, 0x1C232A31, 0x383F464D, 0x545B6269, | ||
162 | 0x70777E85, 0x8C939AA1, 0xA8AFB6BD, 0xC4CBD2D9, | ||
163 | 0xE0E7EEF5, 0xFC030A11, 0x181F262D, 0x343B4249, | ||
164 | 0x50575E65, 0x6C737A81, 0x888F969D, 0xA4ABB2B9, | ||
165 | 0xC0C7CED5, 0xDCE3EAF1, 0xF8FF060D, 0x141B2229, | ||
166 | 0x30373E45, 0x4C535A61, 0x686F767D, 0x848B9299, | ||
167 | 0xA0A7AEB5, 0xBCC3CAD1, 0xD8DFE6ED, 0xF4FB0209, | ||
168 | 0x10171E25, 0x2C333A41, 0x484F565D, 0x646B7279, | ||
169 | }; | ||
170 | |||
171 | uint32_t K[4]; | 170 | uint32_t K[4]; |
172 | int i; | 171 | int i; |
173 | 172 | ||
174 | K[0] = load_u32_be(key, 0) ^ FK[0]; | 173 | K[0] = load_u32_be(key, 0) ^ SM4_FK[0]; |
175 | K[1] = load_u32_be(key, 1) ^ FK[1]; | 174 | K[1] = load_u32_be(key, 1) ^ SM4_FK[1]; |
176 | K[2] = load_u32_be(key, 2) ^ FK[2]; | 175 | K[2] = load_u32_be(key, 2) ^ SM4_FK[2]; |
177 | K[3] = load_u32_be(key, 3) ^ FK[3]; | 176 | K[3] = load_u32_be(key, 3) ^ SM4_FK[3]; |
178 | 177 | ||
179 | for (i = 0; i < SM4_KEY_SCHEDULE; i++) { | 178 | for (i = 0; i < SM4_KEY_SCHEDULE; i++) { |
180 | uint32_t X; | 179 | uint32_t X; |
181 | uint32_t t = 0; | 180 | uint32_t t = 0; |
182 | 181 | ||
183 | X = K[(i + 1) % 4] ^ K[(i + 2) % 4] ^ K[(i + 3) % 4] ^ CK[i]; | 182 | X = K[(i + 1) % 4] ^ K[(i + 2) % 4] ^ K[(i + 3) % 4] ^ SM4_CK[i]; |
184 | 183 | ||
185 | t |= ((uint32_t)SM4_S[(uint8_t)(X >> 24)]) << 24; | 184 | t |= ((uint32_t)SM4_S[(uint8_t)(X >> 24)]) << 24; |
186 | t |= ((uint32_t)SM4_S[(uint8_t)(X >> 16)]) << 16; | 185 | t |= ((uint32_t)SM4_S[(uint8_t)(X >> 16)]) << 16; |