diff --git a/Crypto.h b/Crypto.h index 4408a193..8f2a4a38 100644 --- a/Crypto.h +++ b/Crypto.h @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -282,10 +283,23 @@ namespace crypto // take care about openssl version #include -#if (OPENSSL_VERSION_NUMBER < 0x010100000) || defined(LIBRESSL_VERSION_NUMBER) // 1.1.0 or LibreSSL +#if !(OPENSSL_VERSION_NUMBER >= 0x010100000) // < 1.1.0 or non-OpenSSL // define getters and setters introduced in 1.1.0 -inline int DSA_set0_pqg(DSA *d, BIGNUM *p, BIGNUM *q, BIGNUM *g) { d->p = p; d->q = q; d->g = g; return 1; } -inline int DSA_set0_key(DSA *d, BIGNUM *pub_key, BIGNUM *priv_key) { d->pub_key = pub_key; d->priv_key = priv_key; return 1; } +inline int DSA_set0_pqg(DSA *d, BIGNUM *p, BIGNUM *q, BIGNUM *g) + { d->p = p; d->q = q; d->g = g; return 1; } +inline int DSA_set0_key(DSA *d, BIGNUM *pub_key, BIGNUM *priv_key) + { d->pub_key = pub_key; d->priv_key = priv_key; return 1; } +inline void DSA_get0_key(const DSA *d, const BIGNUM **pub_key, const BIGNUM **priv_key) + { *pub_key = d->pub_key; *priv_key = d->priv_key; } +inline int DSA_SIG_set0(DSA_SIG *sig, BIGNUM *r, BIGNUM *s) + { sig->r = r; sig->s = s; return 1; } +inline void DSA_SIG_get0(const DSA_SIG *sig, const BIGNUM **pr, const BIGNUM **ps) + { *pr = sig->r; *ps = sig->s; } + +inline int RSA_set0_key(RSA *r, BIGNUM *n, BIGNUM *e, BIGNUM *d) + { r->n = n; r->e = e; r->d = d; return 1; } +inline void RSA_get0_key(const RSA *r, const BIGNUM **n, const BIGNUM **e, const BIGNUM **d) + { *n = r->n; *e = r->e; *d = r->d; } #endif diff --git a/Signature.h b/Signature.h index 5934f8d2..df9d8d33 100644 --- a/Signature.h +++ b/Signature.h @@ -43,7 +43,7 @@ namespace crypto DSAVerifier (const uint8_t * signingKey) { m_PublicKey = CreateDSA (); - m_PublicKey->pub_key = BN_bin2bn (signingKey, DSA_PUBLIC_KEY_LENGTH, NULL); + DSA_set0_key (m_PublicKey, BN_bin2bn (signingKey, DSA_PUBLIC_KEY_LENGTH, NULL), NULL); } ~DSAVerifier () @@ -58,8 +58,7 @@ namespace crypto SHA1 (buf, len, digest); // signature DSA_SIG * sig = DSA_SIG_new(); - sig->r = BN_bin2bn (signature, DSA_SIGNATURE_LENGTH/2, NULL); - sig->s = BN_bin2bn (signature + DSA_SIGNATURE_LENGTH/2, DSA_SIGNATURE_LENGTH/2, NULL); + DSA_SIG_set0 (sig, BN_bin2bn (signature, DSA_SIGNATURE_LENGTH/2, NULL), BN_bin2bn (signature + DSA_SIGNATURE_LENGTH/2, DSA_SIGNATURE_LENGTH/2, NULL)); // DSA verification int ret = DSA_do_verify (digest, 20, sig, m_PublicKey); DSA_SIG_free(sig); @@ -81,7 +80,7 @@ namespace crypto DSASigner (const uint8_t * signingPrivateKey) { m_PrivateKey = CreateDSA (); - m_PrivateKey->priv_key = BN_bin2bn (signingPrivateKey, DSA_PRIVATE_KEY_LENGTH, NULL); + DSA_set0_key (m_PrivateKey, NULL, BN_bin2bn (signingPrivateKey, DSA_PRIVATE_KEY_LENGTH, NULL)); } ~DSASigner () @@ -94,8 +93,10 @@ namespace crypto uint8_t digest[20]; SHA1 (buf, len, digest); DSA_SIG * sig = DSA_do_sign (digest, 20, m_PrivateKey); - bn2buf (sig->r, signature, DSA_SIGNATURE_LENGTH/2); - bn2buf (sig->s, signature + DSA_SIGNATURE_LENGTH/2, DSA_SIGNATURE_LENGTH/2); + const BIGNUM * r, * s; + DSA_SIG_get0 (sig, &r, &s); + bn2buf (r, signature, DSA_SIGNATURE_LENGTH/2); + bn2buf (s, signature + DSA_SIGNATURE_LENGTH/2, DSA_SIGNATURE_LENGTH/2); DSA_SIG_free(sig); } @@ -108,10 +109,11 @@ namespace crypto { DSA * dsa = CreateDSA (); DSA_generate_key (dsa); - bn2buf (dsa->priv_key, signingPrivateKey, DSA_PRIVATE_KEY_LENGTH); - bn2buf (dsa->pub_key, signingPublicKey, DSA_PUBLIC_KEY_LENGTH); - DSA_free (dsa); - + const BIGNUM * pub_key, * priv_key; + DSA_get0_key(dsa, &pub_key, &priv_key); + bn2buf (priv_key, signingPrivateKey, DSA_PRIVATE_KEY_LENGTH); + bn2buf (pub_key, signingPublicKey, DSA_PUBLIC_KEY_LENGTH); + DSA_free (dsa); } struct SHA256Hash @@ -270,8 +272,7 @@ namespace crypto { m_PublicKey = RSA_new (); memset (m_PublicKey, 0, sizeof (RSA)); - m_PublicKey->e = BN_dup (GetRSAE ()); - m_PublicKey->n = BN_bin2bn (signingKey, keyLen, NULL); + RSA_set0_key (m_PublicKey, BN_bin2bn (signingKey, keyLen, NULL) /* n */ , BN_dup (GetRSAE ()) /* d */, NULL); } ~RSAVerifier () @@ -304,9 +305,8 @@ namespace crypto { m_PrivateKey = RSA_new (); memset (m_PrivateKey, 0, sizeof (RSA)); - m_PrivateKey->e = BN_dup (GetRSAE ()); - m_PrivateKey->n = BN_bin2bn (signingPrivateKey, keyLen, NULL); - m_PrivateKey->d = BN_bin2bn (signingPrivateKey + keyLen, keyLen, NULL); + RSA_set0_key (m_PrivateKey, BN_bin2bn (signingPrivateKey, keyLen, NULL), /* n */ + BN_dup (GetRSAE ()) /* e */, BN_bin2bn (signingPrivateKey + keyLen, keyLen, NULL) /* d */); } ~RSASigner () @@ -332,9 +332,11 @@ namespace crypto RSA * rsa = RSA_new (); BIGNUM * e = BN_dup (GetRSAE ()); // make it non-const RSA_generate_key_ex (rsa, publicKeyLen*8, e, NULL); - bn2buf (rsa->n, signingPrivateKey, publicKeyLen); - bn2buf (rsa->d, signingPrivateKey + publicKeyLen, publicKeyLen); - bn2buf (rsa->n, signingPublicKey, publicKeyLen); + const BIGNUM * n, * d, * e1; + RSA_get0_key (rsa, &n, &e1, &d); + bn2buf (n, signingPrivateKey, publicKeyLen); + bn2buf (d, signingPrivateKey + publicKeyLen, publicKeyLen); + bn2buf (n, signingPublicKey, publicKeyLen); BN_free (e); // this e is not assigned to rsa->e RSA_free (rsa); }