Ready to get PKCS7 envelopped data len
This commit is contained in:
parent
0880c09947
commit
69e4b75f3f
@ -4,11 +4,16 @@ use anyhow::Context;
|
|||||||
use tempfile::NamedTempFile;
|
use tempfile::NamedTempFile;
|
||||||
|
|
||||||
#[derive(Debug, Default)]
|
#[derive(Debug, Default)]
|
||||||
pub struct SCEPEnvelopedPayload {
|
pub struct SCEPRequest {
|
||||||
cn: String,
|
cn: String,
|
||||||
alt_name: String,
|
alt_name: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Default)]
|
||||||
|
pub struct SCEPResponse {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/// Parse asn1 content
|
/// Parse asn1 content
|
||||||
fn parse_asn1(openssl: &str, req: &[u8]) -> anyhow::Result<String> {
|
fn parse_asn1(openssl: &str, req: &[u8]) -> anyhow::Result<String> {
|
||||||
let mut tmpfile: NamedTempFile = NamedTempFile::new()?;
|
let mut tmpfile: NamedTempFile = NamedTempFile::new()?;
|
||||||
@ -27,13 +32,13 @@ fn parse_asn1(openssl: &str, req: &[u8]) -> anyhow::Result<String> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Decode SCEP request
|
/// Decode SCEP request
|
||||||
pub fn decode_request(openssl: &str, req: &[u8]) -> anyhow::Result<SCEPEnvelopedPayload> {
|
pub fn decode_request(openssl: &str, req: &[u8]) -> anyhow::Result<SCEPRequest> {
|
||||||
let output = parse_asn1(openssl, req)?;
|
let output = parse_asn1(openssl, req)?;
|
||||||
let output = output.trim().replace('\r', "");
|
let output = output.trim().replace('\r', "");
|
||||||
log::debug!("ASN1 request output: {output}");
|
log::debug!("ASN1 request output: {output}");
|
||||||
let lines = output.split('\n').collect::<Vec<&str>>();
|
let lines = output.split('\n').collect::<Vec<&str>>();
|
||||||
|
|
||||||
let mut res = SCEPEnvelopedPayload::default();
|
let mut res = SCEPRequest::default();
|
||||||
|
|
||||||
for (num, line) in lines.iter().enumerate() {
|
for (num, line) in lines.iter().enumerate() {
|
||||||
// Extract common name
|
// Extract common name
|
||||||
@ -60,6 +65,45 @@ pub fn decode_request(openssl: &str, req: &[u8]) -> anyhow::Result<SCEPEnveloped
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Ok(res)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Decode SCEP response
|
||||||
|
pub fn decode_response(openssl: &str, res: &[u8]) -> anyhow::Result<SCEPResponse> {
|
||||||
|
let output = parse_asn1(openssl, res)?;
|
||||||
|
let output = output.trim().replace('\r', "");
|
||||||
|
log::debug!("ASN1 response output: {output}");
|
||||||
|
let lines = output.split('\n').collect::<Vec<&str>>();
|
||||||
|
|
||||||
|
let mut byte_string = String::new();
|
||||||
|
|
||||||
|
// Extract PKCS7 payload
|
||||||
|
let mut extracting = false;
|
||||||
|
for (num, line) in lines.iter().enumerate() {
|
||||||
|
// Wait for payload
|
||||||
|
if !extracting {
|
||||||
|
if !line.contains(":pkcs7-data") {
|
||||||
|
extracting = true;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if line.contains("EOC") {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if !line.contains("[HEX DUMP]:") {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
byte_string.push_str(&line.split_once("[HEX DUMP]:").unwrap().1);
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut res = SCEPResponse::default();
|
||||||
|
let pkcs7_data = hex::decode(byte_string.trim()).context("Decode PKCS7")?;
|
||||||
|
|
||||||
|
let pkcs7_decoded = parse_asn1(openssl, &pkcs7_data)?;
|
||||||
|
println!("{}", pkcs7_decoded);
|
||||||
|
|
||||||
Ok(res)
|
Ok(res)
|
||||||
}
|
}
|
@ -4,7 +4,7 @@ use url::Url;
|
|||||||
use base64::prelude::*;
|
use base64::prelude::*;
|
||||||
use base64::engine::general_purpose::URL_SAFE as BASE64_URL_URL_SAFE;
|
use base64::engine::general_purpose::URL_SAFE as BASE64_URL_URL_SAFE;
|
||||||
use colored::Colorize;
|
use colored::Colorize;
|
||||||
use scep_req_parser::asn_parsing::decode_request;
|
use scep_req_parser::asn_parsing::{decode_request, decode_response};
|
||||||
use scep_req_parser::http_decoder::{parse_request, parse_response};
|
use scep_req_parser::http_decoder::{parse_request, parse_response};
|
||||||
|
|
||||||
/// Simple SCEP parser program
|
/// Simple SCEP parser program
|
||||||
@ -85,7 +85,9 @@ fn main() {
|
|||||||
|
|
||||||
if op == Operation::PKIOperation {
|
if op == Operation::PKIOperation {
|
||||||
let req = decode_request(&args.openssl_command, request.body()).expect("Failed to decode request!");
|
let req = decode_request(&args.openssl_command, request.body()).expect("Failed to decode request!");
|
||||||
|
let res = decode_response(&args.openssl_command, response.body()).expect("Failed to decode response!");
|
||||||
println!("{req:?}");
|
println!("{req:?}");
|
||||||
|
println!("{res:?}");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user