#![cfg(feature = "signatures")]
use der::oid::db::rfc5912::{ID_SHA_1, ID_SHA_256, ID_SHA_384, ID_SHA_512};
use der::oid::ObjectIdentifier;
use sha1::Sha1;
use sha2::{Digest, Sha256, Sha384, Sha512};
use super::timestamp::HashAlgorithm;
pub(super) fn hash_with_oid(oid: ObjectIdentifier, msg: &[u8]) -> Option<Vec<u8>> {
if oid == ID_SHA_1 {
Some(Sha1::digest(msg).to_vec())
} else if oid == ID_SHA_256 {
Some(Sha256::digest(msg).to_vec())
} else if oid == ID_SHA_384 {
Some(Sha384::digest(msg).to_vec())
} else if oid == ID_SHA_512 {
Some(Sha512::digest(msg).to_vec())
} else {
None
}
}
#[cfg(feature = "tsa-client")]
pub(super) fn hash_with_algorithm(algo: HashAlgorithm, data: &[u8]) -> Vec<u8> {
match algo {
HashAlgorithm::Sha1 => Sha1::digest(data).to_vec(),
HashAlgorithm::Sha256 | HashAlgorithm::Unknown => Sha256::digest(data).to_vec(),
HashAlgorithm::Sha384 => Sha384::digest(data).to_vec(),
HashAlgorithm::Sha512 => Sha512::digest(data).to_vec(),
}
}
pub(super) fn hash_algorithm_from_oid(oid: ObjectIdentifier) -> HashAlgorithm {
if oid == ID_SHA_256 {
HashAlgorithm::Sha256
} else if oid == ID_SHA_384 {
HashAlgorithm::Sha384
} else if oid == ID_SHA_512 {
HashAlgorithm::Sha512
} else if oid == ID_SHA_1 {
HashAlgorithm::Sha1
} else {
HashAlgorithm::Unknown
}
}
#[cfg(feature = "tsa-client")]
pub(super) fn oid_for_algorithm(algo: HashAlgorithm) -> Option<ObjectIdentifier> {
match algo {
HashAlgorithm::Sha1 => Some(ID_SHA_1),
HashAlgorithm::Sha256 => Some(ID_SHA_256),
HashAlgorithm::Sha384 => Some(ID_SHA_384),
HashAlgorithm::Sha512 => Some(ID_SHA_512),
HashAlgorithm::Unknown => None,
}
}
const DIGEST_INFO_SHA1: &[u8] = &[
0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x05, 0x00, 0x04, 0x14,
];
const DIGEST_INFO_SHA256: &[u8] = &[
0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05,
0x00, 0x04, 0x20,
];
const DIGEST_INFO_SHA384: &[u8] = &[
0x30, 0x41, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x02, 0x05,
0x00, 0x04, 0x30,
];
const DIGEST_INFO_SHA512: &[u8] = &[
0x30, 0x51, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03, 0x05,
0x00, 0x04, 0x40,
];
pub(super) fn digest_info_prefix(oid: ObjectIdentifier) -> Option<&'static [u8]> {
if oid == ID_SHA_1 {
Some(DIGEST_INFO_SHA1)
} else if oid == ID_SHA_256 {
Some(DIGEST_INFO_SHA256)
} else if oid == ID_SHA_384 {
Some(DIGEST_INFO_SHA384)
} else if oid == ID_SHA_512 {
Some(DIGEST_INFO_SHA512)
} else {
None
}
}
pub(super) const OID_RSA_ENCRYPTION: ObjectIdentifier =
ObjectIdentifier::new_unwrap("1.2.840.113549.1.1.1");
const OID_SHA1_RSA: ObjectIdentifier = ObjectIdentifier::new_unwrap("1.2.840.113549.1.1.5");
const OID_SHA256_RSA: ObjectIdentifier = ObjectIdentifier::new_unwrap("1.2.840.113549.1.1.11");
const OID_SHA384_RSA: ObjectIdentifier = ObjectIdentifier::new_unwrap("1.2.840.113549.1.1.12");
const OID_SHA512_RSA: ObjectIdentifier = ObjectIdentifier::new_unwrap("1.2.840.113549.1.1.13");
pub(super) fn is_rsa_pkcs1v15_sig_oid(oid: ObjectIdentifier) -> bool {
oid == OID_SHA1_RSA
|| oid == OID_SHA256_RSA
|| oid == OID_SHA384_RSA
|| oid == OID_SHA512_RSA
|| oid == OID_RSA_ENCRYPTION
}