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

pub fn key_size(&self) -> usize

Return the key size (in bits) or 0

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

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.