Merge branch 'fix/135' into develop
This commit is contained in:
commit
797031170d
@ -609,7 +609,7 @@ As of this release the current cipher\_descriptors elements are the following:
|
|||||||
\hline \textbf{Name} & \textbf{Descriptor Name} & \textbf{Block Size} & \textbf{Key Range} & \textbf{Rounds} \\
|
\hline \textbf{Name} & \textbf{Descriptor Name} & \textbf{Block Size} & \textbf{Key Range} & \textbf{Rounds} \\
|
||||||
\hline Blowfish & blowfish\_desc & 8 & 8 $\ldots$ 56 & 16 \\
|
\hline Blowfish & blowfish\_desc & 8 & 8 $\ldots$ 56 & 16 \\
|
||||||
\hline X-Tea & xtea\_desc & 8 & 16 & 32 \\
|
\hline X-Tea & xtea\_desc & 8 & 16 & 32 \\
|
||||||
\hline RC2 & rc2\_desc & 8 & 8 $\ldots$ 128 & 16 \\
|
\hline RC2 & rc2\_desc & 8 & 5 $\ldots$ 128 & 16 \\
|
||||||
\hline RC5-32/12/b & rc5\_desc & 8 & 8 $\ldots$ 128 & 12 $\ldots$ 24 \\
|
\hline RC5-32/12/b & rc5\_desc & 8 & 8 $\ldots$ 128 & 12 $\ldots$ 24 \\
|
||||||
\hline RC6-32/20/b & rc6\_desc & 16 & 8 $\ldots$ 128 & 20 \\
|
\hline RC6-32/20/b & rc6\_desc & 16 & 8 $\ldots$ 128 & 20 \\
|
||||||
\hline SAFER+ & saferp\_desc &16 & 16, 24, 32 & 8, 12, 16 \\
|
\hline SAFER+ & saferp\_desc &16 & 16, 24, 32 & 8, 12, 16 \\
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
@file rc2.c
|
@file rc2.c
|
||||||
Implementation of LTC_RC2
|
Implementation of RC2 with fixed effective key length of 64bits
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef LTC_RC2
|
#ifdef LTC_RC2
|
||||||
@ -60,26 +60,30 @@ static const unsigned char permute[256] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Initialize the LTC_RC2 block cipher
|
Initialize the RC2 block cipher
|
||||||
@param key The symmetric key you wish to pass
|
@param key The symmetric key you wish to pass
|
||||||
@param keylen The key length in bytes
|
@param keylen The key length in bytes
|
||||||
|
@param bits The effective key length in bits
|
||||||
@param num_rounds The number of rounds desired (0 for default)
|
@param num_rounds The number of rounds desired (0 for default)
|
||||||
@param skey The key in as scheduled by this function.
|
@param skey The key in as scheduled by this function.
|
||||||
@return CRYPT_OK if successful
|
@return CRYPT_OK if successful
|
||||||
*/
|
*/
|
||||||
int rc2_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey)
|
int rc2_setup_ex(const unsigned char *key, int keylen, int bits, int num_rounds, symmetric_key *skey)
|
||||||
{
|
{
|
||||||
unsigned *xkey = skey->rc2.xkey;
|
unsigned *xkey = skey->rc2.xkey;
|
||||||
unsigned char tmp[128];
|
unsigned char tmp[128];
|
||||||
unsigned T8, TM;
|
unsigned T8, TM;
|
||||||
int i, bits;
|
int i;
|
||||||
|
|
||||||
LTC_ARGCHK(key != NULL);
|
LTC_ARGCHK(key != NULL);
|
||||||
LTC_ARGCHK(skey != NULL);
|
LTC_ARGCHK(skey != NULL);
|
||||||
|
|
||||||
if (keylen < 8 || keylen > 128) {
|
if (keylen == 0 || keylen > 128 || bits > 1024) {
|
||||||
return CRYPT_INVALID_KEYSIZE;
|
return CRYPT_INVALID_KEYSIZE;
|
||||||
}
|
}
|
||||||
|
if (bits == 0) {
|
||||||
|
bits = 1024;
|
||||||
|
}
|
||||||
|
|
||||||
if (num_rounds != 0 && num_rounds != 16) {
|
if (num_rounds != 0 && num_rounds != 16) {
|
||||||
return CRYPT_INVALID_ROUNDS;
|
return CRYPT_INVALID_ROUNDS;
|
||||||
@ -97,7 +101,6 @@ int rc2_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_ke
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Phase 2 - reduce effective key size to "bits" */
|
/* Phase 2 - reduce effective key size to "bits" */
|
||||||
bits = keylen<<3;
|
|
||||||
T8 = (unsigned)(bits+7)>>3;
|
T8 = (unsigned)(bits+7)>>3;
|
||||||
TM = (255 >> (unsigned)(7 & -bits));
|
TM = (255 >> (unsigned)(7 & -bits));
|
||||||
tmp[128 - T8] = permute[tmp[128 - T8] & TM];
|
tmp[128 - T8] = permute[tmp[128 - T8] & TM];
|
||||||
@ -117,11 +120,27 @@ int rc2_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_ke
|
|||||||
return CRYPT_OK;
|
return CRYPT_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Initialize the RC2 block cipher
|
||||||
|
|
||||||
|
The effective key length is here always keylen * 8
|
||||||
|
|
||||||
|
@param key The symmetric key you wish to pass
|
||||||
|
@param keylen The key length in bytes
|
||||||
|
@param num_rounds The number of rounds desired (0 for default)
|
||||||
|
@param skey The key in as scheduled by this function.
|
||||||
|
@return CRYPT_OK if successful
|
||||||
|
*/
|
||||||
|
int rc2_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey)
|
||||||
|
{
|
||||||
|
return rc2_setup_ex(key, keylen, keylen * 8, num_rounds, skey);
|
||||||
|
}
|
||||||
|
|
||||||
/**********************************************************************\
|
/**********************************************************************\
|
||||||
* Encrypt an 8-byte block of plaintext using the given key. *
|
* Encrypt an 8-byte block of plaintext using the given key. *
|
||||||
\**********************************************************************/
|
\**********************************************************************/
|
||||||
/**
|
/**
|
||||||
Encrypts a block of text with LTC_RC2
|
Encrypts a block of text with RC2
|
||||||
@param pt The input plaintext (8 bytes)
|
@param pt The input plaintext (8 bytes)
|
||||||
@param ct The output ciphertext (8 bytes)
|
@param ct The output ciphertext (8 bytes)
|
||||||
@param skey The key as scheduled
|
@param skey The key as scheduled
|
||||||
@ -199,7 +218,7 @@ int rc2_ecb_encrypt( const unsigned char *pt,
|
|||||||
* Decrypt an 8-byte block of ciphertext using the given key. *
|
* Decrypt an 8-byte block of ciphertext using the given key. *
|
||||||
\**********************************************************************/
|
\**********************************************************************/
|
||||||
/**
|
/**
|
||||||
Decrypts a block of text with LTC_RC2
|
Decrypts a block of text with RC2
|
||||||
@param ct The input ciphertext (8 bytes)
|
@param ct The input ciphertext (8 bytes)
|
||||||
@param pt The output plaintext (8 bytes)
|
@param pt The output plaintext (8 bytes)
|
||||||
@param skey The key as scheduled
|
@param skey The key as scheduled
|
||||||
@ -275,7 +294,7 @@ int rc2_ecb_decrypt( const unsigned char *ct,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Performs a self-test of the LTC_RC2 block cipher
|
Performs a self-test of the RC2 block cipher
|
||||||
@return CRYPT_OK if functional, CRYPT_NOP if self-test has been disabled
|
@return CRYPT_OK if functional, CRYPT_NOP if self-test has been disabled
|
||||||
*/
|
*/
|
||||||
int rc2_test(void)
|
int rc2_test(void)
|
||||||
@ -284,18 +303,47 @@ int rc2_test(void)
|
|||||||
return CRYPT_NOP;
|
return CRYPT_NOP;
|
||||||
#else
|
#else
|
||||||
static const struct {
|
static const struct {
|
||||||
int keylen;
|
int keylen, bits;
|
||||||
unsigned char key[16], pt[8], ct[8];
|
unsigned char key[16], pt[8], ct[8];
|
||||||
} tests[] = {
|
} tests[] = {
|
||||||
|
|
||||||
{ 8,
|
{ 8, 63,
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xeb, 0xb7, 0x73, 0xf9, 0x93, 0x27, 0x8e, 0xff }
|
||||||
|
},
|
||||||
|
{ 8, 64,
|
||||||
|
{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
|
||||||
|
{ 0x27, 0x8b, 0x27, 0xe4, 0x2e, 0x2f, 0x0d, 0x49 }
|
||||||
|
},
|
||||||
|
{ 8, 64,
|
||||||
{ 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
{ 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
{ 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
|
{ 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
|
||||||
{ 0x30, 0x64, 0x9e, 0xdf, 0x9b, 0xe7, 0xd2, 0xc2 }
|
{ 0x30, 0x64, 0x9e, 0xdf, 0x9b, 0xe7, 0xd2, 0xc2 }
|
||||||
|
|
||||||
},
|
},
|
||||||
{ 16,
|
{ 1, 64,
|
||||||
|
{ 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x61, 0xa8, 0xa2, 0x44, 0xad, 0xac, 0xcc, 0xf0 }
|
||||||
|
},
|
||||||
|
{ 7, 64,
|
||||||
|
{ 0x88, 0xbc, 0xa9, 0x0e, 0x90, 0x87, 0x5a, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x6c, 0xcf, 0x43, 0x08, 0x97, 0x4c, 0x26, 0x7f }
|
||||||
|
},
|
||||||
|
{ 16, 64,
|
||||||
|
{ 0x88, 0xbc, 0xa9, 0x0e, 0x90, 0x87, 0x5a, 0x7f,
|
||||||
|
0x0f, 0x79, 0xc3, 0x84, 0x62, 0x7b, 0xaf, 0xb2 },
|
||||||
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
|
{ 0x1a, 0x80, 0x7d, 0x27, 0x2b, 0xbe, 0x5d, 0xb1 }
|
||||||
|
},
|
||||||
|
{ 16, 128,
|
||||||
{ 0x88, 0xbc, 0xa9, 0x0e, 0x90, 0x87, 0x5a, 0x7f,
|
{ 0x88, 0xbc, 0xa9, 0x0e, 0x90, 0x87, 0x5a, 0x7f,
|
||||||
0x0f, 0x79, 0xc3, 0x84, 0x62, 0x7b, 0xaf, 0xb2 },
|
0x0f, 0x79, 0xc3, 0x84, 0x62, 0x7b, 0xaf, 0xb2 },
|
||||||
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
|
||||||
@ -308,14 +356,22 @@ int rc2_test(void)
|
|||||||
|
|
||||||
for (x = 0; x < (int)(sizeof(tests) / sizeof(tests[0])); x++) {
|
for (x = 0; x < (int)(sizeof(tests) / sizeof(tests[0])); x++) {
|
||||||
zeromem(tmp, sizeof(tmp));
|
zeromem(tmp, sizeof(tmp));
|
||||||
if ((err = rc2_setup(tests[x].key, tests[x].keylen, 0, &skey)) != CRYPT_OK) {
|
if (tests[x].bits == (tests[x].keylen * 8)) {
|
||||||
return err;
|
if ((err = rc2_setup(tests[x].key, tests[x].keylen, 0, &skey)) != CRYPT_OK) {
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if ((err = rc2_setup_ex(tests[x].key, tests[x].keylen, tests[x].bits, 0, &skey)) != CRYPT_OK) {
|
||||||
|
return err;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
rc2_ecb_encrypt(tests[x].pt, tmp[0], &skey);
|
rc2_ecb_encrypt(tests[x].pt, tmp[0], &skey);
|
||||||
rc2_ecb_decrypt(tmp[0], tmp[1], &skey);
|
rc2_ecb_decrypt(tmp[0], tmp[1], &skey);
|
||||||
|
|
||||||
if (XMEMCMP(tmp[0], tests[x].ct, 8) != 0 || XMEMCMP(tmp[1], tests[x].pt, 8) != 0) {
|
if (compare_testvector(tmp[0], 8, tests[x].ct, 8, "RC2 CT", x) != 0 ||
|
||||||
|
compare_testvector(tmp[1], 8, tests[x].pt, 8, "RC2 PT", x) != 0) {
|
||||||
return CRYPT_FAIL_TESTVECTOR;
|
return CRYPT_FAIL_TESTVECTOR;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -345,7 +401,7 @@ void rc2_done(symmetric_key *skey)
|
|||||||
int rc2_keysize(int *keysize)
|
int rc2_keysize(int *keysize)
|
||||||
{
|
{
|
||||||
LTC_ARGCHK(keysize != NULL);
|
LTC_ARGCHK(keysize != NULL);
|
||||||
if (*keysize < 8) {
|
if (*keysize < 5) {
|
||||||
return CRYPT_INVALID_KEYSIZE;
|
return CRYPT_INVALID_KEYSIZE;
|
||||||
} else if (*keysize > 128) {
|
} else if (*keysize > 128) {
|
||||||
*keysize = 128;
|
*keysize = 128;
|
||||||
|
@ -617,6 +617,7 @@ extern const struct ltc_cipher_descriptor rc6_desc;
|
|||||||
|
|
||||||
#ifdef LTC_RC2
|
#ifdef LTC_RC2
|
||||||
int rc2_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
|
int rc2_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
|
||||||
|
int rc2_setup_ex(const unsigned char *key, int keylen, int bits, int num_rounds, symmetric_key *skey);
|
||||||
int rc2_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey);
|
int rc2_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey);
|
||||||
int rc2_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey);
|
int rc2_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey);
|
||||||
int rc2_test(void);
|
int rc2_test(void);
|
||||||
|
@ -101,7 +101,11 @@ int crc32_test(void);
|
|||||||
|
|
||||||
/* yeah it's not exactly in misc in the library, but in testprof/x86_prof.c */
|
/* yeah it's not exactly in misc in the library, but in testprof/x86_prof.c */
|
||||||
#if defined(LTC_TEST) && defined(LTC_TEST_DBG)
|
#if defined(LTC_TEST) && defined(LTC_TEST_DBG)
|
||||||
void print_hex(const char* what, const void* p, const unsigned long l);
|
void print_hex(const char* what, const void* v, const unsigned long l);
|
||||||
|
int compare_testvector(const void* is, const unsigned long is_len, const void* should, const unsigned long should_len, const char* what, int which);
|
||||||
|
#else
|
||||||
|
#define compare_testvector(is, is_len, should, should_len, what, which) \
|
||||||
|
(((is_len) != (should_len)) || (XMEMCMP((is), (should), (is_len)) != 0))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* $Source$ */
|
/* $Source$ */
|
||||||
|
@ -81,7 +81,9 @@ extern const struct ltc_prng_descriptor no_prng_desc;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
void print_hex(const char* what, const void* v, const unsigned long l);
|
void print_hex(const char* what, const void* v, const unsigned long l);
|
||||||
|
#ifndef compare_testvector
|
||||||
int compare_testvector(const void* is, const unsigned long is_len, const void* should, const unsigned long should_len, const char* what, int which);
|
int compare_testvector(const void* is, const unsigned long is_len, const void* should, const unsigned long should_len, const char* what, int which);
|
||||||
|
#endif
|
||||||
int sorter(const void *a, const void *b);
|
int sorter(const void *a, const void *b);
|
||||||
void tally_results(int type);
|
void tally_results(int type);
|
||||||
ulong64 rdtsc (void);
|
ulong64 rdtsc (void);
|
||||||
|
@ -35,6 +35,7 @@ void print_hex(const char* what, const void* v, const unsigned long l)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef compare_testvector
|
||||||
int compare_testvector(const void* is, const unsigned long is_len, const void* should, const unsigned long should_len, const char* what, int which)
|
int compare_testvector(const void* is, const unsigned long is_len, const void* should, const unsigned long should_len, const char* what, int which)
|
||||||
{
|
{
|
||||||
int res = 0;
|
int res = 0;
|
||||||
@ -51,6 +52,7 @@ int compare_testvector(const void* is, const unsigned long is_len, const void* s
|
|||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
struct list results[100];
|
struct list results[100];
|
||||||
int no_results;
|
int no_results;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user