Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Convert PEM RSA public key to JWK format (imcomplete)
use clap::{crate_authors, crate_version, App, Arg};
use simple_asn1::ASN1Block;
use std::fs;
use std::io::prelude::*;
use std::str;
fn main() {
let matches = App::new("view-ans1")
.version(crate_version!())
.author(crate_authors!())
.arg(
Arg::with_name("ans1")
.index(1)
.takes_value(true)
.required(true)
.help("Ans.1 encoded file"),
)
.arg(
Arg::with_name("pem")
.long("pem")
.short("p")
.help("PEM file"),
)
.get_matches();
let mut buffer = Vec::new();
fs::File::open(matches.value_of("ans1").unwrap())
.unwrap()
.read_to_end(&mut buffer)
.unwrap();
let parsed = pem::parse(&buffer).unwrap();
let decoded = simple_asn1::from_der(&parsed.contents).unwrap();
print_ans1(&decoded, 0);
if let ASN1Block::Sequence(_, s) = &decoded[0] {
println!("data: {:?}", s[1]);
if let ASN1Block::BitString(a, b, d) = &s[1] {
let new_decoded = simple_asn1::from_der(&d).unwrap();
//println!("base64: {}", base64_url::encode(&d));
if let ASN1Block::Sequence(_, s) = &new_decoded[0] {
println!("new data: {:?}", s[0]);
if let ASN1Block::Integer(_, i) = &s[0] {
let b = i.to_bytes_be();
println!("base64: {}", base64_url::encode(&b.1)); // JWK: n entry
}
} else {
unreachable!()
}
} else {
unreachable!()
}
} else {
unreachable!()
}
}
fn print_ans1(data: &[ASN1Block], indent: u32) {
let mut indent_str = String::new();
for _ in 0..indent {
indent_str.push_str(" ");
}
for one in data {
match one {
ASN1Block::Sequence(s, d) => {
println!("{}sequence [{}]:", indent_str, s);
print_ans1(d, indent + 1);
}
_ => {
println!("{}{:?}", indent_str, one);
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.