Commit 52c942f4 authored by Moritz Wanzenböck's avatar Moritz Wanzenböck
Browse files

Add methods to access private and public part of DSA keys

parent 6440ee04
Loading
Loading
Loading
Loading
+43 −1
Original line number Diff line number Diff line
@@ -13,7 +13,7 @@ use std::ptr;

use bn::BigNumRef;
use error::ErrorStack;
use pkey::{HasParams, HasPublic, Private, Public};
use pkey::{HasParams, HasPrivate, HasPublic, Private, Public};
use {cvt, cvt_p};

generic_foreign_type_and_impl_send_sync! {
@@ -83,6 +83,28 @@ where
        public_key_to_der,
        ffi::i2d_DSA_PUBKEY
    }

    /// Returns a reference to the public exponent.
    pub fn pub_key(&self) -> &BigNumRef {
        unsafe {
            let mut pub_key = ptr::null();
            DSA_get0_key(self.as_ptr(), &mut pub_key, ptr::null_mut());
            BigNumRef::from_ptr(pub_key as *mut _)
        }
    }
}

impl<T> DsaRef<T>
where
    T: HasPrivate,
{
    pub fn priv_key(&self) -> &BigNumRef {
        unsafe {
            let mut priv_key = ptr::null();
            DSA_get0_key(self.as_ptr(), ptr::null_mut(), &mut priv_key);
            BigNumRef::from_ptr(priv_key as *mut _)
        }
    }
}

impl<T> DsaRef<T>
@@ -211,6 +233,26 @@ cfg_if! {
    }
}

cfg_if! {
    if #[cfg(any(ossl110, libressl273))] {
        use ffi::DSA_get0_key;
    } else {
        #[allow(bad_style)]
        unsafe fn DSA_get0_pqg(
            d: *mut ffi::DSA,
            pub_key: *mut *const ffi::BIGNUM,
            priv_key: *mut *const ffi::BIGNUM)
        {
            if !pub_key.is_null() {
                *pub_key = (*d).pub_key;
            }
            if !priv_key.is_null() {
                *priv_key = (*d).priv_key;
            }
        }
    }
}

#[cfg(test)]
mod test {
    use super::*;