static ssh_key *rsa2_new_priv(const ssh_keyalg *self, ptrlen pub, ptrlen priv) { BinarySource src[1]; ssh_key *sshk; RSAKey *rsa; sshk = rsa2_new_pub(self, pub); if (!sshk) return NULL; rsa = container_of(sshk, RSAKey, sshk); BinarySource_BARE_INIT_PL(src, priv); rsa->private_exponent = get_mp_ssh2(src); rsa->p = get_mp_ssh2(src); rsa->q = get_mp_ssh2(src); rsa->iqmp = get_mp_ssh2(src); if (get_err(src) || !rsa_verify(rsa)) { rsa2_freekey(&rsa->sshk); return NULL; } return &rsa->sshk; }
static int rsa2_pubkey_bits(void *blob, int len) { struct RSAKey *rsa; int ret; rsa = rsa2_newkey((char *) blob, len); ret = bignum_bitcount(rsa->modulus); rsa2_freekey(rsa); return ret; }
static int rsa2_pubkey_bits(const ssh_keyalg *self, ptrlen pub) { ssh_key *sshk; RSAKey *rsa; int ret; sshk = rsa2_new_pub(self, pub); if (!sshk) return -1; rsa = container_of(sshk, RSAKey, sshk); ret = mp_get_nbits(rsa->modulus); rsa2_freekey(&rsa->sshk); return ret; }
static void *rsa2_createkey(unsigned char *pub_blob, int pub_len, unsigned char *priv_blob, int priv_len) { struct RSAKey *rsa; char *pb = (char *) priv_blob; rsa = rsa2_newkey((char *) pub_blob, pub_len); rsa->private_exponent = getmp(&pb, &priv_len); rsa->p = getmp(&pb, &priv_len); rsa->q = getmp(&pb, &priv_len); rsa->iqmp = getmp(&pb, &priv_len); if (!rsa_verify(rsa)) { rsa2_freekey(rsa); return NULL; } return rsa; }
static ssh_key *rsa2_new_priv_openssh(const ssh_keyalg *self, BinarySource *src) { RSAKey *rsa; rsa = snew(RSAKey); rsa->sshk.vt = &ssh_rsa; rsa->comment = NULL; rsa->modulus = get_mp_ssh2(src); rsa->exponent = get_mp_ssh2(src); rsa->private_exponent = get_mp_ssh2(src); rsa->iqmp = get_mp_ssh2(src); rsa->p = get_mp_ssh2(src); rsa->q = get_mp_ssh2(src); if (get_err(src) || !rsa_verify(rsa)) { rsa2_freekey(&rsa->sshk); return NULL; } return &rsa->sshk; }
static ssh_key *rsa2_new_pub(const ssh_keyalg *self, ptrlen data) { BinarySource src[1]; RSAKey *rsa; BinarySource_BARE_INIT_PL(src, data); if (!ptrlen_eq_string(get_string(src), "ssh-rsa")) return NULL; rsa = snew(RSAKey); rsa->sshk.vt = &ssh_rsa; rsa->exponent = get_mp_ssh2(src); rsa->modulus = get_mp_ssh2(src); rsa->private_exponent = NULL; rsa->p = rsa->q = rsa->iqmp = NULL; rsa->comment = NULL; if (get_err(src)) { rsa2_freekey(&rsa->sshk); return NULL; } return &rsa->sshk; }
void ssh_rsakex_freekey(RSAKey *key) { rsa2_freekey(&key->sshk); }