summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/seed/seed_cbc.c
diff options
context:
space:
mode:
authordjm <>2010-10-01 22:54:18 +0000
committerdjm <>2010-10-01 22:54:18 +0000
commitf6ca1ae73bb9eabfb510df2cffc2599db98d35a9 (patch)
treedef8296400903465cb96345535c0a56935eb05a4 /src/lib/libcrypto/seed/seed_cbc.c
parent0229f29a33371533962d8b0b8264882afac53d70 (diff)
downloadopenbsd-f6ca1ae73bb9eabfb510df2cffc2599db98d35a9.tar.gz
openbsd-f6ca1ae73bb9eabfb510df2cffc2599db98d35a9.tar.bz2
openbsd-f6ca1ae73bb9eabfb510df2cffc2599db98d35a9.zip
import OpenSSL-1.0.0a
Diffstat (limited to 'src/lib/libcrypto/seed/seed_cbc.c')
-rw-r--r--src/lib/libcrypto/seed/seed_cbc.c76
1 files changed, 5 insertions, 71 deletions
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 }