{
RsaKey *key = (RsaKey *)context;
unsigned char *e, *n, *ret;
- unsigned int e_len, n_len;
+ unsigned short e_len, n_len;
unsigned char tmp[2];
e_len = silc_mp_sizeinbase(&key->e, 16);
{
RsaKey *key = (RsaKey *)context;
unsigned char *e, *n, *d, *ret;
- unsigned int e_len, n_len, d_len;
+ unsigned short e_len, n_len, d_len;
unsigned char tmp[2];
e_len = silc_mp_sizeinbase(&key->e, 16);
{
RsaKey *key = (RsaKey *)context;
unsigned char *e, *n, tmp[2];
- unsigned int e_len, n_len;
+ unsigned short 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]);
+ if (e_len > key_len) {
+ silc_mp_clear(&key->e);
+ silc_mp_clear(&key->n);
+ return FALSE;
+ }
e = silc_calloc(e_len + 1, sizeof(unsigned char));
memcpy(e, key_data + 2, e_len);
memcpy(tmp, key_data + 2 + e_len, 2);
n_len = ((unsigned int)tmp[0] << 8) | ((unsigned int)tmp[1]);
+ if (e_len + n_len > key_len) {
+ memset(e, 0, e_len);
+ silc_free(e);
+ silc_mp_clear(&key->e);
+ silc_mp_clear(&key->n);
+ return FALSE;
+ }
n = silc_calloc(n_len + 1, sizeof(unsigned char));
memcpy(n, key_data + 2 + e_len + 2, n_len);
{
RsaKey *key = (RsaKey *)context;
unsigned char *e, *n, *d, tmp[2];
- unsigned int e_len, n_len, d_len;
+ unsigned short e_len, n_len, d_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]);
+ if (e_len > key_len) {
+ silc_mp_clear(&key->e);
+ silc_mp_clear(&key->n);
+ return FALSE;
+ }
e = silc_calloc(e_len + 1, sizeof(unsigned char));
memcpy(e, key_data + 2, e_len);
memcpy(tmp, key_data + 2 + e_len, 2);
n_len = ((unsigned int)tmp[0] << 8) | ((unsigned int)tmp[1]);
+ if (e_len + n_len > key_len) {
+ memset(e, 0, e_len);
+ silc_free(e);
+ silc_mp_clear(&key->e);
+ silc_mp_clear(&key->n);
+ return FALSE;
+ }
n = silc_calloc(n_len + 1, sizeof(unsigned char));
memcpy(n, key_data + 2 + e_len + 2, n_len);
memcpy(tmp, key_data + 2 + e_len + 2 + n_len, 2);
d_len = ((unsigned int)tmp[0] << 8) | ((unsigned int)tmp[1]);
+ if (e_len + n_len + d_len > key_len) {
+ memset(n, 0, n_len);
+ silc_free(n);
+ memset(e, 0, e_len);
+ silc_free(e);
+ silc_mp_clear(&key->e);
+ silc_mp_clear(&key->n);
+ return FALSE;
+ }
d = silc_calloc(d_len + 1, sizeof(unsigned char));
memcpy(d, key_data + 2 + e_len + 2 + n_len + 2, d_len);