#include <mp.h>
/* ANSI offsetof, backwards. */
#define OFFSETOF(a, b) offsetof(b, a)
/* general ASN1 declarations and parsing */
typedef struct Elem Elem;
typedef struct Tag Tag;
typedef struct Value Value;
typedef struct Bytes Bytes;
typedef struct Ints Ints;
typedef struct Bits Bits;
typedef struct Elist Elist;
/* tag classes */
#define Universal 0
#define Context 0x80
/* universal tags */
#define BOOLEAN 1
#define INTEGER 2
#define BIT_STRING 3
#define OCTET_STRING 4
#define NULLTAG 5
#define OBJECT_ID 6
#define ObjectDescriptor 7
#define EXTERNAL 8
#define REAL 9
#define ENUMERATED 10
#define EMBEDDED_PDV 11
#define SEQUENCE 16 /* also SEQUENCE OF */
#define SETOF 17 /* also SETOF OF */
#define NumericString 18
#define PrintableString 19
#define TeletexString 20
#define VideotexString 21
#define IA5String 22
#define UTCTime 23
#define GeneralizedTime 24
#define GraphicString 25
#define VisibleString 26
#define GeneralString 27
#define UniversalString 28
#define BMPString 30
struct Bytes {
int len;
uchar data[1];
};
struct Ints {
int len;
int data[1];
};
struct Bits {
int len; /* number of bytes */
int unusedbits; /* unused bits in last byte */
uchar data[1]; /* most-significant bit first */
};
struct Tag {
int class;
int num;
};
enum { VBool, VInt, VOctets, VBigInt, VReal, VOther,
VBitString, VNull, VEOC, VObjId, VString, VSeq, VSet };
struct Value {
int tag; /* VBool, etc. */
union {
int boolval;
int intval;
Bytes* octetsval;
Bytes* bigintval;
Bytes* realval; /* undecoded; hardly ever used */
Bytes* otherval;
Bits* bitstringval;
Ints* objidval;
char* stringval;
Elist* seqval;
Elist* setval;
} u; /* (Don't use anonymous unions, for ease of porting) */
};
struct Elem {
Tag tag;
Value val;
};
struct Elist {
Elist* tl;
Elem hd;
};
/* decoding errors */
enum { ASN_OK, ASN_ESHORT, ASN_ETOOBIG, ASN_EVALLEN,
ASN_ECONSTR, ASN_EPRIM, ASN_EINVAL, ASN_EUNIMPL };
/* here are the functions to consider making extern someday */
extern Bytes* newbytes(int len);
extern Bytes* makebytes(uchar* buf, int len);
extern void freebytes(Bytes* b);
extern Bytes* catbytes(Bytes* b1, Bytes* b2);
extern Ints* newints(int len);
extern Ints* makeints(int* buf, int len);
extern void freeints(Ints* b);
extern Bits* newbits(int len);
extern Bits* makebits(uchar* buf, int len, int unusedbits);
extern void freebits(Bits* b);
extern Elist* mkel(Elem e, Elist* tail);
extern void freeelist(Elist* el);
extern int elistlen(Elist* el);
extern int is_seq(Elem* pe, Elist** pseq);
extern int is_set(Elem* pe, Elist** pset);
extern int is_int(Elem* pe, int* pint);
extern int is_bigint(Elem* pe, Bytes** pbigint);
extern int is_bitstring(Elem* pe, Bits** pbits);
extern int is_octetstring(Elem* pe, Bytes** poctets);
extern int is_oid(Elem* pe, Ints** poid);
extern int is_string(Elem* pe, char** pstring);
extern int is_time(Elem* pe, char** ptime);
extern int decode(uchar* a, int alen, Elem* pelem);
extern int decode_seq(uchar* a, int alen, Elist** pelist);
extern int decode_value(uchar* a, int alen, int kind, int isconstr, Value* pval);
extern int encode(Elem e, Bytes** pbytes);
extern int oid_lookup(Ints* o, Ints** tab);
extern void freevalfields(Value* v);
extern mpint *asn1mpint(Elem *e);
#define TAG_MASK 0x1F
#define CONSTR_MASK 0x20
#define CLASS_MASK 0xC0
#define MAXOBJIDLEN 20
extern int ber_decode(uchar** pp, uchar* pend, Elem* pelem);
extern int tag_decode(uchar** pp, uchar* pend, Tag* ptag, int* pisconstr);
extern int length_decode(uchar** pp, uchar* pend, int* plength);
extern int value_decode(uchar** pp, uchar* pend, int length, int kind, int isconstr, Value* pval);
extern int int_decode(uchar** pp, uchar* pend, int count, int unsgned, int* pint);
extern int uint7_decode(uchar** pp, uchar* pend, int* pint);
extern int octet_decode(uchar** pp, uchar* pend, int length, int isconstr, Bytes** pbytes);
extern int seq_decode(uchar** pp, uchar* pend, int length, int isconstr, Elist** pelist);
extern int enc(uchar** pp, Elem e, int lenonly);
extern int val_enc(uchar** pp, Elem e, int *pconstr, int lenonly);
extern void uint7_enc(uchar** pp, int num, int lenonly);
extern void int_enc(uchar** pp, int num, int unsgned, int lenonly);
extern Elem mkint(int j);
extern Elem mkbigint(mpint *p);
extern Elem mkstring(char *s);
extern Elem mkoctet(uchar *buf, int buflen);
extern Elem mkbits(uchar *buf, int buflen);
extern Elem mkutc(long t);
extern Elem mkoid(Ints *oid);
extern Elem mkseq(Elist *el);
extern Elem mkset(Elist *el);
extern Elem mkDN(char *dn);
extern Elem Null(void);
extern void * emalloc(int n);
extern char * estrdup(char *s);
extern void edump(Elem e);
|