00001
00004 #ifndef _X509_H
00005 #define _X509_H
00006
00007 #ifdef __cplusplus
00008 extern "C" {
00009 #endif
00010
00011 #include "rsa.h"
00012
00013 #define ERR_ASN1_OUT_OF_DATA 0x0014
00014 #define ERR_ASN1_UNEXPECTED_TAG 0x0016
00015 #define ERR_ASN1_INVALID_LENGTH 0x0018
00016 #define ERR_ASN1_LENGTH_MISMATCH 0x001A
00017 #define ERR_ASN1_INVALID_DATA 0x001C
00018
00019 #define ERR_X509_FEATURE_UNAVAILABLE 0x0020
00020 #define ERR_X509_CERT_INVALID_PEM 0x0040
00021 #define ERR_X509_CERT_INVALID_FORMAT 0x0060
00022 #define ERR_X509_CERT_INVALID_VERSION 0x0080
00023 #define ERR_X509_CERT_INVALID_SERIAL 0x00A0
00024 #define ERR_X509_CERT_INVALID_ALG 0x00C0
00025 #define ERR_X509_CERT_INVALID_NAME 0x00E0
00026 #define ERR_X509_CERT_INVALID_DATE 0x0100
00027 #define ERR_X509_CERT_INVALID_PUBKEY 0x0120
00028 #define ERR_X509_CERT_INVALID_SIGNATURE 0x0140
00029 #define ERR_X509_CERT_INVALID_EXTENSIONS 0x0160
00030 #define ERR_X509_CERT_UNKNOWN_VERSION 0x0180
00031 #define ERR_X509_CERT_UNKNOWN_SIG_ALG 0x01A0
00032 #define ERR_X509_CERT_UNKNOWN_PK_ALG 0x01C0
00033 #define ERR_X509_CERT_SIG_MISMATCH 0x01E0
00034 #define ERR_X509_KEY_INVALID_PEM 0x0200
00035 #define ERR_X509_KEY_INVALID_VERSION 0x0220
00036 #define ERR_X509_KEY_INVALID_FORMAT 0x0240
00037 #define ERR_X509_KEY_INVALID_ENC_IV 0x0260
00038 #define ERR_X509_KEY_UNKNOWN_ENC_ALG 0x0280
00039 #define ERR_X509_KEY_PASSWORD_REQUIRED 0x02A0
00040 #define ERR_X509_KEY_PASSWORD_MISMATCH 0x02C0
00041 #define ERR_X509_SIG_VERIFY_FAILED 0x02E0
00042
00043 #define BADCERT_HAS_EXPIRED 1
00044 #define BADCERT_CN_MISMATCH 2
00045 #define BADCERT_NOT_TRUSTED 4
00046
00047
00048
00049
00050 #define ASN1_BOOLEAN 0x01
00051 #define ASN1_INTEGER 0x02
00052 #define ASN1_BIT_STRING 0x03
00053 #define ASN1_OCTET_STRING 0x04
00054 #define ASN1_NULL 0x05
00055 #define ASN1_OID 0x06
00056 #define ASN1_UTF8_STRING 0x0C
00057 #define ASN1_SEQUENCE 0x10
00058 #define ASN1_SET 0x11
00059 #define ASN1_PRINTABLE_STRING 0x13
00060 #define ASN1_T61_STRING 0x14
00061 #define ASN1_IA5_STRING 0x16
00062 #define ASN1_UTC_TIME 0x17
00063 #define ASN1_UNIVERSAL_STRING 0x1C
00064 #define ASN1_BMP_STRING 0x1E
00065 #define ASN1_PRIMITIVE 0x00
00066 #define ASN1_CONSTRUCTED 0x20
00067 #define ASN1_CONTEXT_SPECIFIC 0x80
00068
00069
00070
00071
00072 #define X520_COMMON_NAME 3
00073 #define X520_COUNTRY 6
00074 #define X520_LOCALITY 7
00075 #define X520_STATE 8
00076 #define X520_ORGANIZATION 10
00077 #define X520_ORG_UNIT 11
00078 #define PKCS9_EMAIL 1
00079
00080 #define OID_X520 "\x55\x04"
00081 #define OID_PKCS1 "\x2A\x86\x48\x86\xF7\x0D\x01\x01"
00082 #define OID_PKCS1_RSA "\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01"
00083 #define OID_PKCS9 "\x2A\x86\x48\x86\xF7\x0D\x01\x09"
00084
00085 typedef struct _x509_buf
00086 {
00087 int tag;
00088 int len;
00089 unsigned char *p;
00090 }
00091 x509_buf;
00092
00093 typedef struct _x509_name
00094 {
00095 x509_buf oid;
00096 x509_buf val;
00097 struct _x509_name *next;
00098 }
00099 x509_name;
00100
00101 typedef struct _x509_time
00102 {
00103 int year, mon, day;
00104 int hour, min, sec;
00105 }
00106 x509_time;
00107
00108 typedef struct _x509_cert
00109 {
00110 x509_buf raw;
00111 x509_buf tbs;
00112
00113 int version;
00114 x509_buf serial;
00115 x509_buf sig_oid1;
00116
00117 x509_buf issuer_raw;
00118 x509_buf subject_raw;
00119
00120 x509_name issuer;
00121 x509_name subject;
00122
00123 x509_time valid_from;
00124 x509_time valid_to;
00125
00126 x509_buf pk_oid;
00127 rsa_context rsa;
00128
00129 x509_buf issuer_id;
00130 x509_buf subject_id;
00131 x509_buf v3_ext;
00132
00133 int ca_istrue;
00134 int max_pathlen;
00135
00136 x509_buf sig_oid2;
00137 x509_buf sig;
00138
00139 struct _x509_cert *next;
00140 }
00141 x509_cert;
00142
00153 int x509_add_certs( x509_cert *chain, unsigned char *buf, int buflen );
00154
00164 int x509_read_crtfile( x509_cert *chain, char *path );
00165
00177 int x509_parse_key( rsa_context *rsa, unsigned char *buf, int buflen,
00178 unsigned char *pwd, int pwdlen );
00179
00189 int x509_read_keyfile( rsa_context *rsa, char *path, char *password );
00190
00195 int x509_dn_gets( char *buf, char *end, x509_name *dn );
00196
00201 char *x509_cert_info( x509_cert *crt );
00202
00207 int x509_is_cert_expired( x509_cert *crt );
00208
00225 int x509_verify_cert( x509_cert *crt, x509_cert *trust_ca,
00226 char *cn, int *flags );
00227
00231 void x509_free_cert( x509_cert *crt );
00232
00238 int x509_self_test( int verbose );
00239
00240 #ifdef __cplusplus
00241 }
00242 #endif
00243
00244 #endif