RSAPublicKey

Struct RSAPublicKey 

Source
pub struct RSAPublicKey<'a> {
    pub modulus: &'a [u8],
    pub exponent: &'a [u8],
}
Expand description

RSA public Key, defined in rfc3279

Fields§

§modulus: &'a [u8]

Raw bytes of the modulus

This possibly includes a leading 0 if the MSB is 1

§exponent: &'a [u8]

Raw bytes of the exponent

This possibly includes a leading 0 if the MSB is 1

Implementations§

Source§

impl RSAPublicKey<'_>

Source

pub fn try_exponent(&self) -> Result<u64, X509Error>

Attempt to convert exponent to u64

Returns an error if integer is too large, empty, or negative

Examples found in repository?
examples/print-cert.rs (line 303)
293fn print_x509_ski(public_key: &SubjectPublicKeyInfo) {
294    println!("    Public Key Algorithm:");
295    print_x509_digest_algorithm(&public_key.algorithm, 6);
296    match public_key.parsed() {
297        Ok(PublicKey::RSA(rsa)) => {
298            println!("    RSA Public Key: ({} bit)", rsa.key_size());
299            // print_hex_dump(rsa.modulus, 1024);
300            for l in format_number_to_hex_with_colon(rsa.modulus, 16) {
301                println!("        {l}");
302            }
303            if let Ok(e) = rsa.try_exponent() {
304                println!("    exponent: 0x{e:x} ({e})");
305            } else {
306                println!("    exponent: <INVALID>:");
307                print_hex_dump(rsa.exponent, 32);
308            }
309        }
310        Ok(PublicKey::EC(ec)) => {
311            println!("    EC Public Key: ({} bit)", ec.key_size());
312            for l in format_number_to_hex_with_colon(ec.data(), 16) {
313                println!("        {l}");
314            }
315            // // identify curve
316            // if let Some(params) = &public_key.algorithm.parameters {
317            //     let curve_oid = params.as_oid();
318            //     let curve = curve_oid
319            //         .map(|oid| {
320            //             oid_registry()
321            //                 .get(oid)
322            //                 .map(|entry| entry.sn())
323            //                 .unwrap_or("<UNKNOWN>")
324            //         })
325            //         .unwrap_or("<ERROR: NOT AN OID>");
326            //     println!("    Curve: {}", curve);
327            // }
328        }
329        Ok(PublicKey::DSA(y)) => {
330            println!("    DSA Public Key: ({} bit)", 8 * y.len());
331            for l in format_number_to_hex_with_colon(y, 16) {
332                println!("        {l}");
333            }
334        }
335        Ok(PublicKey::GostR3410(y)) => {
336            println!("    GOST R 34.10-94 Public Key: ({} bit)", 8 * y.len());
337            for l in format_number_to_hex_with_colon(y, 16) {
338                println!("        {l}");
339            }
340        }
341        Ok(PublicKey::GostR3410_2012(y)) => {
342            println!("    GOST R 34.10-2012 Public Key: ({} bit)", 8 * y.len());
343            for l in format_number_to_hex_with_colon(y, 16) {
344                println!("        {l}");
345            }
346        }
347        Ok(PublicKey::Unknown(b)) => {
348            println!("    Unknown key type");
349            print_hex_dump(b, 256);
350            if let Ok((rem, res)) = der_parser::parse_der(b) {
351                eprintln!("rem: {} bytes", rem.len());
352                eprintln!("{res:?}");
353            } else {
354                eprintln!("      <Could not parse key as DER>");
355            }
356        }
357        Err(_) => {
358            println!("    INVALID PUBLIC KEY");
359        }
360    }
361    // dbg!(&public_key);
362    // todo!();
363}
Source

pub fn key_size(&self) -> usize

Return the key size (in bits) or 0

Examples found in repository?
examples/print-cert.rs (line 298)
293fn print_x509_ski(public_key: &SubjectPublicKeyInfo) {
294    println!("    Public Key Algorithm:");
295    print_x509_digest_algorithm(&public_key.algorithm, 6);
296    match public_key.parsed() {
297        Ok(PublicKey::RSA(rsa)) => {
298            println!("    RSA Public Key: ({} bit)", rsa.key_size());
299            // print_hex_dump(rsa.modulus, 1024);
300            for l in format_number_to_hex_with_colon(rsa.modulus, 16) {
301                println!("        {l}");
302            }
303            if let Ok(e) = rsa.try_exponent() {
304                println!("    exponent: 0x{e:x} ({e})");
305            } else {
306                println!("    exponent: <INVALID>:");
307                print_hex_dump(rsa.exponent, 32);
308            }
309        }
310        Ok(PublicKey::EC(ec)) => {
311            println!("    EC Public Key: ({} bit)", ec.key_size());
312            for l in format_number_to_hex_with_colon(ec.data(), 16) {
313                println!("        {l}");
314            }
315            // // identify curve
316            // if let Some(params) = &public_key.algorithm.parameters {
317            //     let curve_oid = params.as_oid();
318            //     let curve = curve_oid
319            //         .map(|oid| {
320            //             oid_registry()
321            //                 .get(oid)
322            //                 .map(|entry| entry.sn())
323            //                 .unwrap_or("<UNKNOWN>")
324            //         })
325            //         .unwrap_or("<ERROR: NOT AN OID>");
326            //     println!("    Curve: {}", curve);
327            // }
328        }
329        Ok(PublicKey::DSA(y)) => {
330            println!("    DSA Public Key: ({} bit)", 8 * y.len());
331            for l in format_number_to_hex_with_colon(y, 16) {
332                println!("        {l}");
333            }
334        }
335        Ok(PublicKey::GostR3410(y)) => {
336            println!("    GOST R 34.10-94 Public Key: ({} bit)", 8 * y.len());
337            for l in format_number_to_hex_with_colon(y, 16) {
338                println!("        {l}");
339            }
340        }
341        Ok(PublicKey::GostR3410_2012(y)) => {
342            println!("    GOST R 34.10-2012 Public Key: ({} bit)", 8 * y.len());
343            for l in format_number_to_hex_with_colon(y, 16) {
344                println!("        {l}");
345            }
346        }
347        Ok(PublicKey::Unknown(b)) => {
348            println!("    Unknown key type");
349            print_hex_dump(b, 256);
350            if let Ok((rem, res)) = der_parser::parse_der(b) {
351                eprintln!("rem: {} bytes", rem.len());
352                eprintln!("{res:?}");
353            } else {
354                eprintln!("      <Could not parse key as DER>");
355            }
356        }
357        Err(_) => {
358            println!("    INVALID PUBLIC KEY");
359        }
360    }
361    // dbg!(&public_key);
362    // todo!();
363}

Trait Implementations§

Source§

impl<'a> Debug for RSAPublicKey<'a>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'a> FromDer<'a, X509Error> for RSAPublicKey<'a>

Source§

fn from_der(bytes: &'a [u8]) -> X509Result<'a, Self>

Attempt to parse input bytes into a DER object (enforcing constraints)
Source§

impl<'a> PartialEq for RSAPublicKey<'a>

Source§

fn eq(&self, other: &RSAPublicKey<'a>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl<'a> Eq for RSAPublicKey<'a>

Source§

impl<'a> StructuralPartialEq for RSAPublicKey<'a>

Auto Trait Implementations§

§

impl<'a> Freeze for RSAPublicKey<'a>

§

impl<'a> RefUnwindSafe for RSAPublicKey<'a>

§

impl<'a> Send for RSAPublicKey<'a>

§

impl<'a> Sync for RSAPublicKey<'a>

§

impl<'a> Unpin for RSAPublicKey<'a>

§

impl<'a> UnwindSafe for RSAPublicKey<'a>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

Source§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

Source§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

Source§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.