18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * ASN.1 DER parsing
38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2006, Jouni Malinen <j@w1.fi>
48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
5c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * This software may be distributed under the terms of the BSD license.
6c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * See README for more details.
78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef ASN1_H
108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define ASN1_H
118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define ASN1_TAG_EOC		0x00 /* not used with DER */
138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define ASN1_TAG_BOOLEAN	0x01
148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define ASN1_TAG_INTEGER	0x02
158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define ASN1_TAG_BITSTRING	0x03
168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define ASN1_TAG_OCTETSTRING	0x04
178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define ASN1_TAG_NULL		0x05
188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define ASN1_TAG_OID		0x06
198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define ASN1_TAG_OBJECT_DESCRIPTOR	0x07 /* not yet parsed */
208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define ASN1_TAG_EXTERNAL	0x08 /* not yet parsed */
218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define ASN1_TAG_REAL		0x09 /* not yet parsed */
228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define ASN1_TAG_ENUMERATED	0x0A /* not yet parsed */
231b46775bb44f06b3cc285481ff5f7a673559ed7dDmitry Shmidt#define ASN1_TAG_EMBEDDED_PDV	0x0B /* not yet parsed */
248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define ASN1_TAG_UTF8STRING	0x0C /* not yet parsed */
258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define ANS1_TAG_RELATIVE_OID	0x0D
268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define ASN1_TAG_SEQUENCE	0x10 /* shall be constructed */
278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define ASN1_TAG_SET		0x11
288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define ASN1_TAG_NUMERICSTRING	0x12 /* not yet parsed */
298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define ASN1_TAG_PRINTABLESTRING	0x13
308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define ASN1_TAG_TG1STRING	0x14 /* not yet parsed */
318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define ASN1_TAG_VIDEOTEXSTRING	0x15 /* not yet parsed */
328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define ASN1_TAG_IA5STRING	0x16
338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define ASN1_TAG_UTCTIME	0x17
348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define ASN1_TAG_GENERALIZEDTIME	0x18 /* not yet parsed */
358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define ASN1_TAG_GRAPHICSTRING	0x19 /* not yet parsed */
368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define ASN1_TAG_VISIBLESTRING	0x1A
378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define ASN1_TAG_GENERALSTRING	0x1B /* not yet parsed */
388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define ASN1_TAG_UNIVERSALSTRING	0x1C /* not yet parsed */
391b46775bb44f06b3cc285481ff5f7a673559ed7dDmitry Shmidt#define ASN1_TAG_CHARACTERSTRING	0x1D /* not yet parsed */
401b46775bb44f06b3cc285481ff5f7a673559ed7dDmitry Shmidt#define ASN1_TAG_BMPSTRING	0x1E /* not yet parsed */
418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define ASN1_CLASS_UNIVERSAL		0
438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define ASN1_CLASS_APPLICATION		1
448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define ASN1_CLASS_CONTEXT_SPECIFIC	2
458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define ASN1_CLASS_PRIVATE		3
468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct asn1_hdr {
498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	const u8 *payload;
508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 identifier, class, constructed;
518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	unsigned int tag, length;
528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define ASN1_MAX_OID_LEN 20
558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct asn1_oid {
568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	unsigned long oid[ASN1_MAX_OID_LEN];
578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	size_t len;
588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint asn1_get_next(const u8 *buf, size_t len, struct asn1_hdr *hdr);
628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint asn1_parse_oid(const u8 *buf, size_t len, struct asn1_oid *oid);
638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint asn1_get_oid(const u8 *buf, size_t len, struct asn1_oid *oid,
648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		 const u8 **next);
6550b691dc36a8075e8f594e8bea93cb524fa6b1d2Dmitry Shmidtvoid asn1_oid_to_str(const struct asn1_oid *oid, char *buf, size_t len);
668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtunsigned long asn1_bit_string_to_long(const u8 *buf, size_t len);
6750b691dc36a8075e8f594e8bea93cb524fa6b1d2Dmitry Shmidtint asn1_oid_equal(const struct asn1_oid *a, const struct asn1_oid *b);
6850b691dc36a8075e8f594e8bea93cb524fa6b1d2Dmitry Shmidt
6950b691dc36a8075e8f594e8bea93cb524fa6b1d2Dmitry Shmidtextern struct asn1_oid asn1_sha1_oid;
7050b691dc36a8075e8f594e8bea93cb524fa6b1d2Dmitry Shmidtextern struct asn1_oid asn1_sha256_oid;
718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* ASN1_H */
73