From 0b5bda2266c1d7e226b3b24233a9c1e4bd614473 Mon Sep 17 00:00:00 2001 From: Daniel James Date: Tue, 14 Sep 2021 12:45:23 -0700 Subject: [PATCH] Add pem_rfc7468::decode_label Decode the encapsulation boundaries of a PEM document, returning the label. The motivation is to capture the document label in the case of an error (by repeating the decoding only to extract the label) --- pem-rfc7468/src/decoder.rs | 6 ++++++ pem-rfc7468/src/lib.rs | 2 +- pem-rfc7468/tests/decode.rs | 4 ++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/pem-rfc7468/src/decoder.rs b/pem-rfc7468/src/decoder.rs index d0bf5d64e..7d0c84cc8 100644 --- a/pem-rfc7468/src/decoder.rs +++ b/pem-rfc7468/src/decoder.rs @@ -44,6 +44,12 @@ fn decode_encapsulated_text<'i, 'o>( } Ok(()) } +/// Decode the encapsulation boundaries of a PEM document according to RFC 7468's "Strict" grammar. +/// +/// On success, returning the decoded label. +pub fn decode_label(pem: &[u8]) -> Result<&str> { + Ok(Encapsulation::try_from(pem)?.label()) +} /// Decode a PEM document according to RFC 7468's "Strict" grammar. /// diff --git a/pem-rfc7468/src/lib.rs b/pem-rfc7468/src/lib.rs index defd0a805..b58fee369 100644 --- a/pem-rfc7468/src/lib.rs +++ b/pem-rfc7468/src/lib.rs @@ -112,7 +112,7 @@ mod error; mod grammar; pub use crate::{ - decoder::decode, + decoder::{decode, decode_label}, encoder::{encode, encoded_len, LineEnding}, error::{Error, Result}, }; diff --git a/pem-rfc7468/tests/decode.rs b/pem-rfc7468/tests/decode.rs index 20e4b09df..6b2c571b1 100644 --- a/pem-rfc7468/tests/decode.rs +++ b/pem-rfc7468/tests/decode.rs @@ -17,6 +17,8 @@ fn pkcs1_enc_example() { Err(pem_rfc7468::Error::HeaderDetected) => (), _ => panic!("Expected HeaderDetected error"), } + let label = pem_rfc7468::decode_label(pem).unwrap(); + assert_eq!(label, "RSA PRIVATE KEY"); } #[test] @@ -37,6 +39,8 @@ fn header_of_length_64() { Err(pem_rfc7468::Error::HeaderDetected) => (), _ => panic!("Expected HeaderDetected error"), } + let label = pem_rfc7468::decode_label(pem).unwrap(); + assert_eq!(label, "RSA PRIVATE KEY"); } #[test]