From ba5e36dbc0321270f06c4aad79e296e4cce1212b Mon Sep 17 00:00:00 2001 From: Pekka Riikonen Date: Mon, 9 Oct 2000 11:37:21 +0000 Subject: [PATCH] bugfixes. Made public/private keys protocol compliant. --- lib/silccrypt/rsa.c | 82 ++++++++++++++++++-------------------- lib/silccrypt/silccipher.c | 5 ++- lib/silccrypt/silcpkcs.c | 7 ++-- 3 files changed, 47 insertions(+), 47 deletions(-) diff --git a/lib/silccrypt/rsa.c b/lib/silccrypt/rsa.c index 730ec263..ec85853a 100644 --- a/lib/silccrypt/rsa.c +++ b/lib/silccrypt/rsa.c @@ -43,6 +43,7 @@ * everything else too about cryptography. * */ +/* $Id$ */ #include "silcincludes.h" #include "rsa.h" @@ -111,29 +112,27 @@ SILC_PKCS_API_GET_PUBLIC_KEY(rsa) RsaKey *key = (RsaKey *)context; unsigned char *e, *n, *ret; unsigned int e_len, n_len; - unsigned char tmp[2]; + unsigned char tmp[4]; e = silc_mp_mp2bin(&key->e, &e_len); n = silc_mp_mp2bin(&key->n, &n_len); - *ret_len = e_len + 2 + n_len + 2; + *ret_len = e_len + 4 + n_len + 4; ret = silc_calloc(*ret_len, sizeof(unsigned char)); /* Put the length of the e. */ - tmp[0] = e_len >> 8; - tmp[1] = e_len; - memcpy(ret, tmp, 2); + SILC_PUT32_MSB(e_len, tmp); + memcpy(ret, tmp, 4); /* Put the e. */ - memcpy(ret + 2, e, e_len); + memcpy(ret + 4, e, e_len); /* Put the length of the n. */ - tmp[0] = n_len >> 8; - tmp[1] = n_len; - memcpy(ret + 2 + e_len, tmp, 2); + SILC_PUT32_MSB(n_len, tmp); + memcpy(ret + 4 + e_len, tmp, 4); /* Put the n. */ - memcpy(ret + 2 + e_len + 2, n, n_len); + memcpy(ret + 4 + e_len + 4, n, n_len); memset(e, 0, e_len); memset(n, 0, n_len); @@ -152,38 +151,35 @@ SILC_PKCS_API_GET_PRIVATE_KEY(rsa) RsaKey *key = (RsaKey *)context; unsigned char *e, *n, *d, *ret; unsigned int e_len, n_len, d_len; - unsigned char tmp[2]; + unsigned char tmp[4]; e = silc_mp_mp2bin(&key->e, &e_len); n = silc_mp_mp2bin(&key->n, &n_len); d = silc_mp_mp2bin(&key->d, &d_len); - *ret_len = e_len + 2 + n_len + 2 + d_len + 2; + *ret_len = e_len + 4 + n_len + 4 + d_len + 4; ret = silc_calloc(*ret_len, sizeof(unsigned char)); /* Put the length of the e. */ - tmp[0] = e_len >> 8; - tmp[1] = e_len; - memcpy(ret, tmp, 2); + SILC_PUT32_MSB(e_len, tmp); + memcpy(ret, tmp, 4); /* Put the e. */ - memcpy(ret + 2, e, e_len); + memcpy(ret + 4, e, e_len); /* Put the length of the n. */ - tmp[0] = n_len >> 8; - tmp[1] = n_len; - memcpy(ret + 2 + e_len, tmp, 2); + SILC_PUT32_MSB(n_len, tmp); + memcpy(ret + 4 + e_len, tmp, 4); /* Put the n. */ - memcpy(ret + 2 + e_len + 2, n, n_len); + memcpy(ret + 4 + e_len + 4, n, n_len); /* Put the length of the d. */ - tmp[0] = d_len >> 8; - tmp[1] = d_len; - memcpy(ret + 2 + e_len + 2 + n_len, tmp, 2); + SILC_PUT32_MSB(d_len, tmp); + memcpy(ret + 4 + e_len + 4 + n_len, tmp, 4); /* Put the n. */ - memcpy(ret + 2 + e_len + 2 + n_len + 2, d, d_len); + memcpy(ret + 4 + e_len + 4 + n_len + 4, d, d_len); memset(e, 0, e_len); memset(n, 0, n_len); @@ -200,31 +196,31 @@ SILC_PKCS_API_GET_PRIVATE_KEY(rsa) SILC_PKCS_API_SET_PUBLIC_KEY(rsa) { RsaKey *key = (RsaKey *)context; - unsigned char tmp[2]; - unsigned short e_len, n_len; + unsigned char tmp[4]; + unsigned int e_len, n_len; silc_mp_init(&key->e); silc_mp_init(&key->n); - memcpy(tmp, key_data, 2); - e_len = ((unsigned int)tmp[0] << 8) | ((unsigned int)tmp[1]); + memcpy(tmp, key_data, 4); + SILC_GET32_MSB(e_len, tmp); if (e_len > key_len) { silc_mp_clear(&key->e); silc_mp_clear(&key->n); return FALSE; } - silc_mp_bin2mp(key_data + 2, e_len, &key->e); + silc_mp_bin2mp(key_data + 4, e_len, &key->e); - memcpy(tmp, key_data + 2 + e_len, 2); - n_len = ((unsigned int)tmp[0] << 8) | ((unsigned int)tmp[1]); + memcpy(tmp, key_data + 4 + e_len, 4); + SILC_GET32_MSB(n_len, tmp); if (e_len + n_len > key_len) { silc_mp_clear(&key->e); silc_mp_clear(&key->n); return FALSE; } - silc_mp_bin2mp(key_data + 2 + e_len + 2, n_len, &key->n); + silc_mp_bin2mp(key_data + 4 + e_len + 4, n_len, &key->n); return TRUE; } @@ -236,42 +232,42 @@ SILC_PKCS_API_SET_PUBLIC_KEY(rsa) SILC_PKCS_API_SET_PRIVATE_KEY(rsa) { RsaKey *key = (RsaKey *)context; - unsigned char tmp[2]; - unsigned short e_len, n_len, d_len; + unsigned char tmp[4]; + unsigned int e_len, n_len, d_len; silc_mp_init(&key->e); silc_mp_init(&key->n); silc_mp_init(&key->d); - memcpy(tmp, key_data, 2); - e_len = ((unsigned int)tmp[0] << 8) | ((unsigned int)tmp[1]); + memcpy(tmp, key_data, 4); + SILC_GET32_MSB(e_len, tmp); if (e_len > key_len) { silc_mp_clear(&key->e); silc_mp_clear(&key->n); return FALSE; } - silc_mp_bin2mp(key_data + 2, e_len, &key->e); + silc_mp_bin2mp(key_data + 4, e_len, &key->e); - memcpy(tmp, key_data + 2 + e_len, 2); - n_len = ((unsigned int)tmp[0] << 8) | ((unsigned int)tmp[1]); + memcpy(tmp, key_data + 4 + e_len, 4); + SILC_GET32_MSB(n_len, tmp); if (e_len + n_len > key_len) { silc_mp_clear(&key->e); silc_mp_clear(&key->n); return FALSE; } - silc_mp_bin2mp(key_data + 2 + e_len + 2, n_len, &key->n); + silc_mp_bin2mp(key_data + 4 + e_len + 4, n_len, &key->n); - memcpy(tmp, key_data + 2 + e_len + 2 + n_len, 2); - d_len = ((unsigned int)tmp[0] << 8) | ((unsigned int)tmp[1]); + memcpy(tmp, key_data + 4 + e_len + 4 + n_len, 4); + SILC_GET32_MSB(d_len, tmp); if (e_len + n_len + d_len > key_len) { silc_mp_clear(&key->e); silc_mp_clear(&key->n); return FALSE; } - silc_mp_bin2mp(key_data + 2 + e_len + 2 + n_len + 2, d_len, &key->d); + silc_mp_bin2mp(key_data + 4 + e_len + 4 + n_len + 4, d_len, &key->d); return TRUE; } diff --git a/lib/silccrypt/silccipher.c b/lib/silccrypt/silccipher.c index 57506141..d98f86d0 100644 --- a/lib/silccrypt/silccipher.c +++ b/lib/silccrypt/silccipher.c @@ -20,6 +20,9 @@ /* * $Id$ * $Log$ + * Revision 1.5 2000/10/09 11:37:21 priikone + * bugfixes. Made public/private keys protocol compliant. + * * Revision 1.4 2000/10/02 18:31:46 priikone * Added rijndael (AES) to cipher list. * @@ -59,7 +62,7 @@ SilcCipherObject silc_cipher_builtin_list[] = { "twofish", 16, 16, silc_twofish_set_key, silc_twofish_set_key_with_string, silc_twofish_encrypt_cbc, silc_twofish_decrypt_cbc, silc_twofish_context_len }, - { "rijndael", 16, 16, silc_rijndael_set_key, + { "aes", 16, 16, silc_rijndael_set_key, silc_rijndael_set_key_with_string, silc_rijndael_encrypt_cbc, silc_rijndael_decrypt_cbc, silc_rijndael_context_len }, { "rc6", 16, 16, silc_rc6_set_key, silc_rc6_set_key_with_string, diff --git a/lib/silccrypt/silcpkcs.c b/lib/silccrypt/silcpkcs.c index e501d274..53981427 100644 --- a/lib/silccrypt/silcpkcs.c +++ b/lib/silccrypt/silcpkcs.c @@ -17,6 +17,7 @@ GNU General Public License for more details. */ +/* $Id$ */ #include "silcincludes.h" @@ -342,7 +343,7 @@ silc_pkcs_public_key_encode(SilcPublicKey public_key, unsigned int *len) SILC_STR_UI_SHORT(strlen(public_key->identifier)), SILC_STR_UI32_STRING(public_key->identifier), SILC_STR_UI_XNSTRING(public_key->pk, - public_key->pk_len), + public_key->pk_len), SILC_STR_END); if (len) *len = public_key->len; @@ -758,7 +759,7 @@ int silc_pkcs_load_public_key(char *filename, SilcPublicKey *public_key, break; } - if (!silc_pkcs_public_key_decode(data, len, public_key)) { + if (!data || !silc_pkcs_public_key_decode(data, len, public_key)) { memset(old, 0, data_len); silc_free(old); return FALSE; @@ -810,7 +811,7 @@ int silc_pkcs_load_private_key(char *filename, SilcPrivateKey *private_key, break; } - if (!silc_pkcs_private_key_decode(data, len, private_key)) { + if (!data || !silc_pkcs_private_key_decode(data, len, private_key)) { memset(old, 0, data_len); silc_free(old); return FALSE; -- 2.24.0