diff options
Diffstat (limited to 'src/lib/libcrypto/seed/seed.c')
| -rw-r--r-- | src/lib/libcrypto/seed/seed.c | 45 |
1 files changed, 42 insertions, 3 deletions
diff --git a/src/lib/libcrypto/seed/seed.c b/src/lib/libcrypto/seed/seed.c index 125dd7d66f..2bc384a19f 100644 --- a/src/lib/libcrypto/seed/seed.c +++ b/src/lib/libcrypto/seed/seed.c | |||
| @@ -35,7 +35,7 @@ | |||
| 35 | #include <openssl/seed.h> | 35 | #include <openssl/seed.h> |
| 36 | #include "seed_locl.h" | 36 | #include "seed_locl.h" |
| 37 | 37 | ||
| 38 | static seed_word SS[4][256] = { { | 38 | static const seed_word SS[4][256] = { { |
| 39 | 0x2989a1a8, 0x05858184, 0x16c6d2d4, 0x13c3d3d0, 0x14445054, 0x1d0d111c, 0x2c8ca0ac, 0x25052124, | 39 | 0x2989a1a8, 0x05858184, 0x16c6d2d4, 0x13c3d3d0, 0x14445054, 0x1d0d111c, 0x2c8ca0ac, 0x25052124, |
| 40 | 0x1d4d515c, 0x03434340, 0x18081018, 0x1e0e121c, 0x11415150, 0x3cccf0fc, 0x0acac2c8, 0x23436360, | 40 | 0x1d4d515c, 0x03434340, 0x18081018, 0x1e0e121c, 0x11415150, 0x3cccf0fc, 0x0acac2c8, 0x23436360, |
| 41 | 0x28082028, 0x04444044, 0x20002020, 0x1d8d919c, 0x20c0e0e0, 0x22c2e2e0, 0x08c8c0c8, 0x17071314, | 41 | 0x28082028, 0x04444044, 0x20002020, 0x1d8d919c, 0x20c0e0e0, 0x22c2e2e0, 0x08c8c0c8, 0x17071314, |
| @@ -187,6 +187,11 @@ static seed_word SS[4][256] = { { | |||
| 187 | #define KC14 0xde6e678d | 187 | #define KC14 0xde6e678d |
| 188 | #define KC15 0xbcdccf1b | 188 | #define KC15 0xbcdccf1b |
| 189 | 189 | ||
| 190 | #if defined(OPENSSL_SMALL_FOOTPRINT) | ||
| 191 | static const seed_word KC[] = { | ||
| 192 | KC0, KC1, KC2, KC3, KC4, KC5, KC6, KC7, | ||
| 193 | KC8, KC9, KC10, KC11, KC12, KC13, KC14, KC15 }; | ||
| 194 | #endif | ||
| 190 | 195 | ||
| 191 | void SEED_set_key(const unsigned char rawkey[SEED_KEY_LENGTH], SEED_KEY_SCHEDULE *ks) | 196 | void SEED_set_key(const unsigned char rawkey[SEED_KEY_LENGTH], SEED_KEY_SCHEDULE *ks) |
| 192 | { | 197 | { |
| @@ -201,6 +206,8 @@ void SEED_set_key(const unsigned char rawkey[SEED_KEY_LENGTH], SEED_KEY_SCHEDULE | |||
| 201 | t0 = (x1 + x3 - KC0) & 0xffffffff; | 206 | t0 = (x1 + x3 - KC0) & 0xffffffff; |
| 202 | t1 = (x2 - x4 + KC0) & 0xffffffff; KEYUPDATE_TEMP(t0, t1, &ks->data[0]); | 207 | t1 = (x2 - x4 + KC0) & 0xffffffff; KEYUPDATE_TEMP(t0, t1, &ks->data[0]); |
| 203 | KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC1); KEYUPDATE_TEMP(t0, t1, &ks->data[2]); | 208 | KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC1); KEYUPDATE_TEMP(t0, t1, &ks->data[2]); |
| 209 | |||
| 210 | #if !defined(OPENSSL_SMALL_FOOTPRINT) | ||
| 204 | KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC2); KEYUPDATE_TEMP(t0, t1, &ks->data[4]); | 211 | KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC2); KEYUPDATE_TEMP(t0, t1, &ks->data[4]); |
| 205 | KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC3); KEYUPDATE_TEMP(t0, t1, &ks->data[6]); | 212 | KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC3); KEYUPDATE_TEMP(t0, t1, &ks->data[6]); |
| 206 | KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC4); KEYUPDATE_TEMP(t0, t1, &ks->data[8]); | 213 | KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC4); KEYUPDATE_TEMP(t0, t1, &ks->data[8]); |
| @@ -215,6 +222,17 @@ void SEED_set_key(const unsigned char rawkey[SEED_KEY_LENGTH], SEED_KEY_SCHEDULE | |||
| 215 | KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC13); KEYUPDATE_TEMP(t0, t1, &ks->data[26]); | 222 | KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC13); KEYUPDATE_TEMP(t0, t1, &ks->data[26]); |
| 216 | KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC14); KEYUPDATE_TEMP(t0, t1, &ks->data[28]); | 223 | KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC14); KEYUPDATE_TEMP(t0, t1, &ks->data[28]); |
| 217 | KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC15); KEYUPDATE_TEMP(t0, t1, &ks->data[30]); | 224 | KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC15); KEYUPDATE_TEMP(t0, t1, &ks->data[30]); |
| 225 | #else | ||
| 226 | { | ||
| 227 | int i; | ||
| 228 | for (i=2; i<16; i+=2) { | ||
| 229 | KEYSCHEDULE_UPDATE0(t0, t1, x1, x2, x3, x4, KC[i]); | ||
| 230 | KEYUPDATE_TEMP(t0, t1, &ks->data[i*2]); | ||
| 231 | KEYSCHEDULE_UPDATE1(t0, t1, x1, x2, x3, x4, KC[i+1]); | ||
| 232 | KEYUPDATE_TEMP(t0, t1, &ks->data[i*2+2]); | ||
| 233 | } | ||
| 234 | } | ||
| 235 | #endif | ||
| 218 | } | 236 | } |
| 219 | 237 | ||
| 220 | void SEED_encrypt(const unsigned char s[SEED_BLOCK_SIZE], unsigned char d[SEED_BLOCK_SIZE], const SEED_KEY_SCHEDULE *ks) | 238 | void SEED_encrypt(const unsigned char s[SEED_BLOCK_SIZE], unsigned char d[SEED_BLOCK_SIZE], const SEED_KEY_SCHEDULE *ks) |
| @@ -226,7 +244,8 @@ void SEED_encrypt(const unsigned char s[SEED_BLOCK_SIZE], unsigned char d[SEED_B | |||
| 226 | char2word(s+4, x2); | 244 | char2word(s+4, x2); |
| 227 | char2word(s+8, x3); | 245 | char2word(s+8, x3); |
| 228 | char2word(s+12, x4); | 246 | char2word(s+12, x4); |
| 229 | 247 | ||
| 248 | #if !defined(OPENSSL_SMALL_FOOTPRINT) | ||
| 230 | E_SEED(t0, t1, x1, x2, x3, x4, 0); | 249 | E_SEED(t0, t1, x1, x2, x3, x4, 0); |
| 231 | E_SEED(t0, t1, x3, x4, x1, x2, 2); | 250 | E_SEED(t0, t1, x3, x4, x1, x2, 2); |
| 232 | E_SEED(t0, t1, x1, x2, x3, x4, 4); | 251 | E_SEED(t0, t1, x1, x2, x3, x4, 4); |
| @@ -243,6 +262,15 @@ void SEED_encrypt(const unsigned char s[SEED_BLOCK_SIZE], unsigned char d[SEED_B | |||
| 243 | E_SEED(t0, t1, x3, x4, x1, x2, 26); | 262 | E_SEED(t0, t1, x3, x4, x1, x2, 26); |
| 244 | E_SEED(t0, t1, x1, x2, x3, x4, 28); | 263 | E_SEED(t0, t1, x1, x2, x3, x4, 28); |
| 245 | E_SEED(t0, t1, x3, x4, x1, x2, 30); | 264 | E_SEED(t0, t1, x3, x4, x1, x2, 30); |
| 265 | #else | ||
| 266 | { | ||
| 267 | int i; | ||
| 268 | for (i=0;i<30;i+=4) { | ||
| 269 | E_SEED(t0,t1,x1,x2,x3,x4,i); | ||
| 270 | E_SEED(t0,t1,x3,x4,x1,x2,i+2); | ||
| 271 | } | ||
| 272 | } | ||
| 273 | #endif | ||
| 246 | 274 | ||
| 247 | word2char(x3, d); | 275 | word2char(x3, d); |
| 248 | word2char(x4, d+4); | 276 | word2char(x4, d+4); |
| @@ -259,7 +287,8 @@ void SEED_decrypt(const unsigned char s[SEED_BLOCK_SIZE], unsigned char d[SEED_B | |||
| 259 | char2word(s+4, x2); | 287 | char2word(s+4, x2); |
| 260 | char2word(s+8, x3); | 288 | char2word(s+8, x3); |
| 261 | char2word(s+12, x4); | 289 | char2word(s+12, x4); |
| 262 | 290 | ||
| 291 | #if !defined(OPENSSL_SMALL_FOOTPRINT) | ||
| 263 | E_SEED(t0, t1, x1, x2, x3, x4, 30); | 292 | E_SEED(t0, t1, x1, x2, x3, x4, 30); |
| 264 | E_SEED(t0, t1, x3, x4, x1, x2, 28); | 293 | E_SEED(t0, t1, x3, x4, x1, x2, 28); |
| 265 | E_SEED(t0, t1, x1, x2, x3, x4, 26); | 294 | E_SEED(t0, t1, x1, x2, x3, x4, 26); |
| @@ -276,6 +305,16 @@ void SEED_decrypt(const unsigned char s[SEED_BLOCK_SIZE], unsigned char d[SEED_B | |||
| 276 | E_SEED(t0, t1, x3, x4, x1, x2, 4); | 305 | E_SEED(t0, t1, x3, x4, x1, x2, 4); |
| 277 | E_SEED(t0, t1, x1, x2, x3, x4, 2); | 306 | E_SEED(t0, t1, x1, x2, x3, x4, 2); |
| 278 | E_SEED(t0, t1, x3, x4, x1, x2, 0); | 307 | E_SEED(t0, t1, x3, x4, x1, x2, 0); |
| 308 | #else | ||
| 309 | { | ||
| 310 | int i; | ||
| 311 | for (i=30; i>0; i-=4) { | ||
| 312 | E_SEED(t0, t1, x1, x2, x3, x4, i); | ||
| 313 | E_SEED(t0, t1, x3, x4, x1, x2, i-2); | ||
| 314 | |||
| 315 | } | ||
| 316 | } | ||
| 317 | #endif | ||
| 279 | 318 | ||
| 280 | word2char(x3, d); | 319 | word2char(x3, d); |
| 281 | word2char(x4, d+4); | 320 | word2char(x4, d+4); |
