diff options
Diffstat (limited to 'src/lib/libcrypto/aes/aes_cbc.c')
-rw-r--r-- | src/lib/libcrypto/aes/aes_cbc.c | 82 |
1 files changed, 6 insertions, 76 deletions
diff --git a/src/lib/libcrypto/aes/aes_cbc.c b/src/lib/libcrypto/aes/aes_cbc.c index 373864cd4b..227f75625d 100644 --- a/src/lib/libcrypto/aes/aes_cbc.c +++ b/src/lib/libcrypto/aes/aes_cbc.c | |||
@@ -49,85 +49,15 @@ | |||
49 | * | 49 | * |
50 | */ | 50 | */ |
51 | 51 | ||
52 | #ifndef AES_DEBUG | ||
53 | # ifndef NDEBUG | ||
54 | # define NDEBUG | ||
55 | # endif | ||
56 | #endif | ||
57 | #include <assert.h> | ||
58 | |||
59 | #include <openssl/aes.h> | 52 | #include <openssl/aes.h> |
60 | #include "aes_locl.h" | 53 | #include <openssl/modes.h> |
61 | 54 | ||
62 | #if !defined(OPENSSL_FIPS_AES_ASM) | ||
63 | void AES_cbc_encrypt(const unsigned char *in, unsigned char *out, | 55 | void AES_cbc_encrypt(const unsigned char *in, unsigned char *out, |
64 | const unsigned long length, const AES_KEY *key, | 56 | size_t len, const AES_KEY *key, |
65 | unsigned char *ivec, const int enc) { | 57 | unsigned char *ivec, const int enc) { |
66 | 58 | ||
67 | unsigned long n; | 59 | if (enc) |
68 | unsigned long len = length; | 60 | CRYPTO_cbc128_encrypt(in,out,len,key,ivec,(block128_f)AES_encrypt); |
69 | unsigned char tmp[AES_BLOCK_SIZE]; | 61 | else |
70 | const unsigned char *iv = ivec; | 62 | CRYPTO_cbc128_decrypt(in,out,len,key,ivec,(block128_f)AES_decrypt); |
71 | |||
72 | assert(in && out && key && ivec); | ||
73 | assert((AES_ENCRYPT == enc)||(AES_DECRYPT == enc)); | ||
74 | |||
75 | if (AES_ENCRYPT == enc) { | ||
76 | while (len >= AES_BLOCK_SIZE) { | ||
77 | for(n=0; n < AES_BLOCK_SIZE; ++n) | ||
78 | out[n] = in[n] ^ iv[n]; | ||
79 | AES_encrypt(out, out, key); | ||
80 | iv = out; | ||
81 | len -= AES_BLOCK_SIZE; | ||
82 | in += AES_BLOCK_SIZE; | ||
83 | out += AES_BLOCK_SIZE; | ||
84 | } | ||
85 | if (len) { | ||
86 | for(n=0; n < len; ++n) | ||
87 | out[n] = in[n] ^ iv[n]; | ||
88 | for(n=len; n < AES_BLOCK_SIZE; ++n) | ||
89 | out[n] = iv[n]; | ||
90 | AES_encrypt(out, out, key); | ||
91 | iv = out; | ||
92 | } | ||
93 | memcpy(ivec,iv,AES_BLOCK_SIZE); | ||
94 | } else if (in != out) { | ||
95 | while (len >= AES_BLOCK_SIZE) { | ||
96 | AES_decrypt(in, out, key); | ||
97 | for(n=0; n < AES_BLOCK_SIZE; ++n) | ||
98 | out[n] ^= iv[n]; | ||
99 | iv = in; | ||
100 | len -= AES_BLOCK_SIZE; | ||
101 | in += AES_BLOCK_SIZE; | ||
102 | out += AES_BLOCK_SIZE; | ||
103 | } | ||
104 | if (len) { | ||
105 | AES_decrypt(in,tmp,key); | ||
106 | for(n=0; n < len; ++n) | ||
107 | out[n] = tmp[n] ^ iv[n]; | ||
108 | iv = in; | ||
109 | } | ||
110 | memcpy(ivec,iv,AES_BLOCK_SIZE); | ||
111 | } else { | ||
112 | while (len >= AES_BLOCK_SIZE) { | ||
113 | memcpy(tmp, in, AES_BLOCK_SIZE); | ||
114 | AES_decrypt(in, out, key); | ||
115 | for(n=0; n < AES_BLOCK_SIZE; ++n) | ||
116 | out[n] ^= ivec[n]; | ||
117 | memcpy(ivec, tmp, AES_BLOCK_SIZE); | ||
118 | len -= AES_BLOCK_SIZE; | ||
119 | in += AES_BLOCK_SIZE; | ||
120 | out += AES_BLOCK_SIZE; | ||
121 | } | ||
122 | if (len) { | ||
123 | memcpy(tmp, in, AES_BLOCK_SIZE); | ||
124 | AES_decrypt(tmp, out, key); | ||
125 | for(n=0; n < len; ++n) | ||
126 | out[n] ^= ivec[n]; | ||
127 | for(n=len; n < AES_BLOCK_SIZE; ++n) | ||
128 | out[n] = tmp[n]; | ||
129 | memcpy(ivec, tmp, AES_BLOCK_SIZE); | ||
130 | } | ||
131 | } | ||
132 | } | 63 | } |
133 | #endif | ||