Add type-safe STACKs and SETs.
[openssl.git] / crypto / x509 / x509.h
index 5aa239aa8c4f6deaf8588d926abaaf6398cdbd96..0cb6c04f47c439d59ad2d1a74e4e29cc4495e72a 100644 (file)
@@ -1,3 +1,4 @@
+
 /* crypto/x509/x509.h */
 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  * All rights reserved.
@@ -65,6 +66,7 @@ extern "C" {
 
 #include "stack.h"
 #include "asn1.h"
+#include "safestack.h"
 
 #ifndef NO_RSA
 #include "rsa.h"
@@ -154,6 +156,8 @@ typedef struct X509_name_st
        unsigned long hash; /* Keep the hash around for lookups */
        } X509_NAME;
 
+DECLARE_STACK_OF(X509_NAME)
+
 #define X509_EX_V_NETSCAPE_HACK                0x8000
 #define X509_EX_V_INIT                 0x0001
 typedef struct X509_extension_st
@@ -227,6 +231,9 @@ typedef struct x509_st
        char *name;
        } X509;
 
+DECLARE_STACK_OF(X509)
+DECLARE_ASN1_SET_OF(X509)
+
 typedef struct X509_revoked_st
        {
        ASN1_INTEGER *serialNumber;
@@ -336,6 +343,41 @@ typedef struct CBCParameter_st
        unsigned char iv[8];
        } CBC_PARAM;
 
+/* Password based encryption structure */
+
+typedef struct PBEPARAM_st {
+ASN1_OCTET_STRING *salt;
+ASN1_INTEGER *iter;
+} PBEPARAM;
+
+/* Password based encryption V2 structures */
+
+typedef struct PBE2PARAM_st {
+X509_ALGOR *keyfunc;
+X509_ALGOR *encryption;
+} PBE2PARAM;
+
+typedef struct PBKDF2PARAM_st {
+ASN1_OCTET_STRING *salt;
+ASN1_INTEGER *iter;
+ASN1_INTEGER *keylength;
+X509_ALGOR *prf;
+} PBKDF2PARAM;
+
+
+/* PKCS#8 private key info structure */
+
+typedef struct pkcs8_priv_key_info_st
+        {
+        int broken;     /* Flag for various broken formats */
+#define PKCS8_OK        0
+#define PKCS8_NO_OCTET  1
+        ASN1_INTEGER *version;
+        X509_ALGOR *pkeyalg;
+        ASN1_TYPE *pkey; /* Should be OCTET STRING but some are broken */
+        STACK *attributes;
+        } PKCS8_PRIV_KEY_INFO;
+
 #include "x509_vfy.h"
 #include "pkcs7.h"
 
@@ -487,6 +529,12 @@ typedef struct CBCParameter_st
 #define                X509_name_cmp(a,b)      X509_NAME_cmp((a),(b))
 #define                X509_get_signature_type(x) EVP_PKEY_type(OBJ_obj2nid((x)->sig_alg->algorithm))
 
+#define                X509_CRL_get_version(x) ASN1_INTEGER_get((x)->crl->version)
+#define        X509_CRL_get_lastUpdate(x) ((x)->crl->lastUpdate)
+#define        X509_CRL_get_nextUpdate(x) ((x)->crl->nextUpdate)
+#define                X509_CRL_get_issuer(x) ((x)->crl->issuer)
+#define                X509_CRL_get_REVOKED(x) ((x)->crl->revoked)
+
 /* This one is only used so that a binary form can output, as in
  * i2d_X509_NAME(X509_get_X509_PUBKEY(x),&buf) */
 #define        X509_get_X509_PUBKEY(x) ((x)->cert_info->key)
@@ -734,12 +782,14 @@ unsigned long     X509_NAME_hash(X509_NAME *x);
 int            X509_CRL_cmp(X509_CRL *a,X509_CRL *b);
 #ifndef NO_FP_API
 int            X509_print_fp(FILE *bp,X509 *x);
+int            X509_CRL_print_fp(FILE *bp,X509_CRL *x);
 int            X509_REQ_print_fp(FILE *bp,X509_REQ *req);
 #endif
 
 #ifdef HEADER_BIO_H
 int            X509_NAME_print(BIO *bp, X509_NAME *name, int obase);
 int            X509_print(BIO *bp,X509 *x);
+int            X509_CRL_print(BIO *bp,X509_CRL *x);
 int            X509_REQ_print(BIO *bp,X509_REQ *req);
 #endif
 
@@ -826,9 +876,45 @@ ASN1_STRING *      X509v3_unpack_string(ASN1_STRING **ex,int type,
 int            X509_verify_cert(X509_STORE_CTX *ctx);
 
 /* lookup a cert from a X509 STACK */
-X509 *X509_find_by_issuer_and_serial(STACK *sk,X509_NAME *name,
-                ASN1_INTEGER *serial);
-X509 *X509_find_by_subject(STACK *sk,X509_NAME *name);
+X509 *X509_find_by_issuer_and_serial(STACK_OF(X509) *sk,X509_NAME *name,
+                                    ASN1_INTEGER *serial);
+X509 *X509_find_by_subject(STACK_OF(X509) *sk,X509_NAME *name);
+
+int i2d_PBEPARAM(PBEPARAM *a, unsigned char **pp);
+PBEPARAM *PBEPARAM_new(void);
+PBEPARAM *d2i_PBEPARAM(PBEPARAM **a, unsigned char **pp, long length);
+void PBEPARAM_free(PBEPARAM *a);
+X509_ALGOR *PKCS5_pbe_set(int alg, int iter, unsigned char *salt, int saltlen);
+
+int i2d_PBKDF2PARAM(PBKDF2PARAM *a, unsigned char **pp);
+PBKDF2PARAM *PBKDF2PARAM_new(void);
+PBKDF2PARAM *d2i_PBKDF2PARAM(PBKDF2PARAM **a, unsigned char **pp, long length);
+void PBKDF2PARAM_free(PBKDF2PARAM *a);
+
+int i2d_PBE2PARAM(PBE2PARAM *a, unsigned char **pp);
+PBE2PARAM *PBE2PARAM_new(void);
+PBE2PARAM *d2i_PBE2PARAM(PBE2PARAM **a, unsigned char **pp, long length);
+void PBE2PARAM_free(PBE2PARAM *a);
+
+/* PKCS#8 utilities */
+
+int i2d_PKCS8_PRIV_KEY_INFO(PKCS8_PRIV_KEY_INFO *a, unsigned char **pp);
+PKCS8_PRIV_KEY_INFO *PKCS8_PRIV_KEY_INFO_new(void);
+PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO(PKCS8_PRIV_KEY_INFO **a,
+                                        unsigned char **pp, long length);
+void PKCS8_PRIV_KEY_INFO_free(PKCS8_PRIV_KEY_INFO *a);
+
+EVP_PKEY *EVP_PKCS82PKEY(PKCS8_PRIV_KEY_INFO *p8);
+PKCS8_PRIV_KEY_INFO *EVP_PKEY2PKCS8(EVP_PKEY *pkey);
+PKCS8_PRIV_KEY_INFO *PKCS8_set_broken(PKCS8_PRIV_KEY_INFO *p8, int broken);
+
+/* Password based encryption routines */
+
+int EVP_PBE_ALGOR_CipherInit(X509_ALGOR *algor, unsigned char *pass,
+                                int passlen, EVP_CIPHER_CTX *ctx, int en_de);
+int EVP_PBE_alg_add(int nid, EVP_CIPHER *cipher, EVP_MD *md,
+                                                EVP_PBE_KEYGEN *keygen);
+void EVP_PBE_cleanup(void);
 
 #else
 
@@ -1049,11 +1135,13 @@ unsigned long   X509_NAME_hash();
 int            X509_CRL_cmp();
 #ifndef NO_FP_API
 int            X509_print_fp();
+int            X509_CRL_print_fp();
 int            X509_REQ_print_fp();
 #endif
 
 int            X509_NAME_print();
 int            X509_print();
+int            X509_CRL_print();
 int            X509_REQ_print();
 
 int            X509_NAME_entry_count();
@@ -1127,6 +1215,35 @@ char *          X509_verify_cert_error_string();
 X509 *X509_find_by_issuer_and_serial();
 X509 *X509_find_by_subject();
 
+int i2d_PBEPARAM();
+PBEPARAM *PBEPARAM_new();
+PBEPARAM *d2i_PBEPARAM();
+void PBEPARAM_free();
+
+int i2d_PBKDF2PARAM();
+PBKDF2PARAM *PBKDF2PARAM_new();
+PBKDF2PARAM *d2i_PBKDF2PARAM();
+void PBKDF2PARAM_free();
+
+int i2d_PBE2PARAM();
+PBE2PARAM *PBE2PARAM_new();
+PBE2PARAM *d2i_PBE2PARAM();
+void PBE2PARAM_free();
+
+int i2d_PKCS8_PRIV_KEY_INFO();
+PKCS8_PRIV_KEY_INFO *PKCS8_PRIV_KEY_INFO_new();
+PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO();
+void PKCS8_PRIV_KEY_INFO_free();
+
+EVP_PKEY *EVP_PKCS82PKEY();
+PKCS8_PRIV_KEY_INFO *EVP_PKEY2PKCS8();
+PKCS8_PRIV_KEY_INFO *PKCS8_set_broken();
+
+int EVP_PBE_ALGOR_CipherInit();
+int EVP_PBE_alg_add();
+X509_ALGOR *PKCS5_pbe_set();
+void EVP_PBE_cleanup();
+
 #endif
 
 /* BEGIN ERROR CODES */
@@ -1141,6 +1258,7 @@ X509 *X509_find_by_subject();
 #define X509_F_X509V3_ADD_EXTENSION                     105
 #define X509_F_X509V3_PACK_STRING                       106
 #define X509_F_X509V3_UNPACK_STRING                     107
+#define X509_F_X509_CHECK_PRIVATE_KEY                   128
 #define X509_F_X509_EXTENSION_CREATE_BY_NID             108
 #define X509_F_X509_EXTENSION_CREATE_BY_OBJ             109
 #define X509_F_X509_GET_PUBKEY_PARAMETERS               110
@@ -1164,15 +1282,19 @@ X509 *X509_find_by_subject();
 
 /* Reason codes. */
 #define X509_R_BAD_X509_FILETYPE                        100
+#define X509_R_CANT_CHECK_DH_KEY                        114
 #define X509_R_CERT_ALREADY_IN_HASH_TABLE               101
 #define X509_R_ERR_ASN1_LIB                             102
 #define X509_R_INVALID_DIRECTORY                        113
+#define X509_R_KEY_TYPE_MISMATCH                        115
+#define X509_R_KEY_VALUES_MISMATCH                      116
 #define X509_R_LOADING_CERT_DIR                                 103
 #define X509_R_LOADING_DEFAULTS                                 104
 #define X509_R_NO_CERT_SET_FOR_US_TO_VERIFY             105
 #define X509_R_SHOULD_RETRY                             106
 #define X509_R_UNABLE_TO_FIND_PARAMETERS_IN_CHAIN       107
 #define X509_R_UNABLE_TO_GET_CERTS_PUBLIC_KEY           108
+#define X509_R_UNKNOWN_KEY_TYPE                                 117
 #define X509_R_UNKNOWN_NID                              109
 #define X509_R_UNKNOWN_STRING_TYPE                      110
 #define X509_R_UNSUPPORTED_ALGORITHM                    111