diff options
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libcrypto/aes/aes.h | 4 | ||||
| -rw-r--r-- | src/lib/libcrypto/aes/aes_ige.c | 112 |
2 files changed, 0 insertions, 116 deletions
diff --git a/src/lib/libcrypto/aes/aes.h b/src/lib/libcrypto/aes/aes.h index d05f803494..0b3db6420b 100644 --- a/src/lib/libcrypto/aes/aes.h +++ b/src/lib/libcrypto/aes/aes.h | |||
| @@ -117,10 +117,6 @@ void AES_ctr128_encrypt(const unsigned char *in, unsigned char *out, | |||
| 117 | /* NB: the IV is _two_ blocks long */ | 117 | /* NB: the IV is _two_ blocks long */ |
| 118 | void AES_ige_encrypt(const unsigned char *in, unsigned char *out, | 118 | void AES_ige_encrypt(const unsigned char *in, unsigned char *out, |
| 119 | size_t length, const AES_KEY *key, unsigned char *ivec, const int enc); | 119 | size_t length, const AES_KEY *key, unsigned char *ivec, const int enc); |
| 120 | /* NB: the IV is _four_ blocks long */ | ||
| 121 | void AES_bi_ige_encrypt(const unsigned char *in, unsigned char *out, | ||
| 122 | size_t length, const AES_KEY *key, const AES_KEY *key2, | ||
| 123 | const unsigned char *ivec, const int enc); | ||
| 124 | 120 | ||
| 125 | int AES_wrap_key(AES_KEY *key, const unsigned char *iv, unsigned char *out, | 121 | int AES_wrap_key(AES_KEY *key, const unsigned char *iv, unsigned char *out, |
| 126 | const unsigned char *in, unsigned int inlen); | 122 | const unsigned char *in, unsigned int inlen); |
diff --git a/src/lib/libcrypto/aes/aes_ige.c b/src/lib/libcrypto/aes/aes_ige.c index 0882a3d853..883dff7d29 100644 --- a/src/lib/libcrypto/aes/aes_ige.c +++ b/src/lib/libcrypto/aes/aes_ige.c | |||
| @@ -194,115 +194,3 @@ AES_ige_encrypt(const unsigned char *in, unsigned char *out, size_t length, | |||
| 194 | } | 194 | } |
| 195 | } | 195 | } |
| 196 | } | 196 | } |
| 197 | |||
| 198 | /* | ||
| 199 | * Note that its effectively impossible to do biIGE in anything other | ||
| 200 | * than a single pass, so no provision is made for chaining. | ||
| 201 | */ | ||
| 202 | |||
| 203 | /* N.B. The IV for this mode is _four times_ the block size */ | ||
| 204 | |||
| 205 | void | ||
| 206 | AES_bi_ige_encrypt(const unsigned char *in, unsigned char *out, size_t length, | ||
| 207 | const AES_KEY *key, const AES_KEY *key2, const unsigned char *ivec, | ||
| 208 | const int enc) | ||
| 209 | { | ||
| 210 | size_t n; | ||
| 211 | size_t len = length; | ||
| 212 | unsigned char tmp[AES_BLOCK_SIZE]; | ||
| 213 | unsigned char tmp2[AES_BLOCK_SIZE]; | ||
| 214 | unsigned char tmp3[AES_BLOCK_SIZE]; | ||
| 215 | unsigned char prev[AES_BLOCK_SIZE]; | ||
| 216 | const unsigned char *iv; | ||
| 217 | const unsigned char *iv2; | ||
| 218 | |||
| 219 | OPENSSL_assert(in && out && key && ivec); | ||
| 220 | OPENSSL_assert((AES_ENCRYPT == enc) || (AES_DECRYPT == enc)); | ||
| 221 | OPENSSL_assert((length % AES_BLOCK_SIZE) == 0); | ||
| 222 | |||
| 223 | if (AES_ENCRYPT == enc) { | ||
| 224 | /* XXX: Do a separate case for when in != out (strictly should | ||
| 225 | check for overlap, too) */ | ||
| 226 | |||
| 227 | /* First the forward pass */ | ||
| 228 | iv = ivec; | ||
| 229 | iv2 = ivec + AES_BLOCK_SIZE; | ||
| 230 | while (len >= AES_BLOCK_SIZE) { | ||
| 231 | for (n = 0; n < AES_BLOCK_SIZE; ++n) | ||
| 232 | out[n] = in[n] ^ iv[n]; | ||
| 233 | AES_encrypt(out, out, key); | ||
| 234 | for (n = 0; n < AES_BLOCK_SIZE; ++n) | ||
| 235 | out[n] ^= iv2[n]; | ||
| 236 | iv = out; | ||
| 237 | memcpy(prev, in, AES_BLOCK_SIZE); | ||
| 238 | iv2 = prev; | ||
| 239 | len -= AES_BLOCK_SIZE; | ||
| 240 | in += AES_BLOCK_SIZE; | ||
| 241 | out += AES_BLOCK_SIZE; | ||
| 242 | } | ||
| 243 | |||
| 244 | /* And now backwards */ | ||
| 245 | iv = ivec + AES_BLOCK_SIZE*2; | ||
| 246 | iv2 = ivec + AES_BLOCK_SIZE*3; | ||
| 247 | len = length; | ||
| 248 | while (len >= AES_BLOCK_SIZE) { | ||
| 249 | out -= AES_BLOCK_SIZE; | ||
| 250 | /* XXX: reduce copies by alternating between buffers */ | ||
| 251 | memcpy(tmp, out, AES_BLOCK_SIZE); | ||
| 252 | for (n = 0; n < AES_BLOCK_SIZE; ++n) | ||
| 253 | out[n] ^= iv[n]; | ||
| 254 | /* hexdump(stdout, "out ^ iv", out, AES_BLOCK_SIZE); */ | ||
| 255 | AES_encrypt(out, out, key); | ||
| 256 | /* hexdump(stdout,"enc", out, AES_BLOCK_SIZE); */ | ||
| 257 | /* hexdump(stdout,"iv2", iv2, AES_BLOCK_SIZE); */ | ||
| 258 | for (n = 0; n < AES_BLOCK_SIZE; ++n) | ||
| 259 | out[n] ^= iv2[n]; | ||
| 260 | /* hexdump(stdout,"out", out, AES_BLOCK_SIZE); */ | ||
| 261 | iv = out; | ||
| 262 | memcpy(prev, tmp, AES_BLOCK_SIZE); | ||
| 263 | iv2 = prev; | ||
| 264 | len -= AES_BLOCK_SIZE; | ||
| 265 | } | ||
| 266 | } else { | ||
| 267 | /* First backwards */ | ||
| 268 | iv = ivec + AES_BLOCK_SIZE*2; | ||
| 269 | iv2 = ivec + AES_BLOCK_SIZE*3; | ||
| 270 | in += length; | ||
| 271 | out += length; | ||
| 272 | while (len >= AES_BLOCK_SIZE) { | ||
| 273 | in -= AES_BLOCK_SIZE; | ||
| 274 | out -= AES_BLOCK_SIZE; | ||
| 275 | memcpy(tmp, in, AES_BLOCK_SIZE); | ||
| 276 | memcpy(tmp2, in, AES_BLOCK_SIZE); | ||
| 277 | for (n = 0; n < AES_BLOCK_SIZE; ++n) | ||
| 278 | tmp[n] ^= iv2[n]; | ||
| 279 | AES_decrypt(tmp, out, key); | ||
| 280 | for (n = 0; n < AES_BLOCK_SIZE; ++n) | ||
| 281 | out[n] ^= iv[n]; | ||
| 282 | memcpy(tmp3, tmp2, AES_BLOCK_SIZE); | ||
| 283 | iv = tmp3; | ||
| 284 | iv2 = out; | ||
| 285 | len -= AES_BLOCK_SIZE; | ||
| 286 | } | ||
| 287 | |||
| 288 | /* And now forwards */ | ||
| 289 | iv = ivec; | ||
| 290 | iv2 = ivec + AES_BLOCK_SIZE; | ||
| 291 | len = length; | ||
| 292 | while (len >= AES_BLOCK_SIZE) { | ||
| 293 | memcpy(tmp, out, AES_BLOCK_SIZE); | ||
| 294 | memcpy(tmp2, out, AES_BLOCK_SIZE); | ||
| 295 | for (n = 0; n < AES_BLOCK_SIZE; ++n) | ||
| 296 | tmp[n] ^= iv2[n]; | ||
| 297 | AES_decrypt(tmp, out, key); | ||
| 298 | for (n = 0; n < AES_BLOCK_SIZE; ++n) | ||
| 299 | out[n] ^= iv[n]; | ||
| 300 | memcpy(tmp3, tmp2, AES_BLOCK_SIZE); | ||
| 301 | iv = tmp3; | ||
| 302 | iv2 = out; | ||
| 303 | len -= AES_BLOCK_SIZE; | ||
| 304 | in += AES_BLOCK_SIZE; | ||
| 305 | out += AES_BLOCK_SIZE; | ||
| 306 | } | ||
| 307 | } | ||
| 308 | } | ||
