Codebase list libcryptx-perl / a0511e0
overflow in ecc_ansi_x963_export Karel Miko 8 years ago
1 changed file(s) with 9 addition(s) and 3 deletion(s). Raw diff Collapse all Expand all
2929 int ecc_ansi_x963_export(ecc_key *key, unsigned char *out, unsigned long *outlen)
3030 {
3131 unsigned char buf[ECC_BUF_SIZE];
32 unsigned long numlen;
32 unsigned long numlen, xlen, ylen;
3333
3434 LTC_ARGCHK(key != NULL);
3535 LTC_ARGCHK(out != NULL);
3939 return CRYPT_INVALID_ARG;
4040 }
4141 numlen = key->dp->size;
42 xlen = mp_unsigned_bin_size(key->pubkey.x);
43 ylen = mp_unsigned_bin_size(key->pubkey.y);
44
45 if (xlen > numlen || ylen > numlen || sizeof(buf) < numlen) {
46 return CRYPT_BUFFER_OVERFLOW;
47 }
4248
4349 if (*outlen < (1 + 2*numlen)) {
4450 *outlen = 1 + 2*numlen;
5056
5157 /* pad and store x */
5258 zeromem(buf, sizeof(buf));
53 mp_to_unsigned_bin(key->pubkey.x, buf + (numlen - mp_unsigned_bin_size(key->pubkey.x)));
59 mp_to_unsigned_bin(key->pubkey.x, buf + (numlen - xlen));
5460 XMEMCPY(out+1, buf, numlen);
5561
5662 /* pad and store y */
5763 zeromem(buf, sizeof(buf));
58 mp_to_unsigned_bin(key->pubkey.y, buf + (numlen - mp_unsigned_bin_size(key->pubkey.y)));
64 mp_to_unsigned_bin(key->pubkey.y, buf + (numlen - ylen));
5965 XMEMCPY(out+1+numlen, buf, numlen);
6066
6167 *outlen = 1 + 2*numlen;