From 9e6ca1d182e9db49304a6a46536ec0ab8d067518 Mon Sep 17 00:00:00 2001 From: daxpedda Date: Mon, 19 Jul 2021 13:04:12 +0200 Subject: [PATCH] EC Edward and Montgomery support Signed-off-by: daxpedda --- cryptoki-sys/pkcs11.h | 1 + cryptoki-sys/src/lib.rs | 4 ++++ cryptoki/src/types/mechanism/mod.rs | 18 ++++++++++++++++++ cryptoki/src/types/object.rs | 10 ++++++++++ 4 files changed, 33 insertions(+) diff --git a/cryptoki-sys/pkcs11.h b/cryptoki-sys/pkcs11.h index 4d8c3651..1cdfb1e5 100644 --- a/cryptoki-sys/pkcs11.h +++ b/cryptoki-sys/pkcs11.h @@ -884,6 +884,7 @@ typedef unsigned long ck_mechanism_type_t; /* From version 3.0 */ #define CKM_EC_EDWARDS_KEY_PAIR_GEN (0x1055UL) +#define CKM_EC_MONTGOMERY_KEY_PAIR_GEN (0x1056UL) #define CKM_EDDSA (0x1057UL) /* Attribute and other constants related to OTP */ diff --git a/cryptoki-sys/src/lib.rs b/cryptoki-sys/src/lib.rs index e076c40b..8d506ce2 100644 --- a/cryptoki-sys/src/lib.rs +++ b/cryptoki-sys/src/lib.rs @@ -180,6 +180,8 @@ pub const CKK_SEED: CK_KEY_TYPE = 0x0000002F; pub const CKK_GOSTR3410: CK_KEY_TYPE = 0x00000030; pub const CKK_GOSTR3411: CK_KEY_TYPE = 0x00000031; pub const CKK_GOST28147: CK_KEY_TYPE = 0x00000032; +pub const CKK_EC_EDWARDS: CK_KEY_TYPE = 0x00000040; +pub const CKK_EC_MONTGOMERY: CK_KEY_TYPE = 0x00000041; pub const CKK_VENDOR_DEFINED: CK_KEY_TYPE = 0x80000000; pub const CKC_X_509: CK_CERTIFICATE_TYPE = 0x00000000; pub const CKC_X_509_ATTR_CERT: CK_CERTIFICATE_TYPE = 0x00000001; @@ -621,6 +623,8 @@ pub const CKM_AES_KEY_WRAP: CK_MECHANISM_TYPE = 0x00002109; pub const CKM_AES_KEY_WRAP_PAD: CK_MECHANISM_TYPE = 0x0000210A; pub const CKM_RSA_PKCS_TPM_1_1: CK_MECHANISM_TYPE = 0x00004001; pub const CKM_RSA_PKCS_OAEP_TPM_1_1: CK_MECHANISM_TYPE = 0x00004002; +pub const CKM_EC_EDWARDS_KEY_PAIR_GEN: CK_MECHANISM_TYPE = 0x00001055; +pub const CKM_EC_MONTGOMERY_KEY_PAIR_GEN: CK_MECHANISM_TYPE = 0x00001056; pub const CK_OTP_FORMAT_DECIMAL: CK_ULONG = 0; pub const CK_OTP_FORMAT_HEXADECIMAL: CK_ULONG = 1; pub const CK_OTP_FORMAT_ALPHANUMERIC: CK_ULONG = 2; diff --git a/cryptoki/src/types/mechanism/mod.rs b/cryptoki/src/types/mechanism/mod.rs index 69ab5532..aaf5ed72 100644 --- a/cryptoki/src/types/mechanism/mod.rs +++ b/cryptoki/src/types/mechanism/mod.rs @@ -47,6 +47,14 @@ impl MechanismType { pub const ECC_KEY_PAIR_GEN: MechanismType = MechanismType { val: CKM_EC_KEY_PAIR_GEN, }; + /// EC edwards key pair generation mechanism + pub const ECC_EDWARDS_KEY_PAIR_GEN: MechanismType = MechanismType { + val: CKM_EC_EDWARDS_KEY_PAIR_GEN, + }; + /// EC montgomery key pair generation mechanism + pub const ECC_MONTGOMERY_KEY_PAIR_GEN: MechanismType = MechanismType { + val: CKM_EC_MONTGOMERY_KEY_PAIR_GEN, + }; /// ECDH key derivation mechanism pub const ECDH1_DERIVE: MechanismType = MechanismType { @@ -109,6 +117,8 @@ impl TryFrom for MechanismType { CKM_SHA384 => Ok(MechanismType::SHA384), CKM_SHA512 => Ok(MechanismType::SHA512), CKM_EC_KEY_PAIR_GEN => Ok(MechanismType::ECC_KEY_PAIR_GEN), + CKM_EC_EDWARDS_KEY_PAIR_GEN => Ok(MechanismType::ECC_EDWARDS_KEY_PAIR_GEN), + CKM_EC_MONTGOMERY_KEY_PAIR_GEN => Ok(MechanismType::ECC_MONTGOMERY_KEY_PAIR_GEN), CKM_ECDH1_DERIVE => Ok(MechanismType::ECDH1_DERIVE), CKM_ECDSA => Ok(MechanismType::ECDSA), CKM_SHA256_RSA_PKCS => Ok(MechanismType::SHA256_RSA_PKCS), @@ -142,6 +152,10 @@ pub enum Mechanism { // ECC /// EC key pair generation EccKeyPairGen, + /// EC edwards key pair generation + EccEdwardsKeyPairGen, + /// EC montgomery key pair generation + EccMontgomeryKeyPairGen, /// ECDH Ecdh1Derive(elliptic_curve::Ecdh1DeriveParams), /// ECDSA mechanism @@ -176,6 +190,8 @@ impl Mechanism { Mechanism::RsaPkcsOaep(_) => MechanismType::RSA_PKCS_OAEP, Mechanism::EccKeyPairGen => MechanismType::ECC_KEY_PAIR_GEN, + Mechanism::EccEdwardsKeyPairGen => MechanismType::ECC_EDWARDS_KEY_PAIR_GEN, + Mechanism::EccMontgomeryKeyPairGen => MechanismType::ECC_MONTGOMERY_KEY_PAIR_GEN, Mechanism::Ecdh1Derive(_) => MechanismType::ECDH1_DERIVE, Mechanism::Ecdsa => MechanismType::ECDSA, @@ -224,6 +240,8 @@ impl From<&Mechanism> for CK_MECHANISM { | Mechanism::Sha384 | Mechanism::Sha512 | Mechanism::EccKeyPairGen + | Mechanism::EccEdwardsKeyPairGen + | Mechanism::EccMontgomeryKeyPairGen | Mechanism::Ecdsa | Mechanism::Sha256RsaPkcs | Mechanism::Sha384RsaPkcs diff --git a/cryptoki/src/types/object.rs b/cryptoki/src/types/object.rs index ba19025c..21e3602e 100644 --- a/cryptoki/src/types/object.rs +++ b/cryptoki/src/types/object.rs @@ -518,6 +518,14 @@ impl KeyType { pub const RSA: KeyType = KeyType { val: CKK_RSA }; /// EC key pub const EC: KeyType = KeyType { val: CKK_EC }; + /// EC edwards key + pub const EC_EDWARDS: KeyType = KeyType { + val: CKK_EC_EDWARDS, + }; + /// EC montgomery key + pub const EC_MONTGOMERY: KeyType = KeyType { + val: CKK_EC_MONTGOMERY, + }; /// Generic secret pub const GENERIC_SECRET: KeyType = KeyType { val: CKK_GENERIC_SECRET, @@ -545,6 +553,8 @@ impl TryFrom for KeyType { match key_type { CKK_RSA => Ok(KeyType::RSA), CKK_EC => Ok(KeyType::EC), + CKK_EC_EDWARDS => Ok(KeyType::EC_EDWARDS), + CKK_EC_MONTGOMERY => Ok(KeyType::EC_MONTGOMERY), CKK_GENERIC_SECRET => Ok(KeyType::GENERIC_SECRET), other => { error!("Key type {} is not supported.", other);