use crate::error::Result;
use crate::kasn1::{oid, DerEncBigUint, DerEncOctetString, Version};
use crate::pkcs11;
use asn1;
include! {"pyca/pkcs.rs"}
#[derive(asn1::Asn1Read, asn1::Asn1Write)]
pub enum ECParameters<'a> {
OId(asn1::ObjectIdentifier),
ImplicitlyCA(asn1::Null),
CurveName(asn1::PrintableString<'a>),
}
#[derive(asn1::Asn1Read, asn1::Asn1Write)]
pub struct ECPrivateKey<'a> {
version: Version,
pub private_key: DerEncOctetString<'a>,
#[explicit(0)]
parameters: Option<ECParameters<'a>>,
#[explicit(1)]
public_key: Option<asn1::BitString<'a>>,
}
impl ECPrivateKey<'_> {
pub fn new_owned<'a>(private_key: &'a Vec<u8>) -> Result<ECPrivateKey<'a>> {
Ok(ECPrivateKey {
version: 1,
private_key: DerEncOctetString::new(private_key.as_slice())?,
parameters: None,
public_key: None,
})
}
}
#[derive(
asn1::Asn1Read, asn1::Asn1Write, PartialEq, Eq, Hash, Clone, Debug,
)]
pub struct PBMAC1Params<'a> {
pub key_derivation_func: Box<AlgorithmIdentifier<'a>>,
pub message_auth_scheme: Box<AlgorithmIdentifier<'a>>,
}
pub const HMAC_SHA_256_ALG: AlgorithmIdentifier<'_> = AlgorithmIdentifier {
oid: asn1::DefinedByMarker::marker(),
params: AlgorithmParameters::HmacWithSha256(Some(())),
};
pub const RSA_ALG: AlgorithmIdentifier<'_> = AlgorithmIdentifier {
oid: asn1::DefinedByMarker::marker(),
params: AlgorithmParameters::Rsa(Some(())),
};
pub const EC_SECP256R1_ALG: AlgorithmIdentifier<'_> = AlgorithmIdentifier {
oid: asn1::DefinedByMarker::marker(),
params: AlgorithmParameters::Ec(EcParameters::NamedCurve(
oid::EC_SECP256R1,
)),
};
pub const EC_SECP384R1_ALG: AlgorithmIdentifier<'_> = AlgorithmIdentifier {
oid: asn1::DefinedByMarker::marker(),
params: AlgorithmParameters::Ec(EcParameters::NamedCurve(
oid::EC_SECP384R1,
)),
};
pub const EC_SECP521R1_ALG: AlgorithmIdentifier<'_> = AlgorithmIdentifier {
oid: asn1::DefinedByMarker::marker(),
params: AlgorithmParameters::Ec(EcParameters::NamedCurve(
oid::EC_SECP521R1,
)),
};
pub const ED25519_ALG: AlgorithmIdentifier<'_> = AlgorithmIdentifier {
oid: asn1::DefinedByMarker::marker(),
params: AlgorithmParameters::Ed25519,
};
pub const ED448_ALG: AlgorithmIdentifier<'_> = AlgorithmIdentifier {
oid: asn1::DefinedByMarker::marker(),
params: AlgorithmParameters::Ed448,
};
pub const X25519_ALG: AlgorithmIdentifier<'_> = AlgorithmIdentifier {
oid: asn1::DefinedByMarker::marker(),
params: AlgorithmParameters::X25519,
};
pub const X448_ALG: AlgorithmIdentifier<'_> = AlgorithmIdentifier {
oid: asn1::DefinedByMarker::marker(),
params: AlgorithmParameters::X448,
};
pub const MLDSA44_ALG: AlgorithmIdentifier<'_> = AlgorithmIdentifier {
oid: asn1::DefinedByMarker::marker(),
params: AlgorithmParameters::Mldsa44,
};
pub const MLDSA65_ALG: AlgorithmIdentifier<'_> = AlgorithmIdentifier {
oid: asn1::DefinedByMarker::marker(),
params: AlgorithmParameters::Mldsa65,
};
pub const MLDSA87_ALG: AlgorithmIdentifier<'_> = AlgorithmIdentifier {
oid: asn1::DefinedByMarker::marker(),
params: AlgorithmParameters::Mldsa87,
};
pub const MLKEM512_ALG: AlgorithmIdentifier<'_> = AlgorithmIdentifier {
oid: asn1::DefinedByMarker::marker(),
params: AlgorithmParameters::MlKem512,
};
pub const MLKEM768_ALG: AlgorithmIdentifier<'_> = AlgorithmIdentifier {
oid: asn1::DefinedByMarker::marker(),
params: AlgorithmParameters::MlKem768,
};
pub const MLKEM1024_ALG: AlgorithmIdentifier<'_> = AlgorithmIdentifier {
oid: asn1::DefinedByMarker::marker(),
params: AlgorithmParameters::MlKem1024,
};
pub const SLHDSA_SHA2_128S_ALG: AlgorithmIdentifier<'_> = AlgorithmIdentifier {
oid: asn1::DefinedByMarker::marker(),
params: AlgorithmParameters::SlhdsaSha2128s,
};
pub const SLHDSA_SHAKE_128S_ALG: AlgorithmIdentifier<'_> =
AlgorithmIdentifier {
oid: asn1::DefinedByMarker::marker(),
params: AlgorithmParameters::SlhdsaShake128s,
};
pub const SLHDSA_SHA2_128F_ALG: AlgorithmIdentifier<'_> = AlgorithmIdentifier {
oid: asn1::DefinedByMarker::marker(),
params: AlgorithmParameters::SlhdsaSha2128f,
};
pub const SLHDSA_SHAKE_128F_ALG: AlgorithmIdentifier<'_> =
AlgorithmIdentifier {
oid: asn1::DefinedByMarker::marker(),
params: AlgorithmParameters::SlhdsaShake128f,
};
pub const SLHDSA_SHA2_192S_ALG: AlgorithmIdentifier<'_> = AlgorithmIdentifier {
oid: asn1::DefinedByMarker::marker(),
params: AlgorithmParameters::SlhdsaSha2192s,
};
pub const SLHDSA_SHAKE_192S_ALG: AlgorithmIdentifier<'_> =
AlgorithmIdentifier {
oid: asn1::DefinedByMarker::marker(),
params: AlgorithmParameters::SlhdsaShake192s,
};
pub const SLHDSA_SHA2_192F_ALG: AlgorithmIdentifier<'_> = AlgorithmIdentifier {
oid: asn1::DefinedByMarker::marker(),
params: AlgorithmParameters::SlhdsaSha2192f,
};
pub const SLHDSA_SHAKE_192F_ALG: AlgorithmIdentifier<'_> =
AlgorithmIdentifier {
oid: asn1::DefinedByMarker::marker(),
params: AlgorithmParameters::SlhdsaShake192f,
};
pub const SLHDSA_SHA2_256S_ALG: AlgorithmIdentifier<'_> = AlgorithmIdentifier {
oid: asn1::DefinedByMarker::marker(),
params: AlgorithmParameters::SlhdsaSha2256s,
};
pub const SLHDSA_SHAKE_256S_ALG: AlgorithmIdentifier<'_> =
AlgorithmIdentifier {
oid: asn1::DefinedByMarker::marker(),
params: AlgorithmParameters::SlhdsaShake256s,
};
pub const SLHDSA_SHA2_256F_ALG: AlgorithmIdentifier<'_> = AlgorithmIdentifier {
oid: asn1::DefinedByMarker::marker(),
params: AlgorithmParameters::SlhdsaSha2256f,
};
pub const SLHDSA_SHAKE_256F_ALG: AlgorithmIdentifier<'_> =
AlgorithmIdentifier {
oid: asn1::DefinedByMarker::marker(),
params: AlgorithmParameters::SlhdsaShake256f,
};
impl SubjectPublicKeyInfo<'_> {
pub fn new<'a>(
alg: AlgorithmIdentifier<'a>,
pubkey: &'a [u8],
) -> Result<SubjectPublicKeyInfo<'a>> {
Ok(SubjectPublicKeyInfo {
algorithm: alg,
subject_public_key: asn1::BitString::new(pubkey, 0)
.ok_or(pkcs11::CKR_GENERAL_ERROR)?,
})
}
pub fn serialize(&self) -> Result<Vec<u8>> {
match asn1::write_single(self) {
Ok(der) => Ok(der),
Err(_) => Err(pkcs11::CKR_GENERAL_ERROR)?,
}
}
}
#[derive(asn1::Asn1Read, asn1::Asn1Write)]
pub struct RsaPublicKey<'a> {
modulus: DerEncBigUint<'a>,
public_exponent: DerEncBigUint<'a>,
}
impl RsaPublicKey<'_> {
pub fn new<'a>(
modulus: &'a Vec<u8>,
public_exponent: &'a Vec<u8>,
) -> Result<RsaPublicKey<'a>> {
Ok(RsaPublicKey {
modulus: DerEncBigUint::new(modulus.as_slice())?,
public_exponent: DerEncBigUint::new(public_exponent.as_slice())?,
})
}
pub fn serialize(&self) -> Result<Vec<u8>> {
match asn1::write_single(self) {
Ok(der) => Ok(der),
Err(_) => Err(pkcs11::CKR_GENERAL_ERROR)?,
}
}
}