X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilccrypt%2Fpkcs1.c;h=98963739d8565565e05cb5624b4f41107449e0c6;hb=413da0f8686910f5e627393157566ae729ca99c4;hp=970324a556dc604155f2ca2879ba76362c494ff3;hpb=d47a87b03b846e2333ef57b2c0d81f1644992964;p=silc.git diff --git a/lib/silccrypt/pkcs1.c b/lib/silccrypt/pkcs1.c index 970324a5..98963739 100644 --- a/lib/silccrypt/pkcs1.c +++ b/lib/silccrypt/pkcs1.c @@ -105,8 +105,8 @@ typedef enum { * the rules defined in PKCS #1. */ static unsigned char * -RSA_FormatOneBlock(uint32 modulusLen, RSA_BlockType blockType, - unsigned char *data, uint32 data_len) +RSA_FormatOneBlock(SilcUInt32 modulusLen, RSA_BlockType blockType, + unsigned char *data, SilcUInt32 data_len) { unsigned char *block; unsigned char *bp; @@ -164,7 +164,7 @@ RSA_FormatOneBlock(uint32 modulusLen, RSA_BlockType blockType, for (i = 0; i < padLen; i++) { /* Pad with non-zero random data. */ do { - silc_rng_global_get_byte(bp + i); + bp[i] = silc_rng_global_get_byte(); } while (bp[i] == RSA_BLOCK_AFTER_PAD_OCTET); } bp += padLen; @@ -181,10 +181,10 @@ RSA_FormatOneBlock(uint32 modulusLen, RSA_BlockType blockType, } static int -RSA_FormatBlock(unsigned char **result, uint32 *result_len, - uint32 modulusLen, +RSA_FormatBlock(unsigned char **result, SilcUInt32 *result_len, + SilcUInt32 modulusLen, RSA_BlockType blockType, unsigned char *data, - uint32 data_len) + SilcUInt32 data_len) { /* * XXX For now assume that the data length fits in a single @@ -238,14 +238,14 @@ RSA_FormatBlock(unsigned char **result, uint32 *result_len, */ unsigned char * RSA_DecodeOneBlock(unsigned char *data, - uint32 modulusLen, - uint32 expectedLen, + SilcUInt32 modulusLen, + SilcUInt32 expectedLen, RSA_BlockType bt, - uint32 *pResultLen) + SilcUInt32 *pResultLen) { RSA_BlockType blockType; unsigned char *dp, *res; - uint32 i, len = 0; + SilcUInt32 i, len = 0; dp = data; if (dp[0] != RSA_BLOCK_FIRST_OCTET) { @@ -256,6 +256,9 @@ RSA_DecodeOneBlock(unsigned char *data, if (blockType != bt) return NULL; + if (modulusLen < 2 + 1) + return NULL; + dp += 2; switch (blockType) { @@ -317,7 +320,7 @@ SILC_PKCS_API_ENCRYPT(pkcs1) SilcMPInt mp_tmp; SilcMPInt mp_dst; unsigned char *padded; - uint32 padded_len, len = key->bits / 8; + SilcUInt32 padded_len, len = (key->bits + 7) / 8; /* Pad data */ if (!RSA_FormatBlock(&padded, &padded_len, len, @@ -326,8 +329,6 @@ SILC_PKCS_API_ENCRYPT(pkcs1) silc_mp_init(&mp_tmp); silc_mp_init(&mp_dst); - silc_mp_set_ui(&mp_tmp, 0); - silc_mp_set_ui(&mp_dst, 0); /* Data to MP */ silc_mp_bin2mp(padded, padded_len, &mp_tmp); @@ -353,12 +354,10 @@ SILC_PKCS_API_DECRYPT(pkcs1) SilcMPInt mp_tmp; SilcMPInt mp_dst; unsigned char *padded, *unpadded; - uint32 padded_len; + SilcUInt32 padded_len; silc_mp_init(&mp_tmp); silc_mp_init(&mp_dst); - silc_mp_set_ui(&mp_tmp, 0); - silc_mp_set_ui(&mp_dst, 0); /* Data to MP */ silc_mp_bin2mp(src, src_len, &mp_tmp); @@ -367,7 +366,7 @@ SILC_PKCS_API_DECRYPT(pkcs1) rsa_en_de_crypt(&mp_dst, &mp_tmp, &key->d, &key->n); /* MP to data */ - padded = silc_mp_mp2bin(&mp_dst, key->bits / 8, &padded_len); + padded = silc_mp_mp2bin(&mp_dst, (key->bits + 7) / 8, &padded_len); /* Unpad data */ unpadded = RSA_DecodeOneBlock(padded, padded_len, 0, @@ -400,8 +399,8 @@ SILC_PKCS_API_SIGN(pkcs1) SilcMPInt mp_tmp; SilcMPInt mp_dst; unsigned char *padded; - uint32 padded_len; - uint32 len = key->bits / 8; + SilcUInt32 padded_len; + SilcUInt32 len = (key->bits + 7) / 8; /* Pad data */ if (!RSA_FormatBlock(&padded, &padded_len, len, RSA_BlockPrivate, @@ -410,8 +409,6 @@ SILC_PKCS_API_SIGN(pkcs1) silc_mp_init(&mp_tmp); silc_mp_init(&mp_dst); - silc_mp_set_ui(&mp_tmp, 0); - silc_mp_set_ui(&mp_dst, 0); /* Data to MP */ silc_mp_bin2mp(padded, len, &mp_tmp); @@ -438,12 +435,10 @@ SILC_PKCS_API_VERIFY(pkcs1) SilcMPInt mp_tmp2; SilcMPInt mp_dst; unsigned char *verify, *unpadded; - uint32 verify_len, len = key->bits / 8; + SilcUInt32 verify_len, len = (key->bits + 7) / 8; silc_mp_init(&mp_tmp2); silc_mp_init(&mp_dst); - silc_mp_set_ui(&mp_tmp2, 0); - silc_mp_set_ui(&mp_dst, 0); /* Format the signature into MP int */ silc_mp_bin2mp(signature, signature_len, &mp_tmp2);