#ifndef _PKINIT_H
#define _PKINIT_H
#include <k5-platform.h>
#include <krb5/krb5.h>
#include <krb5/preauth_plugin.h>
#include <k5-int-pkinit.h>
#include <profile.h>
#include "pkinit_accessor.h"
#include "pkinit_trace.h"
#ifndef WITHOUT_PKCS11
#include "pkcs11.h"
#define PK_SIGLEN_GUESS 1000
#define PK_NOSLOT 999999
#endif
#define DH_PROTOCOL 1
#define RSA_PROTOCOL 2
#define TD_TRUSTED_CERTIFIERS 104
#define TD_INVALID_CERTIFICATES 105
#define TD_DH_PARAMETERS 109
#define PKINIT_CTX_MAGIC 0x05551212
#define PKINIT_REQ_CTX_MAGIC 0xdeadbeef
#define PKINIT_DEFERRED_ID_MAGIC 0x3ca20d21
#define PKINIT_DEFAULT_DH_MIN_BITS 2048
#define PKINIT_DH_MIN_CONFIG_BITS 1024
#define PKINIT_DH_P256_BITS 3072
#define PKINIT_DH_P384_BITS 7680
#define PKINIT_DH_P521_BITS 15360
#define KRB5_CONF_KDCDEFAULTS "kdcdefaults"
#define KRB5_CONF_LIBDEFAULTS "libdefaults"
#define KRB5_CONF_REALMS "realms"
#define KRB5_CONF_PKINIT_ALLOW_UPN "pkinit_allow_upn"
#define KRB5_CONF_PKINIT_ANCHORS "pkinit_anchors"
#define KRB5_CONF_PKINIT_INDICATOR "pkinit_indicator"
#define KRB5_CONF_PKINIT_CERT_MATCH "pkinit_cert_match"
#define KRB5_CONF_PKINIT_DH_MIN_BITS "pkinit_dh_min_bits"
#define KRB5_CONF_PKINIT_EKU_CHECKING "pkinit_eku_checking"
#define KRB5_CONF_PKINIT_IDENTITIES "pkinit_identities"
#define KRB5_CONF_PKINIT_IDENTITY "pkinit_identity"
#define KRB5_CONF_PKINIT_KDC_HOSTNAME "pkinit_kdc_hostname"
#define KRB5_CONF_PKINIT_KDC_OCSP "pkinit_kdc_ocsp"
#define KRB5_CONF_PKINIT_POOL "pkinit_pool"
#define KRB5_CONF_PKINIT_REQUIRE_CRL_CHECKING "pkinit_require_crl_checking"
#define KRB5_CONF_PKINIT_REQUIRE_FRESHNESS "pkinit_require_freshness"
#define KRB5_CONF_PKINIT_REVOKE "pkinit_revoke"
#ifdef DEBUG
#define pkiDebug printf
#else
static inline void pkiDebug (const char *fmt, ...) { }
#endif
#ifndef _WIN32
#define __FUNCTION__ __func__
#endif
#define PADATA_TO_KRB5DATA(pad, k5d) \
(k5d)->length = (pad)->length; (k5d)->data = (char *)(pad)->contents;
#define OCTETDATA_TO_KRB5DATA(octd, k5d) \
(k5d)->length = (octd)->length; (k5d)->data = (char *)(octd)->data;
typedef struct _pkinit_plg_crypto_context *pkinit_plg_crypto_context;
typedef struct _pkinit_req_crypto_context *pkinit_req_crypto_context;
typedef struct _pkinit_identity_crypto_context *pkinit_identity_crypto_context;
typedef struct _pkinit_plg_opts {
int require_eku;
int accept_secondary_eku;
int allow_upn;
int require_crl_checking;
int require_freshness;
int disable_freshness;
int dh_min_bits;
} pkinit_plg_opts;
typedef struct _pkinit_req_opts {
int require_eku;
int accept_secondary_eku;
int allow_upn;
int require_crl_checking;
int dh_size;
int require_hostname_match;
int disable_freshness;
} pkinit_req_opts;
typedef struct _pkinit_identity_opts {
char *identity;
char **identity_alt;
char **anchors;
char **intermediates;
char **crls;
int idtype;
char *cert_filename;
char *key_filename;
#ifndef WITHOUT_PKCS11
char *p11_module_name;
CK_SLOT_ID slotid;
char *token_label;
char *cert_id_string;
char *cert_label;
#endif
} pkinit_identity_opts;
struct _pkinit_context {
int magic;
pkinit_plg_crypto_context cryptoctx;
pkinit_plg_opts *opts;
pkinit_identity_opts *idopts;
};
typedef struct _pkinit_context *pkinit_context;
struct _pkinit_req_context {
unsigned int magic;
pkinit_req_crypto_context cryptoctx;
pkinit_req_opts *opts;
pkinit_identity_crypto_context idctx;
pkinit_identity_opts *idopts;
int do_identity_matching;
krb5_preauthtype pa_type;
int rfc6112_kdc;
int identity_initialized;
int identity_prompted;
krb5_error_code identity_prompt_retval;
krb5_data *freshness_token;
};
typedef struct _pkinit_req_context *pkinit_req_context;
struct _pkinit_kdc_context {
int magic;
pkinit_plg_crypto_context cryptoctx;
pkinit_plg_opts *opts;
pkinit_identity_crypto_context idctx;
pkinit_identity_opts *idopts;
char *realmname;
unsigned int realmname_len;
char **auth_indicators;
};
typedef struct _pkinit_kdc_context *pkinit_kdc_context;
struct _pkinit_kdc_req_context {
int magic;
pkinit_req_crypto_context cryptoctx;
krb5_auth_pack *rcv_auth_pack;
krb5_preauthtype pa_type;
};
typedef struct _pkinit_kdc_req_context *pkinit_kdc_req_context;
krb5_error_code pkinit_init_req_opts(pkinit_req_opts **);
void pkinit_fini_req_opts(pkinit_req_opts *);
krb5_error_code pkinit_init_plg_opts(pkinit_plg_opts **);
void pkinit_fini_plg_opts(pkinit_plg_opts *);
krb5_error_code pkinit_init_identity_opts(pkinit_identity_opts **idopts);
void pkinit_fini_identity_opts(pkinit_identity_opts *idopts);
krb5_error_code pkinit_dup_identity_opts(pkinit_identity_opts *src_opts,
pkinit_identity_opts **dest_opts);
char * idtype2string(int idtype);
char * catype2string(int catype);
krb5_error_code pkinit_identity_initialize
(krb5_context context,
pkinit_plg_crypto_context plg_cryptoctx,
pkinit_req_crypto_context req_cryptoctx,
pkinit_identity_opts *idopts,
pkinit_identity_crypto_context id_cryptoctx,
krb5_clpreauth_callbacks cb,
krb5_clpreauth_rock rock,
krb5_principal princ);
krb5_error_code pkinit_identity_prompt
(krb5_context context,
pkinit_plg_crypto_context plg_cryptoctx,
pkinit_req_crypto_context req_cryptoctx,
pkinit_identity_opts *idopts,
pkinit_identity_crypto_context id_cryptoctx,
krb5_clpreauth_callbacks cb,
krb5_clpreauth_rock rock,
int do_matching,
krb5_principal princ);
krb5_error_code pkinit_cert_matching
(krb5_context context,
pkinit_plg_crypto_context plg_cryptoctx,
pkinit_req_crypto_context req_cryptoctx,
pkinit_identity_crypto_context id_cryptoctx,
krb5_principal princ);
krb5_error_code pkinit_client_cert_match
(krb5_context context,
pkinit_plg_crypto_context plgctx,
pkinit_req_crypto_context reqctx,
const char *match_rule,
krb5_boolean *matched);
struct _pkinit_deferred_id {
int magic;
char *identity;
unsigned long ck_flags;
char *password;
};
typedef struct _pkinit_deferred_id *pkinit_deferred_id;
krb5_error_code pkinit_set_deferred_id
(pkinit_deferred_id **identities, const char *identity,
unsigned long ck_flags, const char *password);
const char * pkinit_find_deferred_id
(pkinit_deferred_id *identities, const char *identity);
unsigned long pkinit_get_deferred_id_flags
(pkinit_deferred_id *identities, const char *identity);
void pkinit_free_deferred_ids(pkinit_deferred_id *identities);
void init_krb5_pa_pk_as_req(krb5_pa_pk_as_req **in);
void init_krb5_reply_key_pack(krb5_reply_key_pack **in);
void init_krb5_pa_pk_as_rep(krb5_pa_pk_as_rep **in);
void free_krb5_pa_pk_as_req(krb5_pa_pk_as_req **in);
void free_krb5_reply_key_pack(krb5_reply_key_pack **in);
void free_krb5_auth_pack(krb5_auth_pack **in);
void free_krb5_pa_pk_as_rep(krb5_pa_pk_as_rep **in);
void free_krb5_external_principal_identifier(krb5_external_principal_identifier ***in);
void free_krb5_algorithm_identifiers(krb5_algorithm_identifier ***in);
void free_krb5_algorithm_identifier(krb5_algorithm_identifier *in);
void free_krb5_kdc_dh_key_info(krb5_kdc_dh_key_info **in);
void free_pachecksum2(krb5_context context, krb5_pachecksum2 **in);
krb5_error_code pkinit_copy_krb5_data(krb5_data *dst, const krb5_data *src);
krb5_error_code pkinit_kdcdefault_strings
(krb5_context context, const char *realmname, const char *option,
char ***ret_value);
krb5_error_code pkinit_kdcdefault_string
(krb5_context context, const char *realmname, const char *option,
char **ret_value);
krb5_error_code pkinit_kdcdefault_boolean
(krb5_context context, const char *realmname, const char *option,
int default_value, int *ret_value);
krb5_error_code pkinit_kdcdefault_integer
(krb5_context context, const char *realmname, const char *option,
int default_value, int *ret_value);
krb5_error_code pkinit_libdefault_strings
(krb5_context context, const krb5_data *realm,
const char *option, char ***ret_value);
krb5_error_code pkinit_libdefault_string
(krb5_context context, const krb5_data *realm,
const char *option, char **ret_value);
krb5_error_code pkinit_libdefault_boolean
(krb5_context context, const krb5_data *realm, const char *option,
int default_value, int *ret_value);
krb5_error_code pkinit_libdefault_integer
(krb5_context context, const krb5_data *realm, const char *option,
int default_value, int *ret_value);
void print_buffer(const unsigned char *, unsigned int);
void print_buffer_bin(unsigned char *, unsigned int, char *);
#include "pkinit_crypto.h"
#endif