Fix from HEAD.

This commit is contained in:
Dr. Stephen Henson 2006-08-31 21:01:41 +00:00
parent 340b4dd7df
commit f4f1dc39e0
3 changed files with 66 additions and 60 deletions

View File

@ -49,7 +49,7 @@
* *
*/ */
#include <assert.h> #include "cryptlib.h"
#include <openssl/aes.h> #include <openssl/aes.h>
#include "aes_locl.h" #include "aes_locl.h"
@ -84,9 +84,9 @@ void AES_ige_encrypt(const unsigned char *in, unsigned char *out,
const unsigned char *iv = ivec; const unsigned char *iv = ivec;
const unsigned char *iv2 = ivec + AES_BLOCK_SIZE; const unsigned char *iv2 = ivec + AES_BLOCK_SIZE;
assert(in && out && key && ivec); OPENSSL_assert(in && out && key && ivec);
assert((AES_ENCRYPT == enc)||(AES_DECRYPT == enc)); OPENSSL_assert((AES_ENCRYPT == enc)||(AES_DECRYPT == enc));
assert((length%AES_BLOCK_SIZE) == 0); OPENSSL_assert((length%AES_BLOCK_SIZE) == 0);
if (AES_ENCRYPT == enc) if (AES_ENCRYPT == enc)
{ {
@ -94,17 +94,17 @@ void AES_ige_encrypt(const unsigned char *in, unsigned char *out,
check for overlap, too) */ check for overlap, too) */
while (len >= AES_BLOCK_SIZE) while (len >= AES_BLOCK_SIZE)
{ {
// hexdump(stdout, "in", in, AES_BLOCK_SIZE); /* hexdump(stdout, "in", in, AES_BLOCK_SIZE); */
// hexdump(stdout, "iv", iv, AES_BLOCK_SIZE); /* hexdump(stdout, "iv", iv, AES_BLOCK_SIZE); */
for(n=0 ; n < AES_BLOCK_SIZE ; ++n) for(n=0 ; n < AES_BLOCK_SIZE ; ++n)
out[n] = in[n] ^ iv[n]; out[n] = in[n] ^ iv[n];
// hexdump(stdout, "in ^ iv", out, AES_BLOCK_SIZE); /* hexdump(stdout, "in ^ iv", out, AES_BLOCK_SIZE); */
AES_encrypt(out, out, key); AES_encrypt(out, out, key);
// hexdump(stdout,"enc", out, AES_BLOCK_SIZE); /* hexdump(stdout,"enc", out, AES_BLOCK_SIZE); */
// hexdump(stdout,"iv2", iv2, AES_BLOCK_SIZE); /* hexdump(stdout,"iv2", iv2, AES_BLOCK_SIZE); */
for(n=0 ; n < AES_BLOCK_SIZE ; ++n) for(n=0 ; n < AES_BLOCK_SIZE ; ++n)
out[n] ^= iv2[n]; out[n] ^= iv2[n];
// hexdump(stdout,"out", out, AES_BLOCK_SIZE); /* hexdump(stdout,"out", out, AES_BLOCK_SIZE); */
iv = out; iv = out;
memcpy(prev, in, AES_BLOCK_SIZE); memcpy(prev, in, AES_BLOCK_SIZE);
iv2 = prev; iv2 = prev;
@ -121,17 +121,17 @@ void AES_ige_encrypt(const unsigned char *in, unsigned char *out,
{ {
memcpy(tmp, in, AES_BLOCK_SIZE); memcpy(tmp, in, AES_BLOCK_SIZE);
memcpy(tmp2, in, AES_BLOCK_SIZE); memcpy(tmp2, in, AES_BLOCK_SIZE);
// hexdump(stdout, "in", in, AES_BLOCK_SIZE); /* hexdump(stdout, "in", in, AES_BLOCK_SIZE); */
// hexdump(stdout, "iv2", iv2, AES_BLOCK_SIZE); /* hexdump(stdout, "iv2", iv2, AES_BLOCK_SIZE); */
for(n=0 ; n < AES_BLOCK_SIZE ; ++n) for(n=0 ; n < AES_BLOCK_SIZE ; ++n)
tmp[n] ^= iv2[n]; tmp[n] ^= iv2[n];
// hexdump(stdout, "in ^ iv2", tmp, AES_BLOCK_SIZE); /* hexdump(stdout, "in ^ iv2", tmp, AES_BLOCK_SIZE); */
AES_decrypt(tmp, out, key); AES_decrypt(tmp, out, key);
// hexdump(stdout, "dec", out, AES_BLOCK_SIZE); /* hexdump(stdout, "dec", out, AES_BLOCK_SIZE); */
// hexdump(stdout, "iv", ivec, AES_BLOCK_SIZE); /* hexdump(stdout, "iv", ivec, AES_BLOCK_SIZE); */
for(n=0 ; n < AES_BLOCK_SIZE ; ++n) for(n=0 ; n < AES_BLOCK_SIZE ; ++n)
out[n] ^= ivec[n]; out[n] ^= ivec[n];
// hexdump(stdout, "out", out, AES_BLOCK_SIZE); /* hexdump(stdout, "out", out, AES_BLOCK_SIZE); */
memcpy(ivec, tmp2, AES_BLOCK_SIZE); memcpy(ivec, tmp2, AES_BLOCK_SIZE);
iv2 = out; iv2 = out;
len -= AES_BLOCK_SIZE; len -= AES_BLOCK_SIZE;
@ -163,9 +163,9 @@ void AES_bi_ige_encrypt(const unsigned char *in, unsigned char *out,
const unsigned char *iv; const unsigned char *iv;
const unsigned char *iv2; const unsigned char *iv2;
assert(in && out && key && ivec); OPENSSL_assert(in && out && key && ivec);
assert((AES_ENCRYPT == enc)||(AES_DECRYPT == enc)); OPENSSL_assert((AES_ENCRYPT == enc)||(AES_DECRYPT == enc));
assert((length%AES_BLOCK_SIZE) == 0); OPENSSL_assert((length%AES_BLOCK_SIZE) == 0);
if (AES_ENCRYPT == enc) if (AES_ENCRYPT == enc)
{ {
@ -177,17 +177,17 @@ void AES_bi_ige_encrypt(const unsigned char *in, unsigned char *out,
iv2 = ivec + AES_BLOCK_SIZE; iv2 = ivec + AES_BLOCK_SIZE;
while (len >= AES_BLOCK_SIZE) while (len >= AES_BLOCK_SIZE)
{ {
// hexdump(stdout, "in", in, AES_BLOCK_SIZE); /* hexdump(stdout, "in", in, AES_BLOCK_SIZE); */
// hexdump(stdout, "iv", iv, AES_BLOCK_SIZE); /* hexdump(stdout, "iv", iv, AES_BLOCK_SIZE); */
for(n=0 ; n < AES_BLOCK_SIZE ; ++n) for(n=0 ; n < AES_BLOCK_SIZE ; ++n)
out[n] = in[n] ^ iv[n]; out[n] = in[n] ^ iv[n];
// hexdump(stdout, "in ^ iv", out, AES_BLOCK_SIZE); /* hexdump(stdout, "in ^ iv", out, AES_BLOCK_SIZE); */
AES_encrypt(out, out, key); AES_encrypt(out, out, key);
// hexdump(stdout,"enc", out, AES_BLOCK_SIZE); /* hexdump(stdout,"enc", out, AES_BLOCK_SIZE); */
// hexdump(stdout,"iv2", iv2, AES_BLOCK_SIZE); /* hexdump(stdout,"iv2", iv2, AES_BLOCK_SIZE); */
for(n=0 ; n < AES_BLOCK_SIZE ; ++n) for(n=0 ; n < AES_BLOCK_SIZE ; ++n)
out[n] ^= iv2[n]; out[n] ^= iv2[n];
// hexdump(stdout,"out", out, AES_BLOCK_SIZE); /* hexdump(stdout,"out", out, AES_BLOCK_SIZE); */
iv = out; iv = out;
memcpy(prev, in, AES_BLOCK_SIZE); memcpy(prev, in, AES_BLOCK_SIZE);
iv2 = prev; iv2 = prev;
@ -203,19 +203,19 @@ void AES_bi_ige_encrypt(const unsigned char *in, unsigned char *out,
while(len >= AES_BLOCK_SIZE) while(len >= AES_BLOCK_SIZE)
{ {
out -= AES_BLOCK_SIZE; out -= AES_BLOCK_SIZE;
// hexdump(stdout, "intermediate", out, AES_BLOCK_SIZE); /* hexdump(stdout, "intermediate", out, AES_BLOCK_SIZE); */
// hexdump(stdout, "iv", iv, AES_BLOCK_SIZE); /* hexdump(stdout, "iv", iv, AES_BLOCK_SIZE); */
// XXX: reduce copies by alternating between buffers /* XXX: reduce copies by alternating between buffers */
memcpy(tmp, out, AES_BLOCK_SIZE); memcpy(tmp, out, AES_BLOCK_SIZE);
for(n=0 ; n < AES_BLOCK_SIZE ; ++n) for(n=0 ; n < AES_BLOCK_SIZE ; ++n)
out[n] ^= iv[n]; out[n] ^= iv[n];
// hexdump(stdout, "out ^ iv", out, AES_BLOCK_SIZE); /* hexdump(stdout, "out ^ iv", out, AES_BLOCK_SIZE); */
AES_encrypt(out, out, key); AES_encrypt(out, out, key);
// hexdump(stdout,"enc", out, AES_BLOCK_SIZE); /* hexdump(stdout,"enc", out, AES_BLOCK_SIZE); */
// hexdump(stdout,"iv2", iv2, AES_BLOCK_SIZE); /* hexdump(stdout,"iv2", iv2, AES_BLOCK_SIZE); */
for(n=0 ; n < AES_BLOCK_SIZE ; ++n) for(n=0 ; n < AES_BLOCK_SIZE ; ++n)
out[n] ^= iv2[n]; out[n] ^= iv2[n];
// hexdump(stdout,"out", out, AES_BLOCK_SIZE); /* hexdump(stdout,"out", out, AES_BLOCK_SIZE); */
iv = out; iv = out;
memcpy(prev, tmp, AES_BLOCK_SIZE); memcpy(prev, tmp, AES_BLOCK_SIZE);
iv2 = prev; iv2 = prev;
@ -235,17 +235,17 @@ void AES_bi_ige_encrypt(const unsigned char *in, unsigned char *out,
out -= AES_BLOCK_SIZE; out -= AES_BLOCK_SIZE;
memcpy(tmp, in, AES_BLOCK_SIZE); memcpy(tmp, in, AES_BLOCK_SIZE);
memcpy(tmp2, in, AES_BLOCK_SIZE); memcpy(tmp2, in, AES_BLOCK_SIZE);
// hexdump(stdout, "in", in, AES_BLOCK_SIZE); /* hexdump(stdout, "in", in, AES_BLOCK_SIZE); */
// hexdump(stdout, "iv2", iv2, AES_BLOCK_SIZE); /* hexdump(stdout, "iv2", iv2, AES_BLOCK_SIZE); */
for(n=0 ; n < AES_BLOCK_SIZE ; ++n) for(n=0 ; n < AES_BLOCK_SIZE ; ++n)
tmp[n] ^= iv2[n]; tmp[n] ^= iv2[n];
// hexdump(stdout, "in ^ iv2", tmp, AES_BLOCK_SIZE); /* hexdump(stdout, "in ^ iv2", tmp, AES_BLOCK_SIZE); */
AES_decrypt(tmp, out, key); AES_decrypt(tmp, out, key);
// hexdump(stdout, "dec", out, AES_BLOCK_SIZE); /* hexdump(stdout, "dec", out, AES_BLOCK_SIZE); */
// hexdump(stdout, "iv", iv, AES_BLOCK_SIZE); /* hexdump(stdout, "iv", iv, AES_BLOCK_SIZE); */
for(n=0 ; n < AES_BLOCK_SIZE ; ++n) for(n=0 ; n < AES_BLOCK_SIZE ; ++n)
out[n] ^= iv[n]; out[n] ^= iv[n];
// hexdump(stdout, "out", out, AES_BLOCK_SIZE); /* hexdump(stdout, "out", out, AES_BLOCK_SIZE); */
memcpy(tmp3, tmp2, AES_BLOCK_SIZE); memcpy(tmp3, tmp2, AES_BLOCK_SIZE);
iv = tmp3; iv = tmp3;
iv2 = out; iv2 = out;
@ -260,17 +260,17 @@ void AES_bi_ige_encrypt(const unsigned char *in, unsigned char *out,
{ {
memcpy(tmp, out, AES_BLOCK_SIZE); memcpy(tmp, out, AES_BLOCK_SIZE);
memcpy(tmp2, out, AES_BLOCK_SIZE); memcpy(tmp2, out, AES_BLOCK_SIZE);
// hexdump(stdout, "intermediate", out, AES_BLOCK_SIZE); /* hexdump(stdout, "intermediate", out, AES_BLOCK_SIZE); */
// hexdump(stdout, "iv2", iv2, AES_BLOCK_SIZE); /* hexdump(stdout, "iv2", iv2, AES_BLOCK_SIZE); */
for(n=0 ; n < AES_BLOCK_SIZE ; ++n) for(n=0 ; n < AES_BLOCK_SIZE ; ++n)
tmp[n] ^= iv2[n]; tmp[n] ^= iv2[n];
// hexdump(stdout, "out ^ iv2", tmp, AES_BLOCK_SIZE); /* hexdump(stdout, "out ^ iv2", tmp, AES_BLOCK_SIZE); */
AES_decrypt(tmp, out, key); AES_decrypt(tmp, out, key);
// hexdump(stdout, "dec", out, AES_BLOCK_SIZE); /* hexdump(stdout, "dec", out, AES_BLOCK_SIZE); */
// hexdump(stdout, "iv", ivec, AES_BLOCK_SIZE); /* hexdump(stdout, "iv", ivec, AES_BLOCK_SIZE); */
for(n=0 ; n < AES_BLOCK_SIZE ; ++n) for(n=0 ; n < AES_BLOCK_SIZE ; ++n)
out[n] ^= iv[n]; out[n] ^= iv[n];
// hexdump(stdout, "out", out, AES_BLOCK_SIZE); /* hexdump(stdout, "out", out, AES_BLOCK_SIZE); */
memcpy(tmp3, tmp2, AES_BLOCK_SIZE); memcpy(tmp3, tmp2, AES_BLOCK_SIZE);
iv = tmp3; iv = tmp3;
iv2 = out; iv2 = out;

View File

@ -122,4 +122,10 @@ static int camellia_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
return 1; return 1;
} }
#else
# ifdef PEDANTIC
static void *dummy=&dummy;
# endif
#endif #endif

View File

@ -285,9 +285,9 @@ int main(int argc, char **argv)
RAND_pseudo_bytes(iv, sizeof iv); RAND_pseudo_bytes(iv, sizeof iv);
memcpy(saved_iv, iv, sizeof saved_iv); memcpy(saved_iv, iv, sizeof saved_iv);
// Forward IGE only... /* Forward IGE only... */
// Straight encrypt/decrypt /* Straight encrypt/decrypt */
AES_set_encrypt_key(rkey, 8*sizeof rkey, &key); AES_set_encrypt_key(rkey, 8*sizeof rkey, &key);
AES_ige_encrypt(plaintext, ciphertext, TEST_SIZE, &key, iv, AES_ige_encrypt(plaintext, ciphertext, TEST_SIZE, &key, iv,
AES_ENCRYPT); AES_ENCRYPT);
@ -305,7 +305,7 @@ int main(int argc, char **argv)
++err; ++err;
} }
// Now check encrypt chaining works /* Now check encrypt chaining works */
AES_set_encrypt_key(rkey, 8*sizeof rkey, &key); AES_set_encrypt_key(rkey, 8*sizeof rkey, &key);
memcpy(iv, saved_iv, sizeof iv); memcpy(iv, saved_iv, sizeof iv);
AES_ige_encrypt(plaintext, ciphertext, TEST_SIZE/2, &key, iv, AES_ige_encrypt(plaintext, ciphertext, TEST_SIZE/2, &key, iv,
@ -327,7 +327,7 @@ int main(int argc, char **argv)
++err; ++err;
} }
// And check decrypt chaining /* And check decrypt chaining */
AES_set_encrypt_key(rkey, 8*sizeof rkey, &key); AES_set_encrypt_key(rkey, 8*sizeof rkey, &key);
memcpy(iv, saved_iv, sizeof iv); memcpy(iv, saved_iv, sizeof iv);
AES_ige_encrypt(plaintext, ciphertext, TEST_SIZE/2, &key, iv, AES_ige_encrypt(plaintext, ciphertext, TEST_SIZE/2, &key, iv,
@ -352,13 +352,13 @@ int main(int argc, char **argv)
++err; ++err;
} }
// make sure garble extends forwards only /* make sure garble extends forwards only */
AES_set_encrypt_key(rkey, 8*sizeof rkey, &key); AES_set_encrypt_key(rkey, 8*sizeof rkey, &key);
memcpy(iv, saved_iv, sizeof iv); memcpy(iv, saved_iv, sizeof iv);
AES_ige_encrypt(plaintext, ciphertext, sizeof plaintext, &key, iv, AES_ige_encrypt(plaintext, ciphertext, sizeof plaintext, &key, iv,
AES_ENCRYPT); AES_ENCRYPT);
// corrupt halfway through /* corrupt halfway through */
++ciphertext[sizeof ciphertext/2]; ++ciphertext[sizeof ciphertext/2];
AES_set_decrypt_key(rkey, 8*sizeof rkey, &key); AES_set_decrypt_key(rkey, 8*sizeof rkey, &key);
memcpy(iv, saved_iv, sizeof iv); memcpy(iv, saved_iv, sizeof iv);
@ -382,14 +382,14 @@ int main(int argc, char **argv)
++err; ++err;
} }
// Bi-directional IGE /* Bi-directional IGE */
// Note that we don't have to recover the IV, because chaining isn't /* Note that we don't have to recover the IV, because chaining isn't */
// possible with biIGE, so the IV is not updated. /* possible with biIGE, so the IV is not updated. */
RAND_pseudo_bytes(rkey2, sizeof rkey2); RAND_pseudo_bytes(rkey2, sizeof rkey2);
// Straight encrypt/decrypt /* Straight encrypt/decrypt */
AES_set_encrypt_key(rkey, 8*sizeof rkey, &key); AES_set_encrypt_key(rkey, 8*sizeof rkey, &key);
AES_set_encrypt_key(rkey2, 8*sizeof rkey2, &key2); AES_set_encrypt_key(rkey2, 8*sizeof rkey2, &key2);
AES_bi_ige_encrypt(plaintext, ciphertext, TEST_SIZE, &key, &key2, iv, AES_bi_ige_encrypt(plaintext, ciphertext, TEST_SIZE, &key, &key2, iv,
@ -408,13 +408,13 @@ int main(int argc, char **argv)
++err; ++err;
} }
// make sure garble extends both ways /* make sure garble extends both ways */
AES_set_encrypt_key(rkey, 8*sizeof rkey, &key); AES_set_encrypt_key(rkey, 8*sizeof rkey, &key);
AES_set_encrypt_key(rkey2, 8*sizeof rkey2, &key2); AES_set_encrypt_key(rkey2, 8*sizeof rkey2, &key2);
AES_ige_encrypt(plaintext, ciphertext, sizeof plaintext, &key, iv, AES_ige_encrypt(plaintext, ciphertext, sizeof plaintext, &key, iv,
AES_ENCRYPT); AES_ENCRYPT);
// corrupt halfway through /* corrupt halfway through */
++ciphertext[sizeof ciphertext/2]; ++ciphertext[sizeof ciphertext/2];
AES_set_decrypt_key(rkey, 8*sizeof rkey, &key); AES_set_decrypt_key(rkey, 8*sizeof rkey, &key);
AES_set_decrypt_key(rkey2, 8*sizeof rkey2, &key2); AES_set_decrypt_key(rkey2, 8*sizeof rkey2, &key2);
@ -432,13 +432,13 @@ int main(int argc, char **argv)
++err; ++err;
} }
// make sure garble extends both ways (2) /* make sure garble extends both ways (2) */
AES_set_encrypt_key(rkey, 8*sizeof rkey, &key); AES_set_encrypt_key(rkey, 8*sizeof rkey, &key);
AES_set_encrypt_key(rkey2, 8*sizeof rkey2, &key2); AES_set_encrypt_key(rkey2, 8*sizeof rkey2, &key2);
AES_ige_encrypt(plaintext, ciphertext, sizeof plaintext, &key, iv, AES_ige_encrypt(plaintext, ciphertext, sizeof plaintext, &key, iv,
AES_ENCRYPT); AES_ENCRYPT);
// corrupt right at the end /* corrupt right at the end */
++ciphertext[sizeof ciphertext-1]; ++ciphertext[sizeof ciphertext-1];
AES_set_decrypt_key(rkey, 8*sizeof rkey, &key); AES_set_decrypt_key(rkey, 8*sizeof rkey, &key);
AES_set_decrypt_key(rkey2, 8*sizeof rkey2, &key2); AES_set_decrypt_key(rkey2, 8*sizeof rkey2, &key2);
@ -456,13 +456,13 @@ int main(int argc, char **argv)
++err; ++err;
} }
// make sure garble extends both ways (3) /* make sure garble extends both ways (3) */
AES_set_encrypt_key(rkey, 8*sizeof rkey, &key); AES_set_encrypt_key(rkey, 8*sizeof rkey, &key);
AES_set_encrypt_key(rkey2, 8*sizeof rkey2, &key2); AES_set_encrypt_key(rkey2, 8*sizeof rkey2, &key2);
AES_ige_encrypt(plaintext, ciphertext, sizeof plaintext, &key, iv, AES_ige_encrypt(plaintext, ciphertext, sizeof plaintext, &key, iv,
AES_ENCRYPT); AES_ENCRYPT);
// corrupt right at the start /* corrupt right at the start */
++ciphertext[0]; ++ciphertext[0];
AES_set_decrypt_key(rkey, 8*sizeof rkey, &key); AES_set_decrypt_key(rkey, 8*sizeof rkey, &key);
AES_set_decrypt_key(rkey2, 8*sizeof rkey2, &key2); AES_set_decrypt_key(rkey2, 8*sizeof rkey2, &key2);