fix IDEA modular inverse, add CBC tests with random values

This commit is contained in:
Ludovic FLAMENT 2015-09-27 15:05:01 +02:00
parent 71576aef14
commit c7193672a5
2 changed files with 71 additions and 0 deletions

View File

@ -107,6 +107,9 @@ static INLINE word16 idea_invmod(word16 x)
while (d < 0)
d += IDEA_MODULO;
/* d must be < IDEA_MODULO */
d %= IDEA_MODULO;
return (word16)(d & IDEA_MASK);
}

View File

@ -3358,6 +3358,74 @@ int idea_test(void)
return -1;
}
}
/* random test for CBC */
{
WC_RNG rng;
byte key[IDEA_KEY_SIZE], iv[IDEA_BLOCK_SIZE],
rnd[1000], enc[1000], dec[1000];
/* random values */
ret = wc_InitRng(&rng);
if (ret != 0)
return -39;
for (i = 0; i < 1000; i++) {
/* random key */
ret = wc_RNG_GenerateBlock(&rng, key, sizeof(key));
if (ret != 0)
return -40;
/* random iv */
ret = wc_RNG_GenerateBlock(&rng, iv, sizeof(iv));
if (ret != 0)
return -40;
/* random data */
ret = wc_RNG_GenerateBlock(&rng, rnd, sizeof(rnd));
if (ret != 0)
return -41;
/* Set encryption key */
memset(&idea, 0, sizeof(Idea));
ret = wc_IdeaSetKey(&idea, key, IDEA_KEY_SIZE, iv, IDEA_ENCRYPTION);
if (ret != 0) {
printf("wc_IdeaSetKey (enc) failed\n");
return -42;
}
/* Data encryption */
memset(enc, 0, sizeof(enc));
ret = wc_IdeaCbcEncrypt(&idea, enc, rnd, sizeof(rnd));
if (ret != 0) {
printf("wc_IdeaCbcEncrypt failed\n");
return -43;
}
/* Set decryption key */
memset(&idea, 0, sizeof(Idea));
ret = wc_IdeaSetKey(&idea, key, IDEA_KEY_SIZE, iv, IDEA_DECRYPTION);
if (ret != 0) {
printf("wc_IdeaSetKey (enc) failed\n");
return -44;
}
/* Data decryption */
memset(dec, 0, sizeof(dec));
ret = wc_IdeaCbcDecrypt(&idea, dec, enc, sizeof(enc));
if (ret != 0) {
printf("wc_IdeaCbcDecrypt failed\n");
return -45;
}
if (XMEMCMP(rnd, dec, sizeof(rnd))) {
printf("Bad CBC decryption\n");
return -46;
}
}
wc_FreeRng(&rng);
}
return 0;
}