version 1.55.2.1, 2004/08/19 04:13:26 |
version 1.55.2.2, 2005/03/10 17:15:04 |
|
|
key_from_blob(const u_char *blob, u_int blen) |
key_from_blob(const u_char *blob, u_int blen) |
{ |
{ |
Buffer b; |
Buffer b; |
char *ktype; |
|
int rlen, type; |
int rlen, type; |
|
char *ktype = NULL; |
Key *key = NULL; |
Key *key = NULL; |
|
|
#ifdef DEBUG_PK |
#ifdef DEBUG_PK |
|
|
#endif |
#endif |
buffer_init(&b); |
buffer_init(&b); |
buffer_append(&b, blob, blen); |
buffer_append(&b, blob, blen); |
ktype = buffer_get_string(&b, NULL); |
if ((ktype = buffer_get_string_ret(&b, NULL)) == NULL) { |
|
error("key_from_blob: can't read key type"); |
|
goto out; |
|
} |
|
|
type = key_type_from_name(ktype); |
type = key_type_from_name(ktype); |
|
|
switch (type) { |
switch (type) { |
case KEY_RSA: |
case KEY_RSA: |
key = key_new(type); |
key = key_new(type); |
buffer_get_bignum2(&b, key->rsa->e); |
if (buffer_get_bignum2_ret(&b, key->rsa->e) == -1 || |
buffer_get_bignum2(&b, key->rsa->n); |
buffer_get_bignum2_ret(&b, key->rsa->n) == -1) { |
|
error("key_from_blob: can't read rsa key"); |
|
key_free(key); |
|
key = NULL; |
|
goto out; |
|
} |
#ifdef DEBUG_PK |
#ifdef DEBUG_PK |
RSA_print_fp(stderr, key->rsa, 8); |
RSA_print_fp(stderr, key->rsa, 8); |
#endif |
#endif |
break; |
break; |
case KEY_DSA: |
case KEY_DSA: |
key = key_new(type); |
key = key_new(type); |
buffer_get_bignum2(&b, key->dsa->p); |
if (buffer_get_bignum2_ret(&b, key->dsa->p) == -1 || |
buffer_get_bignum2(&b, key->dsa->q); |
buffer_get_bignum2_ret(&b, key->dsa->q) == -1 || |
buffer_get_bignum2(&b, key->dsa->g); |
buffer_get_bignum2_ret(&b, key->dsa->g) == -1 || |
buffer_get_bignum2(&b, key->dsa->pub_key); |
buffer_get_bignum2_ret(&b, key->dsa->pub_key) == -1) { |
|
error("key_from_blob: can't read dsa key"); |
|
key_free(key); |
|
key = NULL; |
|
goto out; |
|
} |
#ifdef DEBUG_PK |
#ifdef DEBUG_PK |
DSA_print_fp(stderr, key->dsa, 8); |
DSA_print_fp(stderr, key->dsa, 8); |
#endif |
#endif |
|
|
break; |
break; |
default: |
default: |
error("key_from_blob: cannot handle type %s", ktype); |
error("key_from_blob: cannot handle type %s", ktype); |
break; |
goto out; |
} |
} |
rlen = buffer_len(&b); |
rlen = buffer_len(&b); |
if (key != NULL && rlen != 0) |
if (key != NULL && rlen != 0) |
error("key_from_blob: remaining bytes in key blob %d", rlen); |
error("key_from_blob: remaining bytes in key blob %d", rlen); |
xfree(ktype); |
out: |
|
if (ktype != NULL) |
|
xfree(ktype); |
buffer_free(&b); |
buffer_free(&b); |
return key; |
return key; |
} |
} |