Skip to content

Commit fae62af

Browse files
authored
Merge pull request #613 from SOuajih/pkcs_fix
fix pkcs_1_v1_5_decode() when empty message
2 parents 05f9407 + 6164cc1 commit fae62af

File tree

6 files changed

+20
-11
lines changed

6 files changed

+20
-11
lines changed

src/pk/pkcs1/pkcs_1_oaep_encode.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ int pkcs_1_oaep_encode(const unsigned char *msg, unsigned long msglen,
3333
unsigned long hLen, x, y, modulus_len;
3434
int err;
3535

36-
LTC_ARGCHK(msg != NULL);
36+
LTC_ARGCHK((msglen == 0) || (msg != NULL));
3737
LTC_ARGCHK(out != NULL);
3838
LTC_ARGCHK(outlen != NULL);
3939

@@ -95,9 +95,11 @@ int pkcs_1_oaep_encode(const unsigned char *msg, unsigned long msglen,
9595
/* 0x01 byte */
9696
DB[x++] = 0x01;
9797

98-
/* message (length = msglen) */
99-
XMEMCPY(DB+x, msg, msglen);
100-
x += msglen;
98+
if (msglen != 0) {
99+
/* message (length = msglen) */
100+
XMEMCPY(DB+x, msg, msglen);
101+
x += msglen;
102+
}
101103

102104
/* now choose a random seed */
103105
if (prng_descriptor[prng_idx].read(seed, hLen, prng) != hLen) {

src/pk/pkcs1/pkcs_1_v1_5_decode.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ int pkcs_1_v1_5_decode(const unsigned char *msg,
5858
}
5959
ps_len = i++ - 2;
6060

61-
if (i >= modulus_len) {
61+
if (i > modulus_len) {
6262
/* There was no octet with hexadecimal value 0x00 to separate ps from m.
6363
*/
6464
result = CRYPT_INVALID_PACKET;

src/pk/pkcs1/pkcs_1_v1_5_encode.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@ int pkcs_1_v1_5_encode(const unsigned char *msg,
3535
unsigned char *ps;
3636
int result;
3737

38+
LTC_ARGCHK((msglen == 0) || (msg != NULL));
39+
LTC_ARGCHK(out != NULL);
40+
LTC_ARGCHK(outlen != NULL);
41+
3842
/* valid block_type? */
3943
if ((block_type != LTC_PKCS_1_EMSA) &&
4044
(block_type != LTC_PKCS_1_EME)) {
@@ -88,7 +92,9 @@ int pkcs_1_v1_5_encode(const unsigned char *msg,
8892
out[0] = 0x00;
8993
out[1] = (unsigned char)block_type; /* block_type 1 or 2 */
9094
out[2 + ps_len] = 0x00;
91-
XMEMCPY(&out[2 + ps_len + 1], msg, msglen);
95+
if (msglen != 0) {
96+
XMEMCPY(&out[2 + ps_len + 1], msg, msglen);
97+
}
9298
*outlen = modulus_len;
9399

94100
result = CRYPT_OK;

src/pk/rsa/rsa_decrypt_key.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ int rsa_decrypt_key_ex(const unsigned char *in, unsigned long inlen
3333
int err;
3434
unsigned char *tmp;
3535

36+
LTC_ARGCHK(in != NULL);
3637
LTC_ARGCHK(out != NULL);
3738
LTC_ARGCHK(outlen != NULL);
3839
LTC_ARGCHK(key != NULL);

src/pk/rsa/rsa_encrypt_key.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ int rsa_encrypt_key_ex(const unsigned char *in, unsigned long inlen,
3434
unsigned long modulus_bitlen, modulus_bytelen, x;
3535
int err;
3636

37-
LTC_ARGCHK(in != NULL);
37+
LTC_ARGCHK((inlen == 0) || (in != NULL));
3838
LTC_ARGCHK(out != NULL);
3939
LTC_ARGCHK(outlen != NULL);
4040
LTC_ARGCHK(key != NULL);

tests/rsa_test.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -500,7 +500,7 @@ print_hex("q", tmp, len);
500500

501501
/* encrypt the key (without lparam) */
502502
for (cnt = 0; cnt < 4; cnt++) {
503-
for (rsa_msgsize = 1; rsa_msgsize <= 86; rsa_msgsize++) {
503+
for (rsa_msgsize = 0; rsa_msgsize <= 86; rsa_msgsize++) {
504504
/* make a random key/msg */
505505
ENSURE(yarrow_read(in, rsa_msgsize, &yarrow_prng) == rsa_msgsize);
506506

@@ -523,10 +523,10 @@ print_hex("q", tmp, len);
523523
}
524524

525525
/* encrypt the key (with lparam) */
526-
for (rsa_msgsize = 1; rsa_msgsize <= 86; rsa_msgsize++) {
526+
for (rsa_msgsize = 0; rsa_msgsize <= 86; rsa_msgsize++) {
527527
len = sizeof(out);
528528
len2 = rsa_msgsize;
529-
DO(rsa_encrypt_key(in, rsa_msgsize, out, &len, lparam, sizeof(lparam), &yarrow_prng, prng_idx, hash_idx, &key));
529+
DO(rsa_encrypt_key(rsa_msgsize ? in : NULL, rsa_msgsize, out, &len, lparam, sizeof(lparam), &yarrow_prng, prng_idx, hash_idx, &key));
530530
/* change a byte */
531531
out[8] ^= 1;
532532
SHOULD_FAIL(rsa_decrypt_key(out, len, tmp, &len2, lparam, sizeof(lparam), hash_idx, &stat2, &key));
@@ -542,7 +542,7 @@ print_hex("q", tmp, len);
542542
}
543543

544544
/* encrypt the key PKCS #1 v1.5 (payload from 1 to 117 bytes) */
545-
for (rsa_msgsize = 1; rsa_msgsize <= 117; rsa_msgsize++) {
545+
for (rsa_msgsize = 0; rsa_msgsize <= 117; rsa_msgsize++) {
546546
len = sizeof(out);
547547
len2 = rsa_msgsize;
548548
/* make a random key/msg */

0 commit comments

Comments
 (0)