mirror of
https://github.com/Drop-OSS/droplet.git
synced 2025-11-24 05:31:48 +10:00
feat: no panik
This commit is contained in:
59
src/ssl.rs
59
src/ssl.rs
@ -1,3 +1,4 @@
|
||||
use anyhow::anyhow;
|
||||
use napi::Error;
|
||||
use rcgen::{
|
||||
CertificateParams, DistinguishedName, IsCa, KeyPair, KeyUsagePurpose, PublicKeyData,
|
||||
@ -10,7 +11,7 @@ use x509_parser::parse_x509_certificate;
|
||||
use x509_parser::pem::Pem;
|
||||
|
||||
#[napi]
|
||||
pub fn generate_root_ca() -> Result<Vec<String>, Error> {
|
||||
pub fn generate_root_ca() -> anyhow::Result<Vec<String>> {
|
||||
let mut params = CertificateParams::default();
|
||||
|
||||
let mut name = DistinguishedName::new();
|
||||
@ -22,7 +23,7 @@ pub fn generate_root_ca() -> Result<Vec<String>, Error> {
|
||||
params.not_before = OffsetDateTime::now_utc();
|
||||
params.not_after = OffsetDateTime::now_utc()
|
||||
.checked_add(Duration::days(365 * 1000))
|
||||
.unwrap();
|
||||
.ok_or(anyhow!("failed to calculate end date"))?;
|
||||
|
||||
params.is_ca = IsCa::Ca(rcgen::BasicConstraints::Unconstrained);
|
||||
|
||||
@ -32,9 +33,8 @@ pub fn generate_root_ca() -> Result<Vec<String>, Error> {
|
||||
KeyUsagePurpose::DigitalSignature,
|
||||
];
|
||||
|
||||
let key_pair = KeyPair::generate().map_err(|e| napi::Error::from_reason(e.to_string()))?;
|
||||
let certificate = CertificateParams::self_signed(params, &key_pair)
|
||||
.map_err(|e| napi::Error::from_reason(e.to_string()))?;
|
||||
let key_pair = KeyPair::generate()?;
|
||||
let certificate = CertificateParams::self_signed(params, &key_pair)?;
|
||||
|
||||
// Returns certificate, then private key
|
||||
Ok(vec![certificate.pem(), key_pair.serialize_pem()])
|
||||
@ -46,13 +46,10 @@ pub fn generate_client_certificate(
|
||||
_client_name: String,
|
||||
root_ca: String,
|
||||
root_ca_private: String,
|
||||
) -> Result<Vec<String>, Error> {
|
||||
let root_key_pair =
|
||||
KeyPair::from_pem(&root_ca_private).map_err(|e| napi::Error::from_reason(e.to_string()))?;
|
||||
let certificate_params = CertificateParams::from_ca_cert_pem(&root_ca)
|
||||
.map_err(|e| napi::Error::from_reason(e.to_string()))?;
|
||||
let root_ca = CertificateParams::self_signed(certificate_params, &root_key_pair)
|
||||
.map_err(|e| napi::Error::from_reason(e.to_string()))?;
|
||||
) -> anyhow::Result<Vec<String>> {
|
||||
let root_key_pair = KeyPair::from_pem(&root_ca_private)?;
|
||||
let certificate_params = CertificateParams::from_ca_cert_pem(&root_ca)?;
|
||||
let root_ca = CertificateParams::self_signed(certificate_params, &root_key_pair)?;
|
||||
|
||||
let mut params = CertificateParams::default();
|
||||
|
||||
@ -66,28 +63,24 @@ pub fn generate_client_certificate(
|
||||
KeyUsagePurpose::DataEncipherment,
|
||||
];
|
||||
|
||||
let key_pair = KeyPair::generate_for(&rcgen::PKCS_ECDSA_P384_SHA384)
|
||||
.map_err(|e| napi::Error::from_reason(e.to_string()))?;
|
||||
let certificate = CertificateParams::signed_by(params, &key_pair, &root_ca, &root_key_pair)
|
||||
.map_err(|e| napi::Error::from_reason(e.to_string()))?;
|
||||
let key_pair = KeyPair::generate_for(&rcgen::PKCS_ECDSA_P384_SHA384)?;
|
||||
let certificate = CertificateParams::signed_by(params, &key_pair, &root_ca, &root_key_pair)?;
|
||||
|
||||
// Returns certificate, then private key
|
||||
Ok(vec![certificate.pem(), key_pair.serialize_pem()])
|
||||
}
|
||||
|
||||
#[napi]
|
||||
pub fn verify_client_certificate(client_cert: String, root_ca: String) -> Result<bool, Error> {
|
||||
pub fn verify_client_certificate(client_cert: String, root_ca: String) -> anyhow::Result<bool> {
|
||||
let root_ca = Pem::iter_from_buffer(root_ca.as_bytes())
|
||||
.next()
|
||||
.unwrap()
|
||||
.unwrap();
|
||||
let root_ca = root_ca.parse_x509().unwrap();
|
||||
.ok_or(anyhow!("no certificates in root ca"))??;
|
||||
let root_ca = root_ca.parse_x509()?;
|
||||
|
||||
let client_cert = Pem::iter_from_buffer(client_cert.as_bytes())
|
||||
.next()
|
||||
.unwrap()
|
||||
.unwrap();
|
||||
let client_cert = client_cert.parse_x509().unwrap();
|
||||
.ok_or(anyhow!("No client certs in chain."))??;
|
||||
let client_cert = client_cert.parse_x509()?;
|
||||
|
||||
let valid = root_ca
|
||||
.verify_signature(Some(client_cert.public_key()))
|
||||
@ -97,31 +90,33 @@ pub fn verify_client_certificate(client_cert: String, root_ca: String) -> Result
|
||||
}
|
||||
|
||||
#[napi]
|
||||
pub fn sign_nonce(private_key: String, nonce: String) -> Result<String, Error> {
|
||||
pub fn sign_nonce(private_key: String, nonce: String) -> anyhow::Result<String> {
|
||||
let rng = SystemRandom::new();
|
||||
|
||||
let key_pair = KeyPair::from_pem(&private_key).unwrap();
|
||||
let key_pair = KeyPair::from_pem(&private_key)?;
|
||||
|
||||
let key_pair = EcdsaKeyPair::from_pkcs8(
|
||||
&ring::signature::ECDSA_P384_SHA384_FIXED_SIGNING,
|
||||
&key_pair.serialize_der(),
|
||||
&rng,
|
||||
)
|
||||
.unwrap();
|
||||
.map_err(|e| napi::Error::from_reason(e.to_string()))?;
|
||||
|
||||
let signature = key_pair.sign(&rng, nonce.as_bytes()).unwrap();
|
||||
let signature = key_pair
|
||||
.sign(&rng, nonce.as_bytes())
|
||||
.map_err(|e| napi::Error::from_reason(e.to_string()))?;
|
||||
let hex_signature = hex::encode(signature);
|
||||
|
||||
Ok(hex_signature)
|
||||
}
|
||||
|
||||
#[napi]
|
||||
pub fn verify_nonce(public_cert: String, nonce: String, signature: String) -> Result<bool, Error> {
|
||||
let (_, pem) = x509_parser::pem::parse_x509_pem(public_cert.as_bytes()).unwrap();
|
||||
let (_, spki) = parse_x509_certificate(&pem.contents).unwrap();
|
||||
let public_key = SubjectPublicKeyInfo::from_der(spki.public_key().raw).unwrap();
|
||||
pub fn verify_nonce(public_cert: String, nonce: String, signature: String) -> anyhow::Result<bool> {
|
||||
let (_, pem) = x509_parser::pem::parse_x509_pem(public_cert.as_bytes())?;
|
||||
let (_, spki) = parse_x509_certificate(&pem.contents)?;
|
||||
let public_key = SubjectPublicKeyInfo::from_der(spki.public_key().raw)?;
|
||||
|
||||
let raw_signature = hex::decode(signature).unwrap();
|
||||
let raw_signature = hex::decode(signature)?;
|
||||
|
||||
let valid = ring::signature::ECDSA_P384_SHA384_FIXED
|
||||
.verify(
|
||||
|
||||
Reference in New Issue
Block a user