#ifndef _PKINIT_CRYPTO_H
#define _PKINIT_CRYPTO_H
#include <krb5/krb5.h>
#include <krb5/preauth_plugin.h>
#include <k5-int-pkinit.h>
#include <profile.h>
#include "pkinit_accessor.h"
enum cms_msg_types {
CMS_SIGN_CLIENT,
CMS_SIGN_SERVER,
CMS_ENVEL_SERVER
};
#define IDTYPE_FILE 1
#define IDTYPE_DIR 2
#define IDTYPE_PKCS11 3
#define IDTYPE_ENVVAR 4
#define IDTYPE_PKCS12 5
#define CATYPE_ANCHORS 1
#define CATYPE_INTERMEDIATES 2
#define CATYPE_CRLS 3
#define PKINIT_KU_DIGITALSIGNATURE 0x80000000
#define PKINIT_KU_KEYENCIPHERMENT 0x40000000
#define PKINIT_EKU_PKINIT 0x80000000
#define PKINIT_EKU_MSSCLOGIN 0x40000000
#define PKINIT_EKU_CLIENTAUTH 0x20000000
#define PKINIT_EKU_EMAILPROTECTION 0x10000000
typedef struct _pkinit_cert_info *pkinit_cert_handle;
typedef struct _pkinit_cert_iter_info *pkinit_cert_iter_handle;
#define PKINIT_ITER_NO_MORE 0x11111111
typedef struct _pkinit_cert_matching_data {
char *subject_dn;
char *issuer_dn;
unsigned int ku_bits;
unsigned int eku_bits;
krb5_principal *sans;
char **upns;
} pkinit_cert_matching_data;
krb5_error_code pkinit_init_plg_crypto(krb5_context,
pkinit_plg_crypto_context *);
void pkinit_fini_plg_crypto(pkinit_plg_crypto_context);
krb5_error_code pkinit_init_req_crypto(pkinit_req_crypto_context *);
void pkinit_fini_req_crypto(pkinit_req_crypto_context);
krb5_error_code pkinit_init_identity_crypto(pkinit_identity_crypto_context *);
void pkinit_fini_identity_crypto(pkinit_identity_crypto_context);
krb5_error_code cms_contentinfo_create
(krb5_context context,
pkinit_plg_crypto_context plg_cryptoctx,
pkinit_req_crypto_context req_cryptoctx,
pkinit_identity_crypto_context id_cryptoctx,
int cms_msg_type,
unsigned char *in_data, unsigned int in_length,
unsigned char **out_data, unsigned int *out_data_len);
krb5_error_code cms_signeddata_create
(krb5_context context,
pkinit_plg_crypto_context plg_cryptoctx,
pkinit_req_crypto_context req_cryptoctx,
pkinit_identity_crypto_context id_cryptoctx,
int cms_msg_type,
unsigned char *auth_pack,
unsigned int auth_pack_len,
unsigned char **signed_data,
unsigned int *signed_data_len);
krb5_error_code cms_signeddata_verify
(krb5_context context,
pkinit_plg_crypto_context plg_cryptoctx,
pkinit_req_crypto_context req_cryptoctx,
pkinit_identity_crypto_context id_cryptoctx,
int cms_msg_type,
int require_crl_checking,
unsigned char *signed_data,
unsigned int signed_data_len,
unsigned char **auth_pack,
unsigned int *auth_pack_len,
unsigned char **authz_data,
unsigned int *authz_data_len,
int *is_signed);
krb5_error_code crypto_retrieve_signer_identity
(krb5_context context,
pkinit_identity_crypto_context id_cryptoctx,
const char **identity);
krb5_error_code crypto_retrieve_cert_sans
(krb5_context context,
pkinit_plg_crypto_context plg_cryptoctx,
pkinit_req_crypto_context req_cryptoctx,
pkinit_identity_crypto_context id_cryptoctx,
krb5_principal **pkinit_sans,
char ***upn_sans,
unsigned char ***kdc_hostname);
krb5_error_code crypto_check_cert_eku
(krb5_context context,
pkinit_plg_crypto_context plg_cryptoctx,
pkinit_req_crypto_context req_cryptoctx,
pkinit_identity_crypto_context id_cryptoctx,
int checking_kdc_cert,
int allow_secondary_usage,
int *eku_valid);
krb5_error_code client_create_dh
(krb5_context context,
pkinit_plg_crypto_context plg_cryptoctx,
pkinit_req_crypto_context req_cryptoctx,
pkinit_identity_crypto_context id_cryptoctx,
int dh_size,
krb5_data *spki_out);
krb5_error_code client_process_dh
(krb5_context context,
pkinit_plg_crypto_context plg_cryptoctx,
pkinit_req_crypto_context req_cryptoctx,
pkinit_identity_crypto_context id_cryptoctx,
unsigned char *dh_pubkey,
unsigned int dh_pubkey_len,
unsigned char **client_key_out,
unsigned int *client_key_len_out);
krb5_error_code server_check_dh
(krb5_context context,
pkinit_plg_crypto_context plg_cryptoctx,
pkinit_req_crypto_context req_cryptoctx,
pkinit_identity_crypto_context id_cryptoctx,
const krb5_data *client_spki,
int minbits);
krb5_error_code server_process_dh
(krb5_context context,
pkinit_plg_crypto_context plg_cryptoctx,
pkinit_req_crypto_context req_cryptoctx,
pkinit_identity_crypto_context id_cryptoctx,
unsigned char **dh_pubkey_out,
unsigned int *dh_pubkey_len_out,
unsigned char **server_key_out,
unsigned int *server_key_len_out);
krb5_error_code create_krb5_supportedCMSTypes
(krb5_context context,
pkinit_plg_crypto_context plg_cryptoctx,
pkinit_req_crypto_context req_cryptoctx,
pkinit_identity_crypto_context id_cryptoctx,
krb5_algorithm_identifier ***supportedCMSTypes);
krb5_error_code create_krb5_trustedCertifiers
(krb5_context context,
pkinit_plg_crypto_context plg_cryptoctx,
pkinit_req_crypto_context req_cryptoctx,
pkinit_identity_crypto_context id_cryptoctx,
krb5_external_principal_identifier ***trustedCertifiers);
krb5_error_code create_issuerAndSerial
(krb5_context context,
pkinit_plg_crypto_context plg_cryptoctx,
pkinit_req_crypto_context req_cryptoctx,
pkinit_identity_crypto_context id_cryptoctx,
unsigned char **kdcId_buf,
unsigned int *kdcId_len);
const pkinit_deferred_id * crypto_get_deferred_ids
(krb5_context context, pkinit_identity_crypto_context id_cryptoctx);
krb5_error_code crypto_set_deferred_id
(krb5_context context,
pkinit_identity_crypto_context id_cryptoctx,
const char *identity, const char *password);
krb5_error_code crypto_load_certs
(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_principal princ,
krb5_boolean defer_id_prompts);
krb5_error_code crypto_free_cert_info
(krb5_context context,
pkinit_plg_crypto_context plg_cryptoctx,
pkinit_req_crypto_context req_cryptoctx,
pkinit_identity_crypto_context id_cryptoctx);
krb5_error_code
crypto_cert_get_matching_data(krb5_context context,
pkinit_plg_crypto_context plg_cryptoctx,
pkinit_req_crypto_context req_cryptoctx,
pkinit_identity_crypto_context id_cryptoctx,
pkinit_cert_matching_data ***md_out);
void
crypto_cert_free_matching_data(krb5_context context,
pkinit_cert_matching_data *md);
void
crypto_cert_free_matching_data_list(krb5_context context,
pkinit_cert_matching_data **matchdata);
krb5_error_code
crypto_cert_select(krb5_context context, pkinit_identity_crypto_context idctx,
size_t cred_index);
krb5_error_code crypto_cert_select_default
(krb5_context context,
pkinit_plg_crypto_context plg_cryptoctx,
pkinit_req_crypto_context req_cryptoctx,
pkinit_identity_crypto_context id_cryptoctx);
krb5_error_code crypto_load_cas_and_crls
(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,
int idtype,
int catype,
char *id);
krb5_error_code pkinit_get_kdc_cert
(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_create_td_dh_parameters
(krb5_context context,
pkinit_plg_crypto_context plg_cryptoctx,
pkinit_req_crypto_context req_cryptoctx,
pkinit_identity_crypto_context id_cryptoctx,
pkinit_plg_opts *opts,
krb5_pa_data ***e_data_out);
krb5_error_code pkinit_process_td_dh_params
(krb5_context context,
pkinit_plg_crypto_context plg_cryptoctx,
pkinit_req_crypto_context req_cryptoctx,
pkinit_identity_crypto_context id_cryptoctx,
krb5_algorithm_identifier **algId,
int *new_dh_size);
krb5_error_code pkinit_create_td_invalid_certificate
(krb5_context context,
pkinit_plg_crypto_context plg_cryptoctx,
pkinit_req_crypto_context req_cryptoctx,
pkinit_identity_crypto_context id_cryptoctx,
krb5_pa_data ***e_data_out);
krb5_error_code pkinit_create_td_trusted_certifiers
(krb5_context context,
pkinit_plg_crypto_context plg_cryptoctx,
pkinit_req_crypto_context req_cryptoctx,
pkinit_identity_crypto_context id_cryptoctx,
krb5_pa_data ***e_data_out);
krb5_error_code pkinit_process_td_trusted_certifiers
(krb5_context context,
pkinit_plg_crypto_context plg_cryptoctx,
pkinit_req_crypto_context req_cryptoctx,
pkinit_identity_crypto_context id_cryptoctx,
krb5_external_principal_identifier **trustedCertifiers,
int td_type);
krb5_error_code pkinit_check_kdc_pkid
(krb5_context context,
pkinit_plg_crypto_context plg_cryptoctx,
pkinit_req_crypto_context req_cryptoctx,
pkinit_identity_crypto_context id_cryptoctx,
unsigned char *pdid_buf,
unsigned int pkid_len,
int *valid_kdcPkId);
krb5_error_code pkinit_identity_set_prompter
(pkinit_identity_crypto_context id_cryptoctx,
krb5_prompter_fct prompter,
void *prompter_data);
krb5_error_code
pkinit_kdf(krb5_context context, krb5_data *secret, const krb5_data *alg_oid,
krb5_const_principal party_u_info,
krb5_const_principal party_v_info, krb5_enctype enctype,
const krb5_data *as_req, const krb5_data *pk_as_rep,
krb5_keyblock *key_block);
extern const krb5_data kdf_sha1_id;
extern const krb5_data kdf_sha256_id;
extern const krb5_data kdf_sha512_id;
extern const krb5_data cms_sha1_id;
extern const krb5_data cms_sha256_id;
extern const krb5_data cms_sha384_id;
extern const krb5_data cms_sha512_id;
extern const krb5_data oakley_1024;
extern const krb5_data oakley_2048;
extern const krb5_data oakley_4096;
extern const krb5_data ec_p256;
extern const krb5_data ec_p384;
extern const krb5_data ec_p521;
extern const krb5_data dh_oid;
extern const krb5_data ec_oid;
extern krb5_data const * const supported_kdf_alg_ids[];
extern krb5_data const * const supported_cms_algs[];
krb5_error_code
crypto_encode_der_cert(krb5_context context, pkinit_req_crypto_context reqctx,
uint8_t **der_out, size_t *der_len);
krb5_error_code
crypto_req_cert_matching_data(krb5_context context,
pkinit_plg_crypto_context plgctx,
pkinit_req_crypto_context reqctx,
pkinit_cert_matching_data **md_out);
int parse_dh_min_bits(krb5_context context, const char *str);
krb5_error_code
crypto_generate_checksums(krb5_context context, const krb5_data *body,
krb5_data *cksum1_out,
krb5_pachecksum2 **cksum2_out);
krb5_error_code
crypto_verify_checksums(krb5_context context, krb5_data *body,
const krb5_data *cksum1,
const krb5_pachecksum2 *cksum2);
#endif