aboutsummaryrefslogtreecommitdiff
path: root/openssl/src/ec.rs
diff options
context:
space:
mode:
authorSteven Fackler <[email protected]>2017-12-25 20:24:24 -0800
committerGitHub <[email protected]>2017-12-25 20:24:24 -0800
commit90d8a799fe331d4ec4a9c12e86d1d8f4e32c6f6e (patch)
tree2f7496f93e3cb67b09b5cc58d085f3fc5accde3b /openssl/src/ec.rs
parentMerge pull request #795 from sfackler/host-overhaul (diff)
parentTweak default ssl options (diff)
downloadrust-openssl-90d8a799fe331d4ec4a9c12e86d1d8f4e32c6f6e.tar.xz
rust-openssl-90d8a799fe331d4ec4a9c12e86d1d8f4e32c6f6e.zip
Merge pull request #796 from sfackler/assoc-consts
Associated consts
Diffstat (limited to 'openssl/src/ec.rs')
-rw-r--r--openssl/src/ec.rs150
1 files changed, 76 insertions, 74 deletions
diff --git a/openssl/src/ec.rs b/openssl/src/ec.rs
index 97b095d0..7f1721ce 100644
--- a/openssl/src/ec.rs
+++ b/openssl/src/ec.rs
@@ -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)?;
+//! fn get_ec_point() -> Result<EcPoint, ErrorStack> {
+//! let group = EcGroup::from_curve_name(Nid::SECP224R1)?;
//! let point = EcPoint::new(&group)?;
//! Ok(point)
//! }
@@ -38,47 +38,10 @@ 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 =
- PointConversionForm(ffi::point_conversion_form_t::POINT_CONVERSION_COMPRESSED);
-
-/// Uncompressed conversion from point value (Binary curve default)
-pub const POINT_CONVERSION_UNCOMPRESSED: PointConversionForm =
- PointConversionForm(ffi::point_conversion_form_t::POINT_CONVERSION_UNCOMPRESSED);
-
-/// Performs both compressed and uncompressed conversions
-pub const POINT_CONVERSION_HYBRID: PointConversionForm =
- PointConversionForm(ffi::point_conversion_form_t::POINT_CONVERSION_HYBRID);
-
-/// Curve defined using polynomial parameters
-///
-/// Most applications use a named EC_GROUP curve, however, support
-/// is included to explicitly define the curve used to calculate keys
-/// This information would need to be known by both endpoint to make communication
-/// effective.
-///
-/// OPENSSL_EC_EXPLICIT_CURVE, but that was only added in 1.1.
-/// Man page documents that 0 can be used in older versions.
-///
-/// OpenSSL documentation at [`EC_GROUP`]
-///
-/// [`EC_GROUP`]: https://www.openssl.org/docs/man1.1.0/crypto/EC_GROUP_get_seed_len.html
-pub const EXPLICIT_CURVE: Asn1Flag = Asn1Flag(0);
-
-/// Standard Curves
-///
-/// Curves that make up the typical encryption use cases. The collection of curves
-/// are well known but extensible.
-///
-/// OpenSSL documentation at [`EC_GROUP`]
-///
-/// [`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
@@ -91,13 +54,53 @@ pub const NAMED_CURVE: Asn1Flag = Asn1Flag(ffi::OPENSSL_EC_NAMED_CURVE);
#[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.
+ pub const UNCOMPRESSED: PointConversionForm =
+ PointConversionForm(ffi::point_conversion_form_t::POINT_CONVERSION_UNCOMPRESSED);
+
+ /// 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 EC_Group is named 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
+ /// is included to explicitly define the curve used to calculate keys
+ /// This information would need to be known by both endpoint to make communication
+ /// effective.
+ ///
+ /// OPENSSL_EC_EXPLICIT_CURVE, but that was only added in 1.1.
+ /// Man page documents that 0 can be used in older versions.
+ ///
+ /// OpenSSL documentation at [`EC_GROUP`]
+ ///
+ /// [`EC_GROUP`]: https://www.openssl.org/docs/man1.1.0/crypto/EC_GROUP_get_seed_len.html
+ pub const EXPLICIT_CURVE: Asn1Flag = Asn1Flag(0);
+
+ /// Standard Curves
+ ///
+ /// Curves that make up the typical encryption use cases. The collection of curves
+ /// are well known but extensible.
+ ///
+ /// OpenSSL documentation at [`EC_GROUP`]
+ ///
+ /// [`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);
+}
+
foreign_type_and_impl_send_sync! {
type CType = ffi::EC_GROUP;
fn drop = ffi::EC_GROUP_free;
@@ -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);
@@ -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;
@@ -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();
@@ -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());
@@ -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();
@@ -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);
@@ -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();
@@ -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();
@@ -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();