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