int silc_pkcs1_import_private_key(unsigned char *key, SilcUInt32 key_len, void **ret_private_key) { SilcAsn1 asn1; SilcBufferStruct alg_key; RsaPrivateKey *privkey; SilcUInt32 ver; if (!ret_private_key) return 0; asn1 = silc_asn1_alloc(); if (!asn1) return 0; /* Allocate RSA private key */ *ret_private_key = privkey = silc_calloc(1, sizeof(*privkey)); if (!privkey) goto err; /* Parse the PKCS #1 private key */ silc_buffer_set(&alg_key, key, key_len); if (!silc_asn1_decode(asn1, &alg_key, SILC_ASN1_OPTS(SILC_ASN1_ALLOC), SILC_ASN1_SEQUENCE, SILC_ASN1_SHORT_INT(&ver), SILC_ASN1_INT(&privkey->n), SILC_ASN1_INT(&privkey->e), SILC_ASN1_INT(&privkey->d), SILC_ASN1_INT(&privkey->p), SILC_ASN1_INT(&privkey->q), SILC_ASN1_INT(&privkey->dP), SILC_ASN1_INT(&privkey->dQ), SILC_ASN1_INT(&privkey->qP), SILC_ASN1_END, SILC_ASN1_END)) goto err; if (ver != 0) goto err; /* Set key length */ privkey->bits = ((silc_mp_sizeinbase(&privkey->n, 2) + 7) / 8) * 8; silc_asn1_free(asn1); return key_len; err: silc_free(privkey); silc_asn1_free(asn1); return 0; }
unsigned char *silc_mp_mp2bin(SilcMPInt *val, SilcUInt32 len, SilcUInt32 *ret_len) { SilcUInt32 size; unsigned char *ret; size = (len ? len : ((silc_mp_sizeinbase(val, 2) + 7) / 8)); ret = silc_calloc(size, sizeof(*ret)); if (!ret) return NULL; silc_mp_mp2bin_noalloc(val, ret, size); if (ret_len) *ret_len = size; return ret; }
int silc_pkcs1_import_public_key(unsigned char *key, SilcUInt32 key_len, void **ret_public_key) { SilcAsn1 asn1 = NULL; SilcBufferStruct alg_key; RsaPublicKey *pubkey; if (!ret_public_key) return 0; asn1 = silc_asn1_alloc(); if (!asn1) return 0; /* Allocate RSA public key */ *ret_public_key = pubkey = silc_calloc(1, sizeof(*pubkey)); if (!pubkey) goto err; /* Parse the PKCS #1 public key */ silc_buffer_set(&alg_key, key, key_len); if (!silc_asn1_decode(asn1, &alg_key, SILC_ASN1_OPTS(SILC_ASN1_ALLOC), SILC_ASN1_SEQUENCE, SILC_ASN1_INT(&pubkey->n), SILC_ASN1_INT(&pubkey->e), SILC_ASN1_END, SILC_ASN1_END)) goto err; /* Set key length */ pubkey->bits = ((silc_mp_sizeinbase(&pubkey->n, 2) + 7) / 8) * 8; silc_asn1_free(asn1); return key_len; err: silc_free(pubkey); silc_asn1_free(asn1); return 0; }