9 #define RSAPRIVHEADER "-----BEGIN RSA PRIVATE KEY-----"
10 #define RSAPRIVFOOTER "-----END RSA PRIVATE KEY-----"
19 rsapem_init(const char *pemstr
)
21 rsapem_t
*rsapem
=NULL
;
28 header
= strstr(pemstr
, RSAPRIVHEADER
);
29 footer
= strstr(pemstr
, RSAPRIVFOOTER
);
30 if (!header
|| !footer
) {
35 /* Base64 decode the whole input excluding header and footer */
36 b64dec
= base64_init(NULL
, 0, 1);
37 datalen
= base64_decode(b64dec
, &data
, pemstr
+sizeof(RSAPRIVHEADER
),
38 (footer
-header
)-sizeof(RSAPRIVHEADER
));
39 base64_destroy(b64dec
);
49 printf("Decoded output:\n");
50 for (i
=0; i
<datalen
; i
++) {
51 printf("%02x", data
[i
]);
57 /* Check that first 4 bytes are all valid */
58 if (datalen
< 4 || data
[0] != 0x30 || data
[1] != 0x82) {
61 } else if (((data
[2] << 8) | data
[3]) != datalen
-4) {
66 rsapem
= calloc(1, sizeof(rsapem_t
));
72 /* Initialize the data */
74 rsapem
->datalen
= datalen
;
78 datalen
= rsapem_read_vector(rsapem
, &data
);
79 if (datalen
!= 1 && data
[0] != 0x00) {
81 rsapem_destroy(rsapem
);
89 rsapem_destroy(rsapem_t
*rsapem
)
98 rsapem_read_vector(rsapem_t
*rsapem
, unsigned char **data
)
103 if (rsapem
->datalen
-rsapem
->datapos
< 2) {
106 if (rsapem
->data
[rsapem
->datapos
] != 0x02) {
110 /* Read vector length */
111 length
= rsapem
->data
[rsapem
->datapos
+1];
112 if (length
<= 0x80) {
113 rsapem
->datapos
+= 2;
114 } else if (length
== 0x81) {
115 if (rsapem
->datalen
-rsapem
->datapos
< 3) {
118 length
= rsapem
->data
[rsapem
->datapos
+2];
119 rsapem
->datapos
+= 3;
120 } else if (length
== 0x82) {
121 if (rsapem
->datalen
-rsapem
->datapos
< 4) {
124 length
= (rsapem
->data
[rsapem
->datapos
+2] << 8) |
125 rsapem
->data
[rsapem
->datapos
+3];
126 rsapem
->datapos
+= 4;
131 /* Check that we have enough data available */
132 if (rsapem
->datalen
-rsapem
->datapos
< length
) {
136 /* Allocate data buffer and read bytes */
137 ptr
= malloc(length
);
141 memcpy(ptr
, rsapem
->data
+rsapem
->datapos
, length
);
142 rsapem
->datapos
+= length
;
144 /* Return buffer and length */