summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/seed
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/seed')
-rw-r--r--src/lib/libcrypto/seed/Makefile39
-rw-r--r--src/lib/libcrypto/seed/seed.c45
-rw-r--r--src/lib/libcrypto/seed/seed.h2
-rw-r--r--src/lib/libcrypto/seed/seed_cbc.c76
-rw-r--r--src/lib/libcrypto/seed/seed_cfb.c34
-rw-r--r--src/lib/libcrypto/seed/seed_ofb.c18
6 files changed, 84 insertions, 130 deletions
diff --git a/src/lib/libcrypto/seed/Makefile b/src/lib/libcrypto/seed/Makefile
index ffaeb84218..4bc55e4916 100644
--- a/src/lib/libcrypto/seed/Makefile
+++ b/src/lib/libcrypto/seed/Makefile
@@ -34,7 +34,7 @@ top:
34all: lib 34all: lib
35 35
36lib: $(LIBOBJ) 36lib: $(LIBOBJ)
37 $(ARX) $(LIB) $(LIBOBJ) 37 $(AR) $(LIB) $(LIBOBJ)
38 $(RANLIB) $(LIB) || echo Never mind. 38 $(RANLIB) $(LIB) || echo Never mind.
39 @touch lib 39 @touch lib
40 40
@@ -75,13 +75,32 @@ clean:
75 75
76# DO NOT DELETE THIS LINE -- make depend depends on it. 76# DO NOT DELETE THIS LINE -- make depend depends on it.
77 77
78seed.o: ../../include/openssl/e_os2.h ../../include/openssl/opensslconf.h 78seed.o: ../../include/openssl/crypto.h ../../include/openssl/e_os2.h
79seed.o: ../../include/openssl/seed.h seed.c seed_locl.h 79seed.o: ../../include/openssl/opensslconf.h ../../include/openssl/opensslv.h
80seed_cbc.o: ../../include/openssl/e_os2.h ../../include/openssl/opensslconf.h 80seed.o: ../../include/openssl/ossl_typ.h ../../include/openssl/safestack.h
81seed_cbc.o: ../../include/openssl/seed.h seed_cbc.c seed_locl.h 81seed.o: ../../include/openssl/seed.h ../../include/openssl/stack.h
82seed_cfb.o: ../../include/openssl/e_os2.h ../../include/openssl/opensslconf.h 82seed.o: ../../include/openssl/symhacks.h seed.c seed_locl.h
83seed_cfb.o: ../../include/openssl/seed.h seed_cfb.c seed_locl.h 83seed_cbc.o: ../../include/openssl/crypto.h ../../include/openssl/e_os2.h
84seed_ecb.o: ../../include/openssl/opensslconf.h ../../include/openssl/seed.h 84seed_cbc.o: ../../include/openssl/modes.h ../../include/openssl/opensslconf.h
85seed_cbc.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
86seed_cbc.o: ../../include/openssl/safestack.h ../../include/openssl/seed.h
87seed_cbc.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h
88seed_cbc.o: seed_cbc.c
89seed_cfb.o: ../../include/openssl/crypto.h ../../include/openssl/e_os2.h
90seed_cfb.o: ../../include/openssl/modes.h ../../include/openssl/opensslconf.h
91seed_cfb.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
92seed_cfb.o: ../../include/openssl/safestack.h ../../include/openssl/seed.h
93seed_cfb.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h
94seed_cfb.o: seed_cfb.c
95seed_ecb.o: ../../include/openssl/crypto.h ../../include/openssl/e_os2.h
96seed_ecb.o: ../../include/openssl/opensslconf.h
97seed_ecb.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
98seed_ecb.o: ../../include/openssl/safestack.h ../../include/openssl/seed.h
99seed_ecb.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h
85seed_ecb.o: seed_ecb.c 100seed_ecb.o: seed_ecb.c
86seed_ofb.o: ../../include/openssl/e_os2.h ../../include/openssl/opensslconf.h 101seed_ofb.o: ../../include/openssl/crypto.h ../../include/openssl/e_os2.h
87seed_ofb.o: ../../include/openssl/seed.h seed_locl.h seed_ofb.c 102seed_ofb.o: ../../include/openssl/modes.h ../../include/openssl/opensslconf.h
103seed_ofb.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
104seed_ofb.o: ../../include/openssl/safestack.h ../../include/openssl/seed.h
105seed_ofb.o: ../../include/openssl/stack.h ../../include/openssl/symhacks.h
106seed_ofb.o: seed_ofb.c
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
38static seed_word SS[4][256] = { { 38static 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)
191static 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
191void SEED_set_key(const unsigned char rawkey[SEED_KEY_LENGTH], SEED_KEY_SCHEDULE *ks) 196void 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
220void SEED_encrypt(const unsigned char s[SEED_BLOCK_SIZE], unsigned char d[SEED_BLOCK_SIZE], const SEED_KEY_SCHEDULE *ks) 238void 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);
diff --git a/src/lib/libcrypto/seed/seed.h b/src/lib/libcrypto/seed/seed.h
index 427915ed9a..6ffa5f024e 100644
--- a/src/lib/libcrypto/seed/seed.h
+++ b/src/lib/libcrypto/seed/seed.h
@@ -82,6 +82,8 @@
82#define HEADER_SEED_H 82#define HEADER_SEED_H
83 83
84#include <openssl/opensslconf.h> 84#include <openssl/opensslconf.h>
85#include <openssl/e_os2.h>
86#include <openssl/crypto.h>
85 87
86#ifdef OPENSSL_NO_SEED 88#ifdef OPENSSL_NO_SEED
87#error SEED is disabled. 89#error SEED is disabled.
diff --git a/src/lib/libcrypto/seed/seed_cbc.c b/src/lib/libcrypto/seed/seed_cbc.c
index 4f718ccb44..6c3f9b527a 100644
--- a/src/lib/libcrypto/seed/seed_cbc.c
+++ b/src/lib/libcrypto/seed/seed_cbc.c
@@ -49,81 +49,15 @@
49 * 49 *
50 */ 50 */
51 51
52#include "seed_locl.h" 52#include <openssl/seed.h>
53#include <string.h> 53#include <openssl/modes.h>
54 54
55void SEED_cbc_encrypt(const unsigned char *in, unsigned char *out, 55void SEED_cbc_encrypt(const unsigned char *in, unsigned char *out,
56 size_t len, const SEED_KEY_SCHEDULE *ks, 56 size_t len, const SEED_KEY_SCHEDULE *ks,
57 unsigned char ivec[SEED_BLOCK_SIZE], int enc) 57 unsigned char ivec[SEED_BLOCK_SIZE], int enc)
58 { 58 {
59 size_t n;
60 unsigned char tmp[SEED_BLOCK_SIZE];
61 const unsigned char *iv = ivec;
62
63 if (enc) 59 if (enc)
64 { 60 CRYPTO_cbc128_encrypt(in,out,len,ks,ivec,(block128_f)SEED_encrypt);
65 while (len >= SEED_BLOCK_SIZE) 61 else
66 { 62 CRYPTO_cbc128_decrypt(in,out,len,ks,ivec,(block128_f)SEED_decrypt);
67 for (n = 0; n < SEED_BLOCK_SIZE; ++n)
68 out[n] = in[n] ^ iv[n];
69 SEED_encrypt(out, out, ks);
70 iv = out;
71 len -= SEED_BLOCK_SIZE;
72 in += SEED_BLOCK_SIZE;
73 out += SEED_BLOCK_SIZE;
74 }
75 if (len)
76 {
77 for (n = 0; n < len; ++n)
78 out[n] = in[n] ^ iv[n];
79 for (n = len; n < SEED_BLOCK_SIZE; ++n)
80 out[n] = iv[n];
81 SEED_encrypt(out, out, ks);
82 iv = out;
83 }
84 memcpy(ivec, iv, SEED_BLOCK_SIZE);
85 }
86 else if (in != out) /* decrypt */
87 {
88 while (len >= SEED_BLOCK_SIZE)
89 {
90 SEED_decrypt(in, out, ks);
91 for (n = 0; n < SEED_BLOCK_SIZE; ++n)
92 out[n] ^= iv[n];
93 iv = in;
94 len -= SEED_BLOCK_SIZE;
95 in += SEED_BLOCK_SIZE;
96 out += SEED_BLOCK_SIZE;
97 }
98 if (len)
99 {
100 SEED_decrypt(in, tmp, ks);
101 for (n = 0; n < len; ++n)
102 out[n] = tmp[n] ^ iv[n];
103 iv = in;
104 }
105 memcpy(ivec, iv, SEED_BLOCK_SIZE);
106 }
107 else /* decrypt, overlap */
108 {
109 while (len >= SEED_BLOCK_SIZE)
110 {
111 memcpy(tmp, in, SEED_BLOCK_SIZE);
112 SEED_decrypt(in, out, ks);
113 for (n = 0; n < SEED_BLOCK_SIZE; ++n)
114 out[n] ^= ivec[n];
115 memcpy(ivec, tmp, SEED_BLOCK_SIZE);
116 len -= SEED_BLOCK_SIZE;
117 in += SEED_BLOCK_SIZE;
118 out += SEED_BLOCK_SIZE;
119 }
120 if (len)
121 {
122 memcpy(tmp, in, SEED_BLOCK_SIZE);
123 SEED_decrypt(tmp, tmp, ks);
124 for (n = 0; n < len; ++n)
125 out[n] = tmp[n] ^ ivec[n];
126 memcpy(ivec, tmp, SEED_BLOCK_SIZE);
127 }
128 }
129 } 63 }
diff --git a/src/lib/libcrypto/seed/seed_cfb.c b/src/lib/libcrypto/seed/seed_cfb.c
index 07d878a788..694597dd06 100644
--- a/src/lib/libcrypto/seed/seed_cfb.c
+++ b/src/lib/libcrypto/seed/seed_cfb.c
@@ -105,40 +105,12 @@
105 * [including the GNU Public Licence.] 105 * [including the GNU Public Licence.]
106 */ 106 */
107 107
108#include "seed_locl.h" 108#include <openssl/seed.h>
109#include <string.h> 109#include <openssl/modes.h>
110 110
111void SEED_cfb128_encrypt(const unsigned char *in, unsigned char *out, 111void SEED_cfb128_encrypt(const unsigned char *in, unsigned char *out,
112 size_t len, const SEED_KEY_SCHEDULE *ks, 112 size_t len, const SEED_KEY_SCHEDULE *ks,
113 unsigned char ivec[SEED_BLOCK_SIZE], int *num, int enc) 113 unsigned char ivec[SEED_BLOCK_SIZE], int *num, int enc)
114 { 114 {
115 int n; 115 CRYPTO_cfb128_encrypt(in,out,len,ks,ivec,num,enc,(block128_f)SEED_encrypt);
116 unsigned char c;
117
118 n = *num;
119
120 if (enc)
121 {
122 while (len--)
123 {
124 if (n == 0)
125 SEED_encrypt(ivec, ivec, ks);
126 ivec[n] = *(out++) = *(in++) ^ ivec[n];
127 n = (n+1) % SEED_BLOCK_SIZE;
128 }
129 }
130 else
131 {
132 while (len--)
133 {
134 if (n == 0)
135 SEED_encrypt(ivec, ivec, ks);
136 c = *(in);
137 *(out++) = *(in++) ^ ivec[n];
138 ivec[n] = c;
139 n = (n+1) % SEED_BLOCK_SIZE;
140 }
141 }
142
143 *num = n;
144 } 116 }
diff --git a/src/lib/libcrypto/seed/seed_ofb.c b/src/lib/libcrypto/seed/seed_ofb.c
index e2f3f57a38..3c8ba33bb9 100644
--- a/src/lib/libcrypto/seed/seed_ofb.c
+++ b/src/lib/libcrypto/seed/seed_ofb.c
@@ -105,24 +105,12 @@
105 * [including the GNU Public Licence.] 105 * [including the GNU Public Licence.]
106 */ 106 */
107 107
108#include "seed_locl.h" 108#include <openssl/seed.h>
109#include <string.h> 109#include <openssl/modes.h>
110 110
111void SEED_ofb128_encrypt(const unsigned char *in, unsigned char *out, 111void SEED_ofb128_encrypt(const unsigned char *in, unsigned char *out,
112 size_t len, const SEED_KEY_SCHEDULE *ks, 112 size_t len, const SEED_KEY_SCHEDULE *ks,
113 unsigned char ivec[SEED_BLOCK_SIZE], int *num) 113 unsigned char ivec[SEED_BLOCK_SIZE], int *num)
114 { 114 {
115 int n; 115 CRYPTO_ofb128_encrypt(in,out,len,ks,ivec,num,(block128_f)SEED_encrypt);
116
117 n = *num;
118
119 while (len--)
120 {
121 if (n == 0)
122 SEED_encrypt(ivec, ivec, ks);
123 *(out++) = *(in++) ^ ivec[n];
124 n = (n+1) % SEED_BLOCK_SIZE;
125 }
126
127 *num = n;
128 } 116 }