diff options
| author | Steven Fackler <[email protected]> | 2018-04-25 14:51:02 -0700 |
|---|---|---|
| committer | GitHub <[email protected]> | 2018-04-25 14:51:02 -0700 |
| commit | 261463542fb2670358b3e347ec41e6269bacee02 (patch) | |
| tree | 48b83734b7526621bfab6a5d7a3f6fc1221e3340 /openssl/src | |
| parent | Merge pull request #903 from Richterrettich/master (diff) | |
| parent | Add RsaPrivateKeyBuilder (diff) | |
| download | rust-openssl-261463542fb2670358b3e347ec41e6269bacee02.tar.xz rust-openssl-261463542fb2670358b3e347ec41e6269bacee02.zip | |
Merge pull request #901 from eoger/rsa-from-builder
Add RsaPrivateKeyBuilder
Diffstat (limited to 'openssl/src')
| -rw-r--r-- | openssl/src/rsa.rs | 109 |
1 files changed, 89 insertions, 20 deletions
diff --git a/openssl/src/rsa.rs b/openssl/src/rsa.rs index 6a591b69..3a059200 100644 --- a/openssl/src/rsa.rs +++ b/openssl/src/rsa.rs @@ -465,47 +465,116 @@ impl Rsa<Public> { } } -impl Rsa<Private> { - /// Creates a new RSA key with private components (public components are assumed). +pub struct RsaPrivateKeyBuilder { + rsa: Rsa<Private> +} + +impl RsaPrivateKeyBuilder { + /// Creates a new `RsaPrivateKeyBuilder`. /// /// `n` is the modulus common to both public and private key. /// `e` is the public exponent and `d` is the private exponent. - /// `p` and `q` are the first and second factors of `n`. - /// `dmp1`, `dmq1`, and `iqmp` are the exponents and coefficient for - /// Chinese Remainder Theorem calculations which is used to speed up RSA operations. /// - /// This corresponds to [`RSA_new`] and uses [`RSA_set0_key`], - /// [`RSA_set0_factors`], and [`RSA_set0_crt_params`]. + /// This corresponds to [`RSA_new`] and uses [`RSA_set0_key`]. /// /// [`RSA_new`]: https://www.openssl.org/docs/man1.1.0/crypto/RSA_new.html /// [`RSA_set0_key`]: https://www.openssl.org/docs/man1.1.0/crypto/RSA_set0_key.html - /// [`RSA_set0_factors`]: https://www.openssl.org/docs/man1.1.0/crypto/RSA_set0_factors.html - /// [`RSA_set0_crt_params`]: https://www.openssl.org/docs/man1.1.0/crypto/RSA_set0_crt_params.html - pub fn from_private_components( + pub fn new( n: BigNum, e: BigNum, - d: BigNum, - p: BigNum, - q: BigNum, - dmp1: BigNum, - dmq1: BigNum, - iqmp: BigNum, - ) -> Result<Rsa<Private>, ErrorStack> { + d: BigNum) -> Result<RsaPrivateKeyBuilder, ErrorStack> { unsafe { let rsa = Rsa::from_ptr(cvt_p(ffi::RSA_new())?); cvt(compat::set_key(rsa.0, n.as_ptr(), e.as_ptr(), d.as_ptr()))?; mem::forget((n, e, d)); - cvt(compat::set_factors(rsa.0, p.as_ptr(), q.as_ptr()))?; + Ok(RsaPrivateKeyBuilder{ + rsa + }) + } + } + + /// Sets the factors of the Rsa key. + /// + /// `p` and `q` are the first and second factors of `n`. + /// + /// This correspond to [`RSA_set0_factors`]. + /// + /// [`RSA_set0_factors`]: https://www.openssl.org/docs/man1.1.0/crypto/RSA_set0_factors.html + pub fn set_factors( + self, + p: BigNum, + q: BigNum) -> Result<RsaPrivateKeyBuilder, ErrorStack> { + unsafe { + cvt(compat::set_factors(self.rsa.0, p.as_ptr(), q.as_ptr()))?; mem::forget((p, q)); + } + Ok(self) + } + + /// Sets the Chinese Remainder Theorem params of the Rsa key. + /// + /// `dmp1`, `dmq1`, and `iqmp` are the exponents and coefficient for + /// CRT calculations which is used to speed up RSA operations. + /// + /// This correspond to [`RSA_set0_crt_params`]. + /// + /// [`RSA_set0_crt_params`]: https://www.openssl.org/docs/man1.1.0/crypto/RSA_set0_crt_params.html + pub fn set_crt_params( + self, + dmp1: BigNum, + dmq1: BigNum, + iqmp: BigNum) -> Result<RsaPrivateKeyBuilder, ErrorStack> { + unsafe { cvt(compat::set_crt_params( - rsa.0, + self.rsa.0, dmp1.as_ptr(), dmq1.as_ptr(), iqmp.as_ptr(), ))?; mem::forget((dmp1, dmq1, iqmp)); - Ok(rsa) } + Ok(self) + } + + /// Returns the Rsa key. + pub fn build(self) -> Rsa<Private> { + self.rsa + } +} + +impl Rsa<Private> { + /// Creates a new RSA key with private components (public components are assumed). + /// + /// This a convenience method over + /// `Rsa::build(n, e, q)?.set_factors(p, q)?.set_crt_params(dmp1, dmq1, iqmp)?.build()` + pub fn from_private_components( + n: BigNum, + e: BigNum, + d: BigNum, + p: BigNum, + q: BigNum, + dmp1: BigNum, + dmq1: BigNum, + iqmp: BigNum, + ) -> Result<Rsa<Private>, ErrorStack> { + Ok(RsaPrivateKeyBuilder::new(n, e, d)? + .set_factors(p, q)? + .set_crt_params(dmp1, dmq1, iqmp)? + .build()) + } + + /// Creates a new `RsaPrivateKeyBuilder` from the [`RSA_set0_key`] factors. + /// + /// `n` is the modulus common to both public and private key. + /// `e` is the public exponent and `d` is the private exponent. + /// + /// [`RSA_set0_key`]: https://www.openssl.org/docs/man1.1.0/crypto/RSA_set0_key.html + pub fn build( + n: BigNum, + e: BigNum, + d: BigNum + ) -> Result<RsaPrivateKeyBuilder, ErrorStack> { + RsaPrivateKeyBuilder::new(n, e, d) } /// Generates a public/private key pair with the specified size. |