Loading .circleci/config.yml +3 −3 Original line number Diff line number Diff line Loading @@ -17,7 +17,7 @@ save_openssl: &SAVE_OPENSSL paths: - /openssl deps_key: &DEPS_KEY key: deps-1.19.0-{{ checksum "Cargo.lock" }}-{{ checksum "~/lib_key" }}-2 key: deps-1.20.0-{{ checksum "Cargo.lock" }}-{{ checksum "~/lib_key" }}-2 restore_deps: &RESTORE_DEPS restore_cache: <<: *DEPS_KEY Loading @@ -31,7 +31,7 @@ save_deps: &SAVE_DEPS job: &JOB working_directory: ~/build docker: - image: rust:1.19.0 - image: rust:1.20.0 steps: - checkout - run: apt-get update Loading Loading @@ -77,7 +77,7 @@ macos_job: &MACOS_JOB - checkout - run: sudo mkdir /opt - run: sudo chown -R $USER /usr/local /opt - run: curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain 1.19.0 - run: curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain 1.20.0 - run: sudo ln -s $CARGO_HOME/bin/* /usr/local/bin - *RESTORE_REGISTRY - run: cargo generate-lockfile Loading openssl/Cargo.toml +1 −1 Original line number Diff line number Diff line Loading @@ -19,7 +19,7 @@ v102 = [] v110 = [] [dependencies] bitflags = "0.9" bitflags = "1.0" foreign-types = "0.3.1" lazy_static = "1" libc = "0.2" Loading openssl/examples/mk_certs.rs +5 −5 Original line number Diff line number Diff line Loading @@ -4,7 +4,7 @@ extern crate openssl; use openssl::asn1::Asn1Time; use openssl::bn::{BigNum, MSB_MAYBE_ZERO}; use openssl::bn::{BigNum, MsbOption}; use openssl::error::ErrorStack; use openssl::hash::MessageDigest; use openssl::pkey::{PKey, PKeyRef}; Loading @@ -30,7 +30,7 @@ fn mk_ca_cert() -> Result<(X509, PKey), ErrorStack> { cert_builder.set_version(2)?; let serial_number = { let mut serial = BigNum::new()?; serial.rand(159, MSB_MAYBE_ZERO, false)?; serial.rand(159, MsbOption::MAYBE_ZERO, false)?; serial.to_asn1_integer()? }; cert_builder.set_serial_number(&serial_number)?; Loading Loading @@ -88,7 +88,7 @@ fn mk_ca_signed_cert(ca_cert: &X509Ref, ca_privkey: &PKeyRef) -> Result<(X509, P cert_builder.set_version(2)?; let serial_number = { let mut serial = BigNum::new()?; serial.rand(159, MSB_MAYBE_ZERO, false)?; serial.rand(159, MsbOption::MAYBE_ZERO, false)?; serial.to_asn1_integer()? }; cert_builder.set_serial_number(&serial_number)?; Loading @@ -109,8 +109,8 @@ fn mk_ca_signed_cert(ca_cert: &X509Ref, ca_privkey: &PKeyRef) -> Result<(X509, P .key_encipherment() .build()?)?; let subject_key_identifier = SubjectKeyIdentifier::new() .build(&cert_builder.x509v3_context(Some(ca_cert), None))?; let subject_key_identifier = SubjectKeyIdentifier::new().build(&cert_builder.x509v3_context(Some(ca_cert), None))?; cert_builder.append_extension(subject_key_identifier)?; let auth_key_identifier = AuthorityKeyIdentifier::new() Loading openssl/src/bn.rs +19 −17 Original line number Diff line number Diff line Loading @@ -30,16 +30,16 @@ use libc::c_int; use std::cmp::Ordering; use std::ffi::CString; use std::{fmt, ptr}; use std::ops::{Add, Div, Mul, Neg, Rem, Shl, Shr, Sub, Deref}; use std::ops::{Add, Deref, Div, Mul, Neg, Rem, Shl, Shr, Sub}; use {cvt, cvt_p, cvt_n}; use {cvt, cvt_n, cvt_p}; use asn1::Asn1Integer; use error::ErrorStack; use string::OpensslString; #[cfg(ossl10x)] use ffi::{get_rfc2409_prime_768 as BN_get_rfc2409_prime_768, get_rfc2409_prime_1024 as BN_get_rfc2409_prime_1024, use ffi::{get_rfc2409_prime_1024 as BN_get_rfc2409_prime_1024, get_rfc2409_prime_768 as BN_get_rfc2409_prime_768, get_rfc3526_prime_1536 as BN_get_rfc3526_prime_1536, get_rfc3526_prime_2048 as BN_get_rfc3526_prime_2048, get_rfc3526_prime_3072 as BN_get_rfc3526_prime_3072, Loading @@ -48,24 +48,26 @@ use ffi::{get_rfc2409_prime_768 as BN_get_rfc2409_prime_768, get_rfc3526_prime_8192 as BN_get_rfc3526_prime_8192}; #[cfg(ossl110)] use ffi::{BN_get_rfc2409_prime_768, BN_get_rfc2409_prime_1024, BN_get_rfc3526_prime_1536, use ffi::{BN_get_rfc2409_prime_1024, BN_get_rfc2409_prime_768, BN_get_rfc3526_prime_1536, BN_get_rfc3526_prime_2048, BN_get_rfc3526_prime_3072, BN_get_rfc3526_prime_4096, BN_get_rfc3526_prime_6144, BN_get_rfc3526_prime_8192}; /// Options for the most significant bits of a randomly generated `BigNum`. pub struct MsbOption(c_int); impl MsbOption { /// The most significant bit of the number may be 0. pub const MSB_MAYBE_ZERO: MsbOption = MsbOption(-1); pub const MAYBE_ZERO: MsbOption = MsbOption(-1); /// The most significant bit of the number must be 1. pub const MSB_ONE: MsbOption = MsbOption(0); pub const ONE: MsbOption = MsbOption(0); /// The most significant two bits of the number must be 1. /// /// The number of bits in the product of two such numbers will always be exactly twice the number /// of bits in the original numbers. pub const TWO_MSB_ONE: MsbOption = MsbOption(1); /// The number of bits in the product of two such numbers will always be exactly twice the /// number of bits in the original numbers. pub const TWO_ONES: MsbOption = MsbOption(1); } foreign_type_and_impl_send_sync! { type CType = ffi::BN_CTX; Loading Loading @@ -396,14 +398,14 @@ impl BigNumRef { /// # Examples /// /// ``` /// use openssl::bn::{BigNum,MSB_MAYBE_ZERO}; /// use openssl::bn::{BigNum, MsbOption}; /// use openssl::error::ErrorStack; /// /// fn generate_random() -> Result< BigNum, ErrorStack > { /// let mut big = BigNum::new()?; /// /// // Generates a 128-bit odd random number /// big.rand(128, MSB_MAYBE_ZERO, true); /// big.rand(128, MsbOption::MAYBE_ZERO, true); /// Ok((big)) /// } /// ``` Loading Loading @@ -1345,7 +1347,7 @@ impl Neg for BigNum { #[cfg(test)] mod tests { use bn::{BigNumContext, BigNum}; use bn::{BigNum, BigNumContext}; #[test] fn test_to_from_slice() { Loading openssl/src/ec.rs +76 −74 Original line number Diff line number Diff line Loading @@ -20,10 +20,10 @@ //! //! ``` //! use openssl::ec::{EcGroup, EcPoint}; //! use openssl::nid; //! use openssl::nid::Nid; //! use openssl::error::ErrorStack; //! fn get_ec_point() -> Result<EcPoint, ErrorStack> { //! let group = EcGroup::from_curve_name(nid::SECP224R1)?; //! let group = EcGroup::from_curve_name(Nid::SECP224R1)?; //! let point = EcPoint::new(&group)?; //! Ok(point) //! } Loading @@ -38,22 +38,43 @@ use std::mem; use libc::c_int; use {cvt, cvt_n, cvt_p, init}; use bn::{BigNumRef, BigNumContextRef}; use bn::{BigNumContextRef, BigNumRef}; use error::ErrorStack; use nid::Nid; /// Compressed conversion from point value (Default) pub const POINT_CONVERSION_COMPRESSED: PointConversionForm = /// Compressed or Uncompressed conversion /// /// Conversion from the binary value of the point on the curve is performed in one of /// compressed, uncompressed, or hybrid conversions. The default is compressed, except /// for binary curves. /// /// Further documentation is available in the [X9.62] standard. /// /// [X9.62]: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.202.2977&rep=rep1&type=pdf #[derive(Copy, Clone)] pub struct PointConversionForm(ffi::point_conversion_form_t); impl PointConversionForm { /// Compressed conversion from point value. pub const COMPRESSED: PointConversionForm = PointConversionForm(ffi::point_conversion_form_t::POINT_CONVERSION_COMPRESSED); /// Uncompressed conversion from point value (Binary curve default) pub const POINT_CONVERSION_UNCOMPRESSED: PointConversionForm = /// Uncompressed conversion from point value. pub const UNCOMPRESSED: PointConversionForm = PointConversionForm(ffi::point_conversion_form_t::POINT_CONVERSION_UNCOMPRESSED); /// Performs both compressed and uncompressed conversions pub const POINT_CONVERSION_HYBRID: PointConversionForm = /// Performs both compressed and uncompressed conversions. pub const HYBRID: PointConversionForm = PointConversionForm(ffi::point_conversion_form_t::POINT_CONVERSION_HYBRID); } /// Named Curve or Explicit /// /// This type acts as a boolean as to whether the `EcGroup` is named or explicit. #[derive(Copy, Clone)] pub struct Asn1Flag(c_int); impl Asn1Flag { /// Curve defined using polynomial parameters /// /// Most applications use a named EC_GROUP curve, however, support Loading @@ -78,25 +99,7 @@ pub const EXPLICIT_CURVE: Asn1Flag = Asn1Flag(0); /// /// [`EC_GROUP`]: https://www.openssl.org/docs/manmaster/man3/EC_GROUP_order_bits.html pub const NAMED_CURVE: Asn1Flag = Asn1Flag(ffi::OPENSSL_EC_NAMED_CURVE); /// Compressed or Uncompressed conversion /// /// Conversion from the binary value of the point on the curve is performed in one of /// compressed, uncompressed, or hybrid conversions. The default is compressed, except /// for binary curves. /// /// Further documentation is available in the [X9.62] standard. /// /// [X9.62]: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.202.2977&rep=rep1&type=pdf #[derive(Copy, Clone)] pub struct PointConversionForm(ffi::point_conversion_form_t); /// Named Curve or Explicit /// /// This type acts as a boolean as to whether the EC_Group is named or /// explicit. #[derive(Copy, Clone)] pub struct Asn1Flag(c_int); } foreign_type_and_impl_send_sync! { type CType = ffi::EC_GROUP; Loading Loading @@ -606,14 +609,14 @@ impl EcKey { /// ```no_run /// use openssl::bn::BigNumContext; /// use openssl::ec::*; /// use openssl::nid; /// use openssl::nid::Nid; /// use openssl::pkey::PKey; /// /// // get bytes from somewhere, i.e. this will not produce a valid key /// let public_key: Vec<u8> = vec![]; /// /// // create an EcKey from the binary form of a EcPoint /// let group = EcGroup::from_curve_name(nid::SECP256K1).unwrap(); /// let group = EcGroup::from_curve_name(Nid::SECP256K1).unwrap(); /// let mut ctx = BigNumContext::new().unwrap(); /// let point = EcPoint::from_bytes(&group, &public_key, &mut ctx).unwrap(); /// let key = EcKey::from_public_key(&group, &point); Loading Loading @@ -645,7 +648,6 @@ impl EcKey { private_key_from_der!(EcKey, ffi::d2i_ECPrivateKey); } foreign_type_and_impl_send_sync! { type CType = ffi::EC_KEY; fn drop = ffi::EC_KEY_free; Loading Loading @@ -731,18 +733,18 @@ impl EcKeyBuilderRef { #[cfg(test)] mod test { use bn::{BigNum, BigNumContext}; use nid; use nid::Nid; use data_encoding::BASE64URL_NOPAD; use super::*; #[test] fn key_new_by_curve_name() { EcKey::from_curve_name(nid::X9_62_PRIME256V1).unwrap(); EcKey::from_curve_name(Nid::X9_62_PRIME256V1).unwrap(); } #[test] fn generate() { let group = EcGroup::from_curve_name(nid::X9_62_PRIME256V1).unwrap(); let group = EcGroup::from_curve_name(Nid::X9_62_PRIME256V1).unwrap(); let key = EcKey::generate(&group).unwrap(); key.public_key().unwrap(); key.private_key().unwrap(); Loading @@ -750,25 +752,25 @@ mod test { #[test] fn dup() { let group = EcGroup::from_curve_name(nid::X9_62_PRIME256V1).unwrap(); let group = EcGroup::from_curve_name(Nid::X9_62_PRIME256V1).unwrap(); let key = EcKey::generate(&group).unwrap(); key.to_owned().unwrap(); } #[test] fn point_new() { let group = EcGroup::from_curve_name(nid::X9_62_PRIME256V1).unwrap(); let group = EcGroup::from_curve_name(Nid::X9_62_PRIME256V1).unwrap(); EcPoint::new(&group).unwrap(); } #[test] fn point_bytes() { let group = EcGroup::from_curve_name(nid::X9_62_PRIME256V1).unwrap(); let group = EcGroup::from_curve_name(Nid::X9_62_PRIME256V1).unwrap(); let key = EcKey::generate(&group).unwrap(); let point = key.public_key().unwrap(); let mut ctx = BigNumContext::new().unwrap(); let bytes = point .to_bytes(&group, POINT_CONVERSION_COMPRESSED, &mut ctx) .to_bytes(&group, PointConversionForm::COMPRESSED, &mut ctx) .unwrap(); let point2 = EcPoint::from_bytes(&group, &bytes, &mut ctx).unwrap(); assert!(point.eq(&group, &point2, &mut ctx).unwrap()); Loading @@ -776,7 +778,7 @@ mod test { #[test] fn mul_generator() { let group = EcGroup::from_curve_name(nid::X9_62_PRIME256V1).unwrap(); let group = EcGroup::from_curve_name(Nid::X9_62_PRIME256V1).unwrap(); let key = EcKey::generate(&group).unwrap(); let mut ctx = BigNumContext::new().unwrap(); let mut public_key = EcPoint::new(&group).unwrap(); Loading @@ -792,12 +794,12 @@ mod test { #[test] fn key_from_public_key() { let group = EcGroup::from_curve_name(nid::X9_62_PRIME256V1).unwrap(); let group = EcGroup::from_curve_name(Nid::X9_62_PRIME256V1).unwrap(); let key = EcKey::generate(&group).unwrap(); let mut ctx = BigNumContext::new().unwrap(); let bytes = key.public_key() .unwrap() .to_bytes(&group, POINT_CONVERSION_COMPRESSED, &mut ctx) .to_bytes(&group, PointConversionForm::COMPRESSED, &mut ctx) .unwrap(); drop(key); Loading @@ -810,13 +812,13 @@ mod test { #[test] fn key_from_affine_coordinates() { let group = EcGroup::from_curve_name(nid::X9_62_PRIME256V1).unwrap(); let x = BASE64URL_NOPAD.decode( "MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4".as_bytes(), ).unwrap(); let y = BASE64URL_NOPAD.decode( "4Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM".as_bytes(), ).unwrap(); let group = EcGroup::from_curve_name(Nid::X9_62_PRIME256V1).unwrap(); let x = BASE64URL_NOPAD .decode("MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4".as_bytes()) .unwrap(); let y = BASE64URL_NOPAD .decode("4Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM".as_bytes()) .unwrap(); let xbn = BigNum::from_slice(&x).unwrap(); let ybn = BigNum::from_slice(&y).unwrap(); Loading @@ -834,10 +836,10 @@ mod test { #[test] fn set_private_key() { let group = EcGroup::from_curve_name(nid::X9_62_PRIME256V1).unwrap(); let d = BASE64URL_NOPAD.decode( "870MB6gfuTJ4HtUnUvYMyJpr5eUZNP4Bk43bVdj3eAE".as_bytes(), ).unwrap(); let group = EcGroup::from_curve_name(Nid::X9_62_PRIME256V1).unwrap(); let d = BASE64URL_NOPAD .decode("870MB6gfuTJ4HtUnUvYMyJpr5eUZNP4Bk43bVdj3eAE".as_bytes()) .unwrap(); let dbn = BigNum::from_slice(&d).unwrap(); Loading @@ -851,13 +853,13 @@ mod test { #[test] fn get_affine_coordinates() { let group = EcGroup::from_curve_name(nid::X9_62_PRIME256V1).unwrap(); let x = BASE64URL_NOPAD.decode( "MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4".as_bytes(), ).unwrap(); let y = BASE64URL_NOPAD.decode( "4Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM".as_bytes(), ).unwrap(); let group = EcGroup::from_curve_name(Nid::X9_62_PRIME256V1).unwrap(); let x = BASE64URL_NOPAD .decode("MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4".as_bytes()) .unwrap(); let y = BASE64URL_NOPAD .decode("4Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM".as_bytes()) .unwrap(); let xbn = BigNum::from_slice(&x).unwrap(); let ybn = BigNum::from_slice(&y).unwrap(); Loading Loading
.circleci/config.yml +3 −3 Original line number Diff line number Diff line Loading @@ -17,7 +17,7 @@ save_openssl: &SAVE_OPENSSL paths: - /openssl deps_key: &DEPS_KEY key: deps-1.19.0-{{ checksum "Cargo.lock" }}-{{ checksum "~/lib_key" }}-2 key: deps-1.20.0-{{ checksum "Cargo.lock" }}-{{ checksum "~/lib_key" }}-2 restore_deps: &RESTORE_DEPS restore_cache: <<: *DEPS_KEY Loading @@ -31,7 +31,7 @@ save_deps: &SAVE_DEPS job: &JOB working_directory: ~/build docker: - image: rust:1.19.0 - image: rust:1.20.0 steps: - checkout - run: apt-get update Loading Loading @@ -77,7 +77,7 @@ macos_job: &MACOS_JOB - checkout - run: sudo mkdir /opt - run: sudo chown -R $USER /usr/local /opt - run: curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain 1.19.0 - run: curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain 1.20.0 - run: sudo ln -s $CARGO_HOME/bin/* /usr/local/bin - *RESTORE_REGISTRY - run: cargo generate-lockfile Loading
openssl/Cargo.toml +1 −1 Original line number Diff line number Diff line Loading @@ -19,7 +19,7 @@ v102 = [] v110 = [] [dependencies] bitflags = "0.9" bitflags = "1.0" foreign-types = "0.3.1" lazy_static = "1" libc = "0.2" Loading
openssl/examples/mk_certs.rs +5 −5 Original line number Diff line number Diff line Loading @@ -4,7 +4,7 @@ extern crate openssl; use openssl::asn1::Asn1Time; use openssl::bn::{BigNum, MSB_MAYBE_ZERO}; use openssl::bn::{BigNum, MsbOption}; use openssl::error::ErrorStack; use openssl::hash::MessageDigest; use openssl::pkey::{PKey, PKeyRef}; Loading @@ -30,7 +30,7 @@ fn mk_ca_cert() -> Result<(X509, PKey), ErrorStack> { cert_builder.set_version(2)?; let serial_number = { let mut serial = BigNum::new()?; serial.rand(159, MSB_MAYBE_ZERO, false)?; serial.rand(159, MsbOption::MAYBE_ZERO, false)?; serial.to_asn1_integer()? }; cert_builder.set_serial_number(&serial_number)?; Loading Loading @@ -88,7 +88,7 @@ fn mk_ca_signed_cert(ca_cert: &X509Ref, ca_privkey: &PKeyRef) -> Result<(X509, P cert_builder.set_version(2)?; let serial_number = { let mut serial = BigNum::new()?; serial.rand(159, MSB_MAYBE_ZERO, false)?; serial.rand(159, MsbOption::MAYBE_ZERO, false)?; serial.to_asn1_integer()? }; cert_builder.set_serial_number(&serial_number)?; Loading @@ -109,8 +109,8 @@ fn mk_ca_signed_cert(ca_cert: &X509Ref, ca_privkey: &PKeyRef) -> Result<(X509, P .key_encipherment() .build()?)?; let subject_key_identifier = SubjectKeyIdentifier::new() .build(&cert_builder.x509v3_context(Some(ca_cert), None))?; let subject_key_identifier = SubjectKeyIdentifier::new().build(&cert_builder.x509v3_context(Some(ca_cert), None))?; cert_builder.append_extension(subject_key_identifier)?; let auth_key_identifier = AuthorityKeyIdentifier::new() Loading
openssl/src/bn.rs +19 −17 Original line number Diff line number Diff line Loading @@ -30,16 +30,16 @@ use libc::c_int; use std::cmp::Ordering; use std::ffi::CString; use std::{fmt, ptr}; use std::ops::{Add, Div, Mul, Neg, Rem, Shl, Shr, Sub, Deref}; use std::ops::{Add, Deref, Div, Mul, Neg, Rem, Shl, Shr, Sub}; use {cvt, cvt_p, cvt_n}; use {cvt, cvt_n, cvt_p}; use asn1::Asn1Integer; use error::ErrorStack; use string::OpensslString; #[cfg(ossl10x)] use ffi::{get_rfc2409_prime_768 as BN_get_rfc2409_prime_768, get_rfc2409_prime_1024 as BN_get_rfc2409_prime_1024, use ffi::{get_rfc2409_prime_1024 as BN_get_rfc2409_prime_1024, get_rfc2409_prime_768 as BN_get_rfc2409_prime_768, get_rfc3526_prime_1536 as BN_get_rfc3526_prime_1536, get_rfc3526_prime_2048 as BN_get_rfc3526_prime_2048, get_rfc3526_prime_3072 as BN_get_rfc3526_prime_3072, Loading @@ -48,24 +48,26 @@ use ffi::{get_rfc2409_prime_768 as BN_get_rfc2409_prime_768, get_rfc3526_prime_8192 as BN_get_rfc3526_prime_8192}; #[cfg(ossl110)] use ffi::{BN_get_rfc2409_prime_768, BN_get_rfc2409_prime_1024, BN_get_rfc3526_prime_1536, use ffi::{BN_get_rfc2409_prime_1024, BN_get_rfc2409_prime_768, BN_get_rfc3526_prime_1536, BN_get_rfc3526_prime_2048, BN_get_rfc3526_prime_3072, BN_get_rfc3526_prime_4096, BN_get_rfc3526_prime_6144, BN_get_rfc3526_prime_8192}; /// Options for the most significant bits of a randomly generated `BigNum`. pub struct MsbOption(c_int); impl MsbOption { /// The most significant bit of the number may be 0. pub const MSB_MAYBE_ZERO: MsbOption = MsbOption(-1); pub const MAYBE_ZERO: MsbOption = MsbOption(-1); /// The most significant bit of the number must be 1. pub const MSB_ONE: MsbOption = MsbOption(0); pub const ONE: MsbOption = MsbOption(0); /// The most significant two bits of the number must be 1. /// /// The number of bits in the product of two such numbers will always be exactly twice the number /// of bits in the original numbers. pub const TWO_MSB_ONE: MsbOption = MsbOption(1); /// The number of bits in the product of two such numbers will always be exactly twice the /// number of bits in the original numbers. pub const TWO_ONES: MsbOption = MsbOption(1); } foreign_type_and_impl_send_sync! { type CType = ffi::BN_CTX; Loading Loading @@ -396,14 +398,14 @@ impl BigNumRef { /// # Examples /// /// ``` /// use openssl::bn::{BigNum,MSB_MAYBE_ZERO}; /// use openssl::bn::{BigNum, MsbOption}; /// use openssl::error::ErrorStack; /// /// fn generate_random() -> Result< BigNum, ErrorStack > { /// let mut big = BigNum::new()?; /// /// // Generates a 128-bit odd random number /// big.rand(128, MSB_MAYBE_ZERO, true); /// big.rand(128, MsbOption::MAYBE_ZERO, true); /// Ok((big)) /// } /// ``` Loading Loading @@ -1345,7 +1347,7 @@ impl Neg for BigNum { #[cfg(test)] mod tests { use bn::{BigNumContext, BigNum}; use bn::{BigNum, BigNumContext}; #[test] fn test_to_from_slice() { Loading
openssl/src/ec.rs +76 −74 Original line number Diff line number Diff line Loading @@ -20,10 +20,10 @@ //! //! ``` //! use openssl::ec::{EcGroup, EcPoint}; //! use openssl::nid; //! use openssl::nid::Nid; //! use openssl::error::ErrorStack; //! fn get_ec_point() -> Result<EcPoint, ErrorStack> { //! let group = EcGroup::from_curve_name(nid::SECP224R1)?; //! let group = EcGroup::from_curve_name(Nid::SECP224R1)?; //! let point = EcPoint::new(&group)?; //! Ok(point) //! } Loading @@ -38,22 +38,43 @@ use std::mem; use libc::c_int; use {cvt, cvt_n, cvt_p, init}; use bn::{BigNumRef, BigNumContextRef}; use bn::{BigNumContextRef, BigNumRef}; use error::ErrorStack; use nid::Nid; /// Compressed conversion from point value (Default) pub const POINT_CONVERSION_COMPRESSED: PointConversionForm = /// Compressed or Uncompressed conversion /// /// Conversion from the binary value of the point on the curve is performed in one of /// compressed, uncompressed, or hybrid conversions. The default is compressed, except /// for binary curves. /// /// Further documentation is available in the [X9.62] standard. /// /// [X9.62]: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.202.2977&rep=rep1&type=pdf #[derive(Copy, Clone)] pub struct PointConversionForm(ffi::point_conversion_form_t); impl PointConversionForm { /// Compressed conversion from point value. pub const COMPRESSED: PointConversionForm = PointConversionForm(ffi::point_conversion_form_t::POINT_CONVERSION_COMPRESSED); /// Uncompressed conversion from point value (Binary curve default) pub const POINT_CONVERSION_UNCOMPRESSED: PointConversionForm = /// Uncompressed conversion from point value. pub const UNCOMPRESSED: PointConversionForm = PointConversionForm(ffi::point_conversion_form_t::POINT_CONVERSION_UNCOMPRESSED); /// Performs both compressed and uncompressed conversions pub const POINT_CONVERSION_HYBRID: PointConversionForm = /// Performs both compressed and uncompressed conversions. pub const HYBRID: PointConversionForm = PointConversionForm(ffi::point_conversion_form_t::POINT_CONVERSION_HYBRID); } /// Named Curve or Explicit /// /// This type acts as a boolean as to whether the `EcGroup` is named or explicit. #[derive(Copy, Clone)] pub struct Asn1Flag(c_int); impl Asn1Flag { /// Curve defined using polynomial parameters /// /// Most applications use a named EC_GROUP curve, however, support Loading @@ -78,25 +99,7 @@ pub const EXPLICIT_CURVE: Asn1Flag = Asn1Flag(0); /// /// [`EC_GROUP`]: https://www.openssl.org/docs/manmaster/man3/EC_GROUP_order_bits.html pub const NAMED_CURVE: Asn1Flag = Asn1Flag(ffi::OPENSSL_EC_NAMED_CURVE); /// Compressed or Uncompressed conversion /// /// Conversion from the binary value of the point on the curve is performed in one of /// compressed, uncompressed, or hybrid conversions. The default is compressed, except /// for binary curves. /// /// Further documentation is available in the [X9.62] standard. /// /// [X9.62]: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.202.2977&rep=rep1&type=pdf #[derive(Copy, Clone)] pub struct PointConversionForm(ffi::point_conversion_form_t); /// Named Curve or Explicit /// /// This type acts as a boolean as to whether the EC_Group is named or /// explicit. #[derive(Copy, Clone)] pub struct Asn1Flag(c_int); } foreign_type_and_impl_send_sync! { type CType = ffi::EC_GROUP; Loading Loading @@ -606,14 +609,14 @@ impl EcKey { /// ```no_run /// use openssl::bn::BigNumContext; /// use openssl::ec::*; /// use openssl::nid; /// use openssl::nid::Nid; /// use openssl::pkey::PKey; /// /// // get bytes from somewhere, i.e. this will not produce a valid key /// let public_key: Vec<u8> = vec![]; /// /// // create an EcKey from the binary form of a EcPoint /// let group = EcGroup::from_curve_name(nid::SECP256K1).unwrap(); /// let group = EcGroup::from_curve_name(Nid::SECP256K1).unwrap(); /// let mut ctx = BigNumContext::new().unwrap(); /// let point = EcPoint::from_bytes(&group, &public_key, &mut ctx).unwrap(); /// let key = EcKey::from_public_key(&group, &point); Loading Loading @@ -645,7 +648,6 @@ impl EcKey { private_key_from_der!(EcKey, ffi::d2i_ECPrivateKey); } foreign_type_and_impl_send_sync! { type CType = ffi::EC_KEY; fn drop = ffi::EC_KEY_free; Loading Loading @@ -731,18 +733,18 @@ impl EcKeyBuilderRef { #[cfg(test)] mod test { use bn::{BigNum, BigNumContext}; use nid; use nid::Nid; use data_encoding::BASE64URL_NOPAD; use super::*; #[test] fn key_new_by_curve_name() { EcKey::from_curve_name(nid::X9_62_PRIME256V1).unwrap(); EcKey::from_curve_name(Nid::X9_62_PRIME256V1).unwrap(); } #[test] fn generate() { let group = EcGroup::from_curve_name(nid::X9_62_PRIME256V1).unwrap(); let group = EcGroup::from_curve_name(Nid::X9_62_PRIME256V1).unwrap(); let key = EcKey::generate(&group).unwrap(); key.public_key().unwrap(); key.private_key().unwrap(); Loading @@ -750,25 +752,25 @@ mod test { #[test] fn dup() { let group = EcGroup::from_curve_name(nid::X9_62_PRIME256V1).unwrap(); let group = EcGroup::from_curve_name(Nid::X9_62_PRIME256V1).unwrap(); let key = EcKey::generate(&group).unwrap(); key.to_owned().unwrap(); } #[test] fn point_new() { let group = EcGroup::from_curve_name(nid::X9_62_PRIME256V1).unwrap(); let group = EcGroup::from_curve_name(Nid::X9_62_PRIME256V1).unwrap(); EcPoint::new(&group).unwrap(); } #[test] fn point_bytes() { let group = EcGroup::from_curve_name(nid::X9_62_PRIME256V1).unwrap(); let group = EcGroup::from_curve_name(Nid::X9_62_PRIME256V1).unwrap(); let key = EcKey::generate(&group).unwrap(); let point = key.public_key().unwrap(); let mut ctx = BigNumContext::new().unwrap(); let bytes = point .to_bytes(&group, POINT_CONVERSION_COMPRESSED, &mut ctx) .to_bytes(&group, PointConversionForm::COMPRESSED, &mut ctx) .unwrap(); let point2 = EcPoint::from_bytes(&group, &bytes, &mut ctx).unwrap(); assert!(point.eq(&group, &point2, &mut ctx).unwrap()); Loading @@ -776,7 +778,7 @@ mod test { #[test] fn mul_generator() { let group = EcGroup::from_curve_name(nid::X9_62_PRIME256V1).unwrap(); let group = EcGroup::from_curve_name(Nid::X9_62_PRIME256V1).unwrap(); let key = EcKey::generate(&group).unwrap(); let mut ctx = BigNumContext::new().unwrap(); let mut public_key = EcPoint::new(&group).unwrap(); Loading @@ -792,12 +794,12 @@ mod test { #[test] fn key_from_public_key() { let group = EcGroup::from_curve_name(nid::X9_62_PRIME256V1).unwrap(); let group = EcGroup::from_curve_name(Nid::X9_62_PRIME256V1).unwrap(); let key = EcKey::generate(&group).unwrap(); let mut ctx = BigNumContext::new().unwrap(); let bytes = key.public_key() .unwrap() .to_bytes(&group, POINT_CONVERSION_COMPRESSED, &mut ctx) .to_bytes(&group, PointConversionForm::COMPRESSED, &mut ctx) .unwrap(); drop(key); Loading @@ -810,13 +812,13 @@ mod test { #[test] fn key_from_affine_coordinates() { let group = EcGroup::from_curve_name(nid::X9_62_PRIME256V1).unwrap(); let x = BASE64URL_NOPAD.decode( "MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4".as_bytes(), ).unwrap(); let y = BASE64URL_NOPAD.decode( "4Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM".as_bytes(), ).unwrap(); let group = EcGroup::from_curve_name(Nid::X9_62_PRIME256V1).unwrap(); let x = BASE64URL_NOPAD .decode("MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4".as_bytes()) .unwrap(); let y = BASE64URL_NOPAD .decode("4Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM".as_bytes()) .unwrap(); let xbn = BigNum::from_slice(&x).unwrap(); let ybn = BigNum::from_slice(&y).unwrap(); Loading @@ -834,10 +836,10 @@ mod test { #[test] fn set_private_key() { let group = EcGroup::from_curve_name(nid::X9_62_PRIME256V1).unwrap(); let d = BASE64URL_NOPAD.decode( "870MB6gfuTJ4HtUnUvYMyJpr5eUZNP4Bk43bVdj3eAE".as_bytes(), ).unwrap(); let group = EcGroup::from_curve_name(Nid::X9_62_PRIME256V1).unwrap(); let d = BASE64URL_NOPAD .decode("870MB6gfuTJ4HtUnUvYMyJpr5eUZNP4Bk43bVdj3eAE".as_bytes()) .unwrap(); let dbn = BigNum::from_slice(&d).unwrap(); Loading @@ -851,13 +853,13 @@ mod test { #[test] fn get_affine_coordinates() { let group = EcGroup::from_curve_name(nid::X9_62_PRIME256V1).unwrap(); let x = BASE64URL_NOPAD.decode( "MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4".as_bytes(), ).unwrap(); let y = BASE64URL_NOPAD.decode( "4Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM".as_bytes(), ).unwrap(); let group = EcGroup::from_curve_name(Nid::X9_62_PRIME256V1).unwrap(); let x = BASE64URL_NOPAD .decode("MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4".as_bytes()) .unwrap(); let y = BASE64URL_NOPAD .decode("4Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM".as_bytes()) .unwrap(); let xbn = BigNum::from_slice(&x).unwrap(); let ybn = BigNum::from_slice(&y).unwrap(); Loading