static int rsa_printkey2(FILE *out, RSA *rsa, BIGNUM *Xq1, BIGNUM *Xq2, BIGNUM *Xq) { int ret = 0; BIGNUM *q1 = NULL, *q2 = NULL; q1 = BN_new(); q2 = BN_new(); if (!q1 || !q2) goto error; if (!RSA_X931_derive_ex(rsa, NULL, NULL, q1, q2, NULL, NULL, NULL, Xq1, Xq2, Xq, NULL, NULL)) goto error; do_bn_print_name(out, "q1", q1); do_bn_print_name(out, "q2", q2); do_bn_print_name(out, "q", rsa->q); do_bn_print_name(out, "n", rsa->n); do_bn_print_name(out, "d", rsa->d); ret = 1; error: if (q1) BN_free(q1); if (q2) BN_free(q2); return ret; }
static int rsa_printkey1(FILE *out, RSA *rsa, BIGNUM *Xp1, BIGNUM *Xp2, BIGNUM *Xp, BIGNUM *e) { int ret = 0; BIGNUM *p1 = NULL, *p2 = NULL; p1 = BN_new(); p2 = BN_new(); if (!p1 || !p2) goto error; if (!RSA_X931_derive_ex(rsa, p1, p2, NULL, NULL, Xp1, Xp2, Xp, NULL, NULL, NULL, e, NULL)) goto error; do_bn_print_name(out, "p1", p1); do_bn_print_name(out, "p2", p2); do_bn_print_name(out, "p", rsa->p); ret = 1; error: if (p1) BN_free(p1); if (p2) BN_free(p2); return ret; }
int RSA_X931_generate_key_ex(RSA *rsa, int bits, const BIGNUM *e, BN_GENCB *cb) { int ok = 0; BIGNUM *Xp = NULL, *Xq = NULL; BN_CTX *ctx = NULL; ctx = BN_CTX_new(); if (!ctx) goto error; BN_CTX_start(ctx); Xp = BN_CTX_get(ctx); Xq = BN_CTX_get(ctx); if (!BN_X931_generate_Xpq(Xp, Xq, bits, ctx)) goto error; rsa->p = BN_new(); rsa->q = BN_new(); if (!rsa->p || !rsa->q) goto error; /* Generate two primes from Xp, Xq */ if (!BN_X931_generate_prime_ex(rsa->p, NULL, NULL, NULL, NULL, Xp, e, ctx, cb)) goto error; if (!BN_X931_generate_prime_ex(rsa->q, NULL, NULL, NULL, NULL, Xq, e, ctx, cb)) goto error; /* * Since rsa->p and rsa->q are valid this call will just derive remaining * RSA components. */ if (!RSA_X931_derive_ex(rsa, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, e, cb)) goto error; ok = 1; error: if (ctx) { BN_CTX_end(ctx); BN_CTX_free(ctx); } if (ok) return 1; return 0; }
int RSA_X931_derive(RSA *rsa, BIGNUM *p1, BIGNUM *p2, BIGNUM *q1, BIGNUM *q2, void (*callback)(int, int, void *), void *cb_arg, const BIGNUM *Xp1, const BIGNUM *Xp2, const BIGNUM *Xp, const BIGNUM *Xq1, const BIGNUM *Xq2, const BIGNUM *Xq, const BIGNUM *e) { BN_GENCB cb; BN_GENCB_set_old(&cb, callback, cb_arg); return RSA_X931_derive_ex(rsa, p1, p2, q1, q2, Xp1, Xp2, Xp, Xq1, Xq2, Xq, e, &cb); }