diff options
author | David Phillips <david@sighup.nz> | 2017-04-28 15:25:16 +1200 |
---|---|---|
committer | David Phillips <david@sighup.nz> | 2017-04-28 15:27:49 +1200 |
commit | 0259a31cafdfb94a9a80e6763d89dd650cb28c27 (patch) | |
tree | 01e51c2f5911301d30fc631e12d2b53cb3a1380f | |
parent | 4b51147eb002b9eb4457d523f289641641c07aa9 (diff) | |
download | sand-leek-0259a31cafdfb94a9a80e6763d89dd650cb28c27.tar.xz |
Update d appropriately, check sanity of keys
-rw-r--r-- | sand-leek.c | 60 |
1 files changed, 59 insertions, 1 deletions
diff --git a/sand-leek.c b/sand-leek.c index 466b828..805cb83 100644 --- a/sand-leek.c +++ b/sand-leek.c @@ -39,6 +39,61 @@ onion_sha(char output[16], unsigned char sum[20]) { } } +/* re-calculate the decryption key `d` for the given key + * the product of e and d must be congruent to 1, and since we are messing + * with e to generate our keys, we must re-calculate d */ +int +key_update_d(RSA *rsa_key) { + BN_CTX *bn_ctx = NULL; + const BIGNUM *p = NULL; + const BIGNUM *q = NULL; + const BIGNUM *d = NULL; + const BIGNUM *e = NULL; + BIGNUM *gcd = BN_new(); + BIGNUM *p1 = BN_new(); + BIGNUM *q1 = BN_new(); + BIGNUM *p1q1 = BN_new(); + BIGNUM *lambda_n = BN_new(); + BIGNUM *true_d = BN_new(); + BIGNUM *true_dmp1 = BN_new(); + BIGNUM *true_dmq1 = BN_new(); + BIGNUM *true_iqmp = BN_new(); + + /* FIXME check for error */ + bn_ctx = BN_CTX_new(); + + /* FIXME check for error */ + RSA_get0_key(rsa_key, NULL, &e, &d); + + /* FIXME check for error */ + RSA_get0_factors(rsa_key, &p, &q); + + BN_sub(p1, p, BN_value_one()); + BN_sub(q1, q, BN_value_one()); + + BN_mul(p1q1, p1, q1, bn_ctx); + + /* calculate LCM of p1,q1 with p1*q1/gcd(p1,q1) */ + BN_gcd(gcd, p1, q1, bn_ctx); + BN_div(lambda_n, NULL, p1q1, gcd, bn_ctx); + + BN_mod_inverse(true_d, e, lambda_n, bn_ctx); + BN_mod_inverse(true_iqmp, q, p, bn_ctx); + BN_mod(true_dmp1, true_d, p1, bn_ctx); + BN_mod(true_dmq1, true_d, q1, bn_ctx); + + /* FIXME check for errors */ + if (!RSA_set0_key(rsa_key, NULL, NULL, true_d)) { + fprintf(stderr, "setting d failed\n"); + return 1; + } + if (!RSA_set0_crt_params(rsa_key, true_dmp1, true_dmq1, true_iqmp)) { + fprintf(stderr, "setting crt params failed\n"); + return 1; + } + return 0; +} + void* work(void *arg) { char onion[17]; @@ -130,6 +185,8 @@ work(void *arg) { /* much tidier to be honest */ BN_set_word(rsa_key->e, e); #endif + /* FIXME check for errors */ + key_update_d(rsa_key); if (RSA_check_key(rsa_key) == 1) { printf("Key valid\n"); @@ -142,7 +199,8 @@ work(void *arg) { EVP_PKEY_free(evp_key); goto STOP; } else { - printf("Key invalid\n"); + fprintf(stderr, "Key invalid:"); + ERR_print_errors_fp(stderr); } } /* select next odd exponent */ |