# asn1dump
**Repository Path**: oldprincess/asn1dump
## Basic Information
- **Project Name**: asn1dump
- **Description**: An application for printing ASN1 syntax data, supporting PEM and DER
- **Primary Language**: C
- **License**: BSD-3-Clause
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2023-03-08
- **Last Updated**: 2023-03-08
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# ASN1DUMP
[English README file](README.EN.md)
asn1打印工具,支持解析PEM或DER格式的数据,并输出以ASN1格式。
关于ASN1的基础知识可参考Miscrosoft的 [相关文档](https://learn.microsoft.com/en-us/windows/win32/seccertenroll/distinguished-encoding-rules)
## 1. 快速开始
```text
│ asn1.h 外部接口头文件
│ appmain.c APP应用程序(控制台)
│ demo.c 样例代码
│ main.c 主函数
│
└─lib 代码目录
asn1_der.c ASN1与DER/PEM转化
asn1_dump.c 打印ASN1数据
asn1_inner.c ASN1函数
asn1_inner.h ASN1函数
mString.c 字符串处理函数
mString.h 字符串处理函数
```
编译样例
```text
gcc -o asn1dump.exe *.c lib/*.c
```
命令行参数
```text
asn1dump -in -from
```
## 2. 运行效果/测试
**注**:本节测试所使用的文件均已放置在*test*目录下。
使用OPENSSL生成PEM和DER格式文件
```text
# 生成1024比特的RSA密钥,PEM格式
$ openssl genrsa -out rsa_skey.pem 1024
# 将密钥转化为传统(traditional)格式
$ openssl rsa -in rsa_skey.pem -out rsa_skey_t.pem -outform pem -traditional
# 将PEM格式密钥转化为DER格式
$ openssl rsa -in rsa_skey.pem -out rsa_skey.der -outform der
# 创建一个证书请求
$ openssl req -new -key rsa_skey.der -out rsa.csr
```
测试解析PEM和DER文件
* 使用OPENSSL打印密钥信息
```text
# openssl rsa -in rsa_skey_t.pem -noout -text
# openssl rsa -in rsa_skey.der -noout -text
$ openssl rsa -in rsa_skey.pem -noout -text
Private-Key: (1024 bit, 2 primes)
modulus:
00:a1:5b:8b:ae:38:e7:c8:cd:77:68:00:3c:dc:90:
c8:69:e8:b9:a3:82:0d:3c:99:33:d8:94:92:c8:8d:
67:9f:c6:30:f7:61:a4:26:a9:da:27:fa:e6:05:09:
8f:1e:75:58:5d:c8:be:ab:da:26:a4:8c:04:5f:dd:
88:78:69:73:89:d5:cd:57:0a:2c:2e:5d:de:21:cc:
27:0f:08:a5:a1:5c:85:d2:e1:15:15:3e:c6:6a:14:
b4:a2:ec:ca:58:7b:05:5b:dc:47:b7:17:44:ab:84:
b0:3b:f2:50:93:54:42:ba:a8:f1:24:6f:13:48:f4:
89:80:a0:5f:86:c2:ab:f6:5d
publicExponent: 65537 (0x10001)
privateExponent:
```
* 使用asn1dump打印密钥信息
```text
# asn1dump.exe -in rsa_skey.pem -from PEM
$ asn1dump.exe -in rsa_skey.der -from DER
30 82 02 77 ; SEQUENCE (631 Bytes)
02 01 ; INTEGER (1 Bytes)
| 00
30 0d ; SEQUENCE (13 Bytes)
06 09 ; OBJECT_IDENTIFIER (9 Bytes)
| 2a 86 48 86 f7 0d 01 01 01 ; *.H......
05 00 ; NULL (0 Bytes)
04 82 02 61 ; OCTET_STRING (609 Bytes)
| 30 82 02 5d 02 01 00 02 81 81 ; 0..]......
| 00 a1 5b 8b ae 38 e7 c8 cd 77 ; ..[..8...w
```
```text
$ asn1dump.exe -in rsa_skey_t.pem -from PEM
30 82 02 5d ; SEQUENCE (605 Bytes)
02 01 ; INTEGER (1 Bytes)
| 00
02 81 81 ; INTEGER (129 Bytes)
| 00 a1 5b 8b ae 38 e7 c8 cd 77
```
测试解析证书请求CSR
* 使用OPENSSL打印CSR
```text
$ openssl req -in rsa.csr -noout -text
Certificate Request:
Data:
Version: 1 (0x0)
Subject: C = CN, ST = Some-State, O = Internet Widgits Pty Ltd, CN = oldprincess
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (1024 bit)
Modulus:
00:a1:5b:8b:ae:38:e7:c8:cd:77:68:00:3c:dc:90:
c8:69:e8:b9:a3:82:0d:3c:99:33:d8:94:92:c8:8d:
```
* 使用asn1dump打印CSR
```text
$ asn1dump.exe -in rsa.csr -from PEM
30 82 01 9b ; SEQUENCE (411 Bytes)
30 82 01 04 ; SEQUENCE (260 Bytes)
02 01 ; INTEGER (1 Bytes)
| 00
30 5b ; SEQUENCE (91 Bytes)
31 0b ; SET (11 Bytes)
```
## 3. 使用asn1.h编程
ASN1每个节点为tag、length、value三元组,代码中定义ASN1_NODE类型,除了上述内容外,还包括该节点原始数据raw_data与长度total_length。此外,ASN1节点与节点间的关系,除了处于同一层的并列关系外,SEQUENCE和SET这类节点还存在孩子节点,即还有父子关系。nxt指针为同一层的节点,child指针为SEQUENCE/SET的内部节点(孩子节点)。
```c
typedef struct ASN1_NODE {
//
const ASN1_TAG* tag;
uint32_t length;
uint8_t* value;
uint8_t* raw_data;
size_t total_length;
struct ASN1_NODE* nxt; // next Node(in the same depth)
struct ASN1_NODE* child; // for SEQUENCE/SET
} ASN1_NODE;
```
其余的内容可参考asn1.h文件与demo.c