Сообщение Re[5]: CryptoAPI / CNG и ASN.1 - как? от 03.06.2022 19:03
Изменено 03.06.2022 20:33 kov_serg
Re[5]: CryptoAPI / CNG и ASN.1 - как?
Здравствуйте, morgot, Вы писали:
M>А как его использовать? Вот допустим у меня есть файл или массив с asn данными. как парсить?
Примерно так:
ps: oid-ы можно тут глянуть, но там далеко не все.
Их количество не ограничено и любая организация может нагенерировать их в любых масштабах.
M>А как его использовать? Вот допустим у меня есть файл или массив с asn данными. как парсить?
вспомогательные функции | |
| |
static int dump_tag(void* ctx,asn1_parser_tag_t* tag) {
int i; packet_t pkt[1];
pkt->data=tag->body->data+tag->body->pos;
pkt->size=tag->body->size-tag->body->pos;
pkt->pos=0;pkt->ovf=0;pkt->limit=0;
for(i=0;i<tag->level;i++) printf(" ");
if (tag->tag_class==TAG_CLASS_UNIVERSAL && tag->tag_type==TAG_TYPE_OID) {
enum { buf_size=80 }; char buf[buf_size+1]; buf[buf_size]=0;
sprint_oid(buf,buf_size,pkt);
printf("%d. OID=%s\n",tag->index,buf);
} else {
printf("%d. %s(%d) %s ofs=0x%X size=%d\n",
tag->index,
tag->tag_class==0?get_typename(tag->tag_type):get_classname(tag->tag_class),tag->tag_type,
tag->tag_composite?" composite":"",
tag->tag_pos, tag->tag_len
);
}
if (!tag->tag_composite) hex_dump(pkt,tag->level+1);
return 0;
}
int main(int argc, char const *argv[]) {
enum { buf_limit=4096 }; char buf[buf_limit];
packet_t pkt[1]; asn1_parser_cfg_t cfg[1];
int i,rc;
pkt_init(pkt,buf,buf_limit);
rc=pkt_base64_decode(pkt,rsdn_pem);
if (pkt->ovf) rc=3; if (rc) { printf("error=%d\n",rc); return rc; }
pkt->pos=0;
cfg->tag_ctx=0;
cfg->tag=dump_tag;
asn1_parse(pkt,cfg);
return 0;
}
выхлоп | |
| |
ps: oid-ы можно тут глянуть, но там далеко не все.
Их количество не ограничено и любая организация может нагенерировать их в любых масштабах.
Re[5]: CryptoAPI / CNG и ASN.1 - как?
Здравствуйте, morgot, Вы писали:
M>А как его использовать? Вот допустим у меня есть файл или массив с asn данными. как парсить?
Примерно так:
ps: oid-ы можно тут глянуть, но там далеко не все.
Их количество не ограничено и любая организация может нагенерировать их в любых масштабах.
M>А как его использовать? Вот допустим у меня есть файл или массив с asn данными. как парсить?
вспомогательные функции | |
| |
static int dump_tag(void* ctx,asn1_parser_tag_t* tag) {
int i; packet_t pkt[1];
pkt->data=tag->body->data+tag->body->pos;
pkt->size=tag->body->size-tag->body->pos;
pkt->pos=0;pkt->ovf=0;pkt->limit=0;
for(i=0;i<tag->level;i++) printf(" ");
if (tag->tag_class==TAG_CLASS_UNIVERSAL && tag->tag_type==TAG_TYPE_OID) {
enum { buf_size=80 }; char buf[buf_size+1]; buf[buf_size]=0;
sprint_oid(buf,buf_size,pkt);
printf("%d. OID=%s\n",tag->index,buf);
} else {
printf("%d. %s(%d) %s ofs=0x%X size=%d\n",
tag->index,
tag->tag_class==TAG_CLASS_UNIVERSAL?
get_typename(tag->tag_type):get_classname(tag->tag_class),
tag->tag_type,
tag->tag_composite?" composite":"",
tag->tag_pos, tag->tag_len
);
}
if (!tag->tag_composite) hex_dump(pkt,tag->level+1);
return 0;
}
int main(int argc, char const *argv[]) {
enum { buf_limit=4096 }; char buf[buf_limit];
packet_t pkt[1]; asn1_parser_cfg_t cfg[1];
int i,rc;
pkt_init(pkt,buf,buf_limit);
rc=pkt_base64_decode(pkt,rsdn_pem);
if (pkt->ovf) rc=3; if (rc) { printf("error=%d\n",rc); return rc; }
pkt->pos=0;
cfg->tag_ctx=0;
cfg->tag=dump_tag;
asn1_parse(pkt,cfg);
return 0;
}
выхлоп | |
| |
ps: oid-ы можно тут глянуть, но там далеко не все.
Их количество не ограничено и любая организация может нагенерировать их в любых масштабах.