key->pub_set = FALSE;
}
+ if (key_len < 4)
+ return 0;
+
silc_mp_init(&key->e);
silc_mp_init(&key->n);
memcpy(tmp, key_data, 4);
SILC_GET32_MSB(e_len, tmp);
- if (!e_len || e_len > key_len) {
+ if (!e_len || e_len + 4 > key_len) {
silc_mp_uninit(&key->e);
silc_mp_uninit(&key->n);
return 0;
}
silc_mp_bin2mp(key_data + 4, e_len, &key->e);
-
+
+ if (key_len < 4 + e_len + 4) {
+ silc_mp_uninit(&key->e);
+ silc_mp_uninit(&key->n);
+ return 0;
+ }
+
memcpy(tmp, key_data + 4 + e_len, 4);
SILC_GET32_MSB(n_len, tmp);
- if (!n_len || e_len + n_len > key_len) {
+ if (!n_len || e_len + 4 + n_len + 4 > key_len) {
silc_mp_uninit(&key->e);
silc_mp_uninit(&key->n);
return 0;
key->pub_set = FALSE;
}
+ if (key_len < 4)
+ return FALSE;
+
silc_mp_init(&key->e);
silc_mp_init(&key->n);
silc_mp_init(&key->d);
memcpy(tmp, key_data, 4);
SILC_GET32_MSB(e_len, tmp);
- if (e_len > key_len) {
+ if (e_len + 4 > key_len) {
silc_mp_uninit(&key->e);
silc_mp_uninit(&key->n);
silc_mp_uninit(&key->d);
silc_mp_bin2mp(key_data + 4, e_len, &key->e);
+ if (key_len < e_len + 4 + 4) {
+ silc_mp_uninit(&key->e);
+ silc_mp_uninit(&key->n);
+ silc_mp_uninit(&key->d);
+ return FALSE;
+ }
+
memcpy(tmp, key_data + 4 + e_len, 4);
SILC_GET32_MSB(n_len, tmp);
- if (e_len + n_len > key_len) {
+ if (e_len + 4 + n_len + 4 > key_len) {
silc_mp_uninit(&key->e);
silc_mp_uninit(&key->n);
silc_mp_uninit(&key->d);
silc_mp_bin2mp(key_data + 4 + e_len + 4, n_len, &key->n);
+ if (key_len < e_len + 4 + n_len + 4 + 4) {
+ silc_mp_uninit(&key->e);
+ silc_mp_uninit(&key->n);
+ silc_mp_uninit(&key->d);
+ return FALSE;
+ }
+
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) {
+ if (e_len + 4 + n_len + 4 + d_len + 4 > key_len) {
silc_mp_uninit(&key->e);
silc_mp_uninit(&key->n);
silc_mp_uninit(&key->d);