Home | History | Annotate | Line # | Download | only in hx509
hx509-protos.h revision 1.2
      1 /*	$NetBSD: hx509-protos.h,v 1.2 2019/12/15 22:50:50 christos Exp $	*/
      2 
      3 /* This is a generated file */
      4 #ifndef __hx509_protos_h__
      5 #define __hx509_protos_h__
      6 #ifndef DOXY
      7 
      8 #include <stdarg.h>
      9 
     10 #ifdef __cplusplus
     11 extern "C" {
     12 #endif
     13 
     14 #ifndef HX509_LIB
     15 #ifndef HX509_LIB_FUNCTION
     16 #if defined(_WIN32)
     17 #define HX509_LIB_FUNCTION __declspec(dllimport)
     18 #define HX509_LIB_CALL __stdcall
     19 #define HX509_LIB_VARIABLE __declspec(dllimport)
     20 #else
     21 #define HX509_LIB_FUNCTION
     22 #define HX509_LIB_CALL
     23 #define HX509_LIB_VARIABLE
     24 #endif
     25 #endif
     26 #endif
     27 /**
     28  * Print a bitstring using a hx509_vprint_func function. To print to
     29  * stdout use hx509_print_stdout().
     30  *
     31  * @param b bit string to print.
     32  * @param func hx509_vprint_func to print with.
     33  * @param ctx context variable to hx509_vprint_func function.
     34  *
     35  * @ingroup hx509_print
     36  */
     37 
     38 void
     39 hx509_bitstring_print (
     40 	const heim_bit_string */*b*/,
     41 	hx509_vprint_func /*func*/,
     42 	void */*ctx*/);
     43 
     44 /**
     45  * Sign a to-be-signed certificate object with a issuer certificate.
     46  *
     47  * The caller needs to at least have called the following functions on the
     48  * to-be-signed certificate object:
     49  * - hx509_ca_tbs_init()
     50  * - hx509_ca_tbs_set_subject()
     51  * - hx509_ca_tbs_set_spki()
     52  *
     53  * When done the to-be-signed certificate object should be freed with
     54  * hx509_ca_tbs_free().
     55  *
     56  * When creating self-signed certificate use hx509_ca_sign_self() instead.
     57  *
     58  * @param context A hx509 context.
     59  * @param tbs object to be signed.
     60  * @param signer the CA certificate object to sign with (need private key).
     61  * @param certificate return cerificate, free with hx509_cert_free().
     62  *
     63  * @return An hx509 error code, see hx509_get_error_string().
     64  *
     65  * @ingroup hx509_ca
     66  */
     67 
     68 int
     69 hx509_ca_sign (
     70 	hx509_context /*context*/,
     71 	hx509_ca_tbs /*tbs*/,
     72 	hx509_cert /*signer*/,
     73 	hx509_cert */*certificate*/);
     74 
     75 /**
     76  * Work just like hx509_ca_sign() but signs it-self.
     77  *
     78  * @param context A hx509 context.
     79  * @param tbs object to be signed.
     80  * @param signer private key to sign with.
     81  * @param certificate return cerificate, free with hx509_cert_free().
     82  *
     83  * @return An hx509 error code, see hx509_get_error_string().
     84  *
     85  * @ingroup hx509_ca
     86  */
     87 
     88 int
     89 hx509_ca_sign_self (
     90 	hx509_context /*context*/,
     91 	hx509_ca_tbs /*tbs*/,
     92 	hx509_private_key /*signer*/,
     93 	hx509_cert */*certificate*/);
     94 
     95 /**
     96  * Add CRL distribution point URI to the to-be-signed certificate
     97  * object.
     98  *
     99  * @param context A hx509 context.
    100  * @param tbs object to be signed.
    101  * @param uri uri to the CRL.
    102  * @param issuername name of the issuer.
    103  *
    104  * @return An hx509 error code, see hx509_get_error_string().
    105  *
    106  * @ingroup hx509_ca
    107  */
    108 
    109 int
    110 hx509_ca_tbs_add_crl_dp_uri (
    111 	hx509_context /*context*/,
    112 	hx509_ca_tbs /*tbs*/,
    113 	const char */*uri*/,
    114 	hx509_name /*issuername*/);
    115 
    116 /**
    117  * An an extended key usage to the to-be-signed certificate object.
    118  * Duplicates will detected and not added.
    119  *
    120  * @param context A hx509 context.
    121  * @param tbs object to be signed.
    122  * @param oid extended key usage to add.
    123  *
    124  * @return An hx509 error code, see hx509_get_error_string().
    125  *
    126  * @ingroup hx509_ca
    127  */
    128 
    129 int
    130 hx509_ca_tbs_add_eku (
    131 	hx509_context /*context*/,
    132 	hx509_ca_tbs /*tbs*/,
    133 	const heim_oid */*oid*/);
    134 
    135 /**
    136  * Add a Subject Alternative Name hostname to to-be-signed certificate
    137  * object. A domain match starts with ., an exact match does not.
    138  *
    139  * Example of a an domain match: .domain.se matches the hostname
    140  * host.domain.se.
    141  *
    142  * @param context A hx509 context.
    143  * @param tbs object to be signed.
    144  * @param dnsname a hostame.
    145  *
    146  * @return An hx509 error code, see hx509_get_error_string().
    147  *
    148  * @ingroup hx509_ca
    149  */
    150 
    151 int
    152 hx509_ca_tbs_add_san_hostname (
    153 	hx509_context /*context*/,
    154 	hx509_ca_tbs /*tbs*/,
    155 	const char */*dnsname*/);
    156 
    157 /**
    158  * Add a Jabber/XMPP jid Subject Alternative Name to the to-be-signed
    159  * certificate object. The jid is an UTF8 string.
    160  *
    161  * @param context A hx509 context.
    162  * @param tbs object to be signed.
    163  * @param jid string of an a jabber id in UTF8.
    164  *
    165  * @return An hx509 error code, see hx509_get_error_string().
    166  *
    167  * @ingroup hx509_ca
    168  */
    169 
    170 int
    171 hx509_ca_tbs_add_san_jid (
    172 	hx509_context /*context*/,
    173 	hx509_ca_tbs /*tbs*/,
    174 	const char */*jid*/);
    175 
    176 /**
    177  * Add Microsoft UPN Subject Alternative Name to the to-be-signed
    178  * certificate object. The principal string is a UTF8 string.
    179  *
    180  * @param context A hx509 context.
    181  * @param tbs object to be signed.
    182  * @param principal Microsoft UPN string.
    183  *
    184  * @return An hx509 error code, see hx509_get_error_string().
    185  *
    186  * @ingroup hx509_ca
    187  */
    188 
    189 int
    190 hx509_ca_tbs_add_san_ms_upn (
    191 	hx509_context /*context*/,
    192 	hx509_ca_tbs /*tbs*/,
    193 	const char */*principal*/);
    194 
    195 /**
    196  * Add Subject Alternative Name otherName to the to-be-signed
    197  * certificate object.
    198  *
    199  * @param context A hx509 context.
    200  * @param tbs object to be signed.
    201  * @param oid the oid of the OtherName.
    202  * @param os data in the other name.
    203  *
    204  * @return An hx509 error code, see hx509_get_error_string().
    205  *
    206  * @ingroup hx509_ca
    207  */
    208 
    209 int
    210 hx509_ca_tbs_add_san_otherName (
    211 	hx509_context /*context*/,
    212 	hx509_ca_tbs /*tbs*/,
    213 	const heim_oid */*oid*/,
    214 	const heim_octet_string */*os*/);
    215 
    216 /**
    217  * Add Kerberos Subject Alternative Name to the to-be-signed
    218  * certificate object. The principal string is a UTF8 string.
    219  *
    220  * @param context A hx509 context.
    221  * @param tbs object to be signed.
    222  * @param principal Kerberos principal to add to the certificate.
    223  *
    224  * @return An hx509 error code, see hx509_get_error_string().
    225  *
    226  * @ingroup hx509_ca
    227  */
    228 
    229 int
    230 hx509_ca_tbs_add_san_pkinit (
    231 	hx509_context /*context*/,
    232 	hx509_ca_tbs /*tbs*/,
    233 	const char */*principal*/);
    234 
    235 /**
    236  * Add a Subject Alternative Name rfc822 (email address) to
    237  * to-be-signed certificate object.
    238  *
    239  * @param context A hx509 context.
    240  * @param tbs object to be signed.
    241  * @param rfc822Name a string to a email address.
    242  *
    243  * @return An hx509 error code, see hx509_get_error_string().
    244  *
    245  * @ingroup hx509_ca
    246  */
    247 
    248 int
    249 hx509_ca_tbs_add_san_rfc822name (
    250 	hx509_context /*context*/,
    251 	hx509_ca_tbs /*tbs*/,
    252 	const char */*rfc822Name*/);
    253 
    254 /**
    255  * Free an To Be Signed object.
    256  *
    257  * @param tbs object to free.
    258  *
    259  * @ingroup hx509_ca
    260  */
    261 
    262 void
    263 hx509_ca_tbs_free (hx509_ca_tbs */*tbs*/);
    264 
    265 /**
    266  * Allocate an to-be-signed certificate object that will be converted
    267  * into an certificate.
    268  *
    269  * @param context A hx509 context.
    270  * @param tbs returned to-be-signed certicate object, free with
    271  * hx509_ca_tbs_free().
    272  *
    273  * @return An hx509 error code, see hx509_get_error_string().
    274  *
    275  * @ingroup hx509_ca
    276  */
    277 
    278 int
    279 hx509_ca_tbs_init (
    280 	hx509_context /*context*/,
    281 	hx509_ca_tbs */*tbs*/);
    282 
    283 /**
    284  * Make the to-be-signed certificate object a CA certificate. If the
    285  * pathLenConstraint is negative path length constraint is used.
    286  *
    287  * @param context A hx509 context.
    288  * @param tbs object to be signed.
    289  * @param pathLenConstraint path length constraint, negative, no
    290  * constraint.
    291  *
    292  * @return An hx509 error code, see hx509_get_error_string().
    293  *
    294  * @ingroup hx509_ca
    295  */
    296 
    297 int
    298 hx509_ca_tbs_set_ca (
    299 	hx509_context /*context*/,
    300 	hx509_ca_tbs /*tbs*/,
    301 	int /*pathLenConstraint*/);
    302 
    303 /**
    304  * Make the to-be-signed certificate object a windows domain controller certificate.
    305  *
    306  * @param context A hx509 context.
    307  * @param tbs object to be signed.
    308  *
    309  * @return An hx509 error code, see hx509_get_error_string().
    310  *
    311  * @ingroup hx509_ca
    312  */
    313 
    314 int
    315 hx509_ca_tbs_set_domaincontroller (
    316 	hx509_context /*context*/,
    317 	hx509_ca_tbs /*tbs*/);
    318 
    319 /**
    320  * Set the absolute time when the certificate is valid to.
    321  *
    322  * @param context A hx509 context.
    323  * @param tbs object to be signed.
    324  * @param t time when the certificate will expire
    325  *
    326  * @return An hx509 error code, see hx509_get_error_string().
    327  *
    328  * @ingroup hx509_ca
    329  */
    330 
    331 int
    332 hx509_ca_tbs_set_notAfter (
    333 	hx509_context /*context*/,
    334 	hx509_ca_tbs /*tbs*/,
    335 	time_t /*t*/);
    336 
    337 /**
    338  * Set the relative time when the certificiate is going to expire.
    339  *
    340  * @param context A hx509 context.
    341  * @param tbs object to be signed.
    342  * @param delta seconds to the certificate is going to expire.
    343  *
    344  * @return An hx509 error code, see hx509_get_error_string().
    345  *
    346  * @ingroup hx509_ca
    347  */
    348 
    349 int
    350 hx509_ca_tbs_set_notAfter_lifetime (
    351 	hx509_context /*context*/,
    352 	hx509_ca_tbs /*tbs*/,
    353 	time_t /*delta*/);
    354 
    355 /**
    356  * Set the absolute time when the certificate is valid from. If not
    357  * set the current time will be used.
    358  *
    359  * @param context A hx509 context.
    360  * @param tbs object to be signed.
    361  * @param t time the certificated will start to be valid
    362  *
    363  * @return An hx509 error code, see hx509_get_error_string().
    364  *
    365  * @ingroup hx509_ca
    366  */
    367 
    368 int
    369 hx509_ca_tbs_set_notBefore (
    370 	hx509_context /*context*/,
    371 	hx509_ca_tbs /*tbs*/,
    372 	time_t /*t*/);
    373 
    374 /**
    375  * Make the to-be-signed certificate object a proxy certificate. If the
    376  * pathLenConstraint is negative path length constraint is used.
    377  *
    378  * @param context A hx509 context.
    379  * @param tbs object to be signed.
    380  * @param pathLenConstraint path length constraint, negative, no
    381  * constraint.
    382  *
    383  * @return An hx509 error code, see hx509_get_error_string().
    384  *
    385  * @ingroup hx509_ca
    386  */
    387 
    388 int
    389 hx509_ca_tbs_set_proxy (
    390 	hx509_context /*context*/,
    391 	hx509_ca_tbs /*tbs*/,
    392 	int /*pathLenConstraint*/);
    393 
    394 /**
    395  * Set the serial number to use for to-be-signed certificate object.
    396  *
    397  * @param context A hx509 context.
    398  * @param tbs object to be signed.
    399  * @param serialNumber serial number to use for the to-be-signed
    400  * certificate object.
    401  *
    402  * @return An hx509 error code, see hx509_get_error_string().
    403  *
    404  * @ingroup hx509_ca
    405  */
    406 
    407 int
    408 hx509_ca_tbs_set_serialnumber (
    409 	hx509_context /*context*/,
    410 	hx509_ca_tbs /*tbs*/,
    411 	const heim_integer */*serialNumber*/);
    412 
    413 /**
    414  * Set signature algorithm on the to be signed certificate
    415  *
    416  * @param context A hx509 context.
    417  * @param tbs object to be signed.
    418  * @param sigalg signature algorithm to use
    419  *
    420  * @return An hx509 error code, see hx509_get_error_string().
    421  *
    422  * @ingroup hx509_ca
    423  */
    424 
    425 int
    426 hx509_ca_tbs_set_signature_algorithm (
    427 	hx509_context /*context*/,
    428 	hx509_ca_tbs /*tbs*/,
    429 	const AlgorithmIdentifier */*sigalg*/);
    430 
    431 /**
    432  * Set the subject public key info (SPKI) in the to-be-signed certificate
    433  * object. SPKI is the public key and key related parameters in the
    434  * certificate.
    435  *
    436  * @param context A hx509 context.
    437  * @param tbs object to be signed.
    438  * @param spki subject public key info to use for the to-be-signed certificate object.
    439  *
    440  * @return An hx509 error code, see hx509_get_error_string().
    441  *
    442  * @ingroup hx509_ca
    443  */
    444 
    445 int
    446 hx509_ca_tbs_set_spki (
    447 	hx509_context /*context*/,
    448 	hx509_ca_tbs /*tbs*/,
    449 	const SubjectPublicKeyInfo */*spki*/);
    450 
    451 /**
    452  * Set the subject name of a to-be-signed certificate object.
    453  *
    454  * @param context A hx509 context.
    455  * @param tbs object to be signed.
    456  * @param subject the name to set a subject.
    457  *
    458  * @return An hx509 error code, see hx509_get_error_string().
    459  *
    460  * @ingroup hx509_ca
    461  */
    462 
    463 int
    464 hx509_ca_tbs_set_subject (
    465 	hx509_context /*context*/,
    466 	hx509_ca_tbs /*tbs*/,
    467 	hx509_name /*subject*/);
    468 
    469 /**
    470  * Initialize the to-be-signed certificate object from a template certifiate.
    471  *
    472  * @param context A hx509 context.
    473  * @param tbs object to be signed.
    474  * @param flags bit field selecting what to copy from the template
    475  * certifiate.
    476  * @param cert template certificate.
    477  *
    478  * @return An hx509 error code, see hx509_get_error_string().
    479  *
    480  * @ingroup hx509_ca
    481  */
    482 
    483 int
    484 hx509_ca_tbs_set_template (
    485 	hx509_context /*context*/,
    486 	hx509_ca_tbs /*tbs*/,
    487 	int /*flags*/,
    488 	hx509_cert /*cert*/);
    489 
    490 /**
    491  * Set the issuerUniqueID and subjectUniqueID
    492  *
    493  * These are only supposed to be used considered with version 2
    494  * certificates, replaced by the two extensions SubjectKeyIdentifier
    495  * and IssuerKeyIdentifier. This function is to allow application
    496  * using legacy protocol to issue them.
    497  *
    498  * @param context A hx509 context.
    499  * @param tbs object to be signed.
    500  * @param issuerUniqueID to be set
    501  * @param subjectUniqueID to be set
    502  *
    503  * @return An hx509 error code, see hx509_get_error_string().
    504  *
    505  * @ingroup hx509_ca
    506  */
    507 
    508 int
    509 hx509_ca_tbs_set_unique (
    510 	hx509_context /*context*/,
    511 	hx509_ca_tbs /*tbs*/,
    512 	const heim_bit_string */*subjectUniqueID*/,
    513 	const heim_bit_string */*issuerUniqueID*/);
    514 
    515 /**
    516  * Expand the the subject name in the to-be-signed certificate object
    517  * using hx509_name_expand().
    518  *
    519  * @param context A hx509 context.
    520  * @param tbs object to be signed.
    521  * @param env environment variable to expand variables in the subject
    522  * name, see hx509_env_init().
    523  *
    524  * @return An hx509 error code, see hx509_get_error_string().
    525  *
    526  * @ingroup hx509_ca
    527  */
    528 
    529 int
    530 hx509_ca_tbs_subject_expand (
    531 	hx509_context /*context*/,
    532 	hx509_ca_tbs /*tbs*/,
    533 	hx509_env /*env*/);
    534 
    535 /**
    536  * Make of template units, use to build flags argument to
    537  * hx509_ca_tbs_set_template() with parse_units().
    538  *
    539  * @return an units structure.
    540  *
    541  * @ingroup hx509_ca
    542  */
    543 
    544 const struct units *
    545 hx509_ca_tbs_template_units (void);
    546 
    547 /**
    548  * Encodes the hx509 certificate as a DER encode binary.
    549  *
    550  * @param context A hx509 context.
    551  * @param c the certificate to encode.
    552  * @param os the encode certificate, set to NULL, 0 on case of
    553  * error. Free the os->data with hx509_xfree().
    554  *
    555  * @return An hx509 error code, see hx509_get_error_string().
    556  *
    557  * @ingroup hx509_cert
    558  */
    559 
    560 int
    561 hx509_cert_binary (
    562 	hx509_context /*context*/,
    563 	hx509_cert /*c*/,
    564 	heim_octet_string */*os*/);
    565 
    566 /**
    567  * Check the extended key usage on the hx509 certificate.
    568  *
    569  * @param context A hx509 context.
    570  * @param cert A hx509 context.
    571  * @param eku the EKU to check for
    572  * @param allow_any_eku if the any EKU is set, allow that to be a
    573  * substitute.
    574  *
    575  * @return An hx509 error code, see hx509_get_error_string().
    576  *
    577  * @ingroup hx509_cert
    578  */
    579 
    580 int
    581 hx509_cert_check_eku (
    582 	hx509_context /*context*/,
    583 	hx509_cert /*cert*/,
    584 	const heim_oid */*eku*/,
    585 	int /*allow_any_eku*/);
    586 
    587 /**
    588  * Compare to hx509 certificate object, useful for sorting.
    589  *
    590  * @param p a hx509 certificate object.
    591  * @param q a hx509 certificate object.
    592  *
    593  * @return 0 the objects are the same, returns > 0 is p is "larger"
    594  * then q, < 0 if p is "smaller" then q.
    595  *
    596  * @ingroup hx509_cert
    597  */
    598 
    599 int
    600 hx509_cert_cmp (
    601 	hx509_cert /*p*/,
    602 	hx509_cert /*q*/);
    603 
    604 /**
    605  * Return a list of subjectAltNames specified by oid in the
    606  * certificate. On error the
    607  *
    608  * The returned list of octet string should be freed with
    609  * hx509_free_octet_string_list().
    610  *
    611  * @param context A hx509 context.
    612  * @param cert a hx509 certificate object.
    613  * @param oid an oid to for SubjectAltName.
    614  * @param list list of matching SubjectAltName.
    615  *
    616  * @return An hx509 error code, see hx509_get_error_string().
    617  *
    618  * @ingroup hx509_cert
    619  */
    620 
    621 int
    622 hx509_cert_find_subjectAltName_otherName (
    623 	hx509_context /*context*/,
    624 	hx509_cert /*cert*/,
    625 	const heim_oid */*oid*/,
    626 	hx509_octet_string_list */*list*/);
    627 
    628 /**
    629  * Free reference to the hx509 certificate object, if the refcounter
    630  * reaches 0, the object if freed. Its allowed to pass in NULL.
    631  *
    632  * @param cert the cert to free.
    633  *
    634  * @ingroup hx509_cert
    635  */
    636 
    637 void
    638 hx509_cert_free (hx509_cert /*cert*/);
    639 
    640 /**
    641  * Get the SubjectPublicKeyInfo structure from the hx509 certificate.
    642  *
    643  * @param context a hx509 context.
    644  * @param p a hx509 certificate object.
    645  * @param spki SubjectPublicKeyInfo, should be freed with
    646  * free_SubjectPublicKeyInfo().
    647  *
    648  * @return An hx509 error code, see hx509_get_error_string().
    649  *
    650  * @ingroup hx509_cert
    651  */
    652 
    653 int
    654 hx509_cert_get_SPKI (
    655 	hx509_context /*context*/,
    656 	hx509_cert /*p*/,
    657 	SubjectPublicKeyInfo */*spki*/);
    658 
    659 /**
    660  * Get the AlgorithmIdentifier from the hx509 certificate.
    661  *
    662  * @param context a hx509 context.
    663  * @param p a hx509 certificate object.
    664  * @param alg AlgorithmIdentifier, should be freed with
    665  *            free_AlgorithmIdentifier(). The algorithmidentifier is
    666  *            typicly rsaEncryption, or id-ecPublicKey, or some other
    667  *            public key mechanism.
    668  *
    669  * @return An hx509 error code, see hx509_get_error_string().
    670  *
    671  * @ingroup hx509_cert
    672  */
    673 
    674 int
    675 hx509_cert_get_SPKI_AlgorithmIdentifier (
    676 	hx509_context /*context*/,
    677 	hx509_cert /*p*/,
    678 	AlgorithmIdentifier */*alg*/);
    679 
    680 /**
    681  * Get an external attribute for the certificate, examples are
    682  * friendly name and id.
    683  *
    684  * @param cert hx509 certificate object to search
    685  * @param oid an oid to search for.
    686  *
    687  * @return an hx509_cert_attribute, only valid as long as the
    688  * certificate is referenced.
    689  *
    690  * @ingroup hx509_cert
    691  */
    692 
    693 hx509_cert_attribute
    694 hx509_cert_get_attribute (
    695 	hx509_cert /*cert*/,
    696 	const heim_oid */*oid*/);
    697 
    698 /**
    699  * Return the name of the base subject of the hx509 certificate. If
    700  * the certiicate is a verified proxy certificate, the this function
    701  * return the base certificate (root of the proxy chain). If the proxy
    702  * certificate is not verified with the base certificate
    703  * HX509_PROXY_CERTIFICATE_NOT_CANONICALIZED is returned.
    704  *
    705  * @param context a hx509 context.
    706  * @param c a hx509 certificate object.
    707  * @param name a pointer to a hx509 name, should be freed by
    708  * hx509_name_free(). See also hx509_cert_get_subject().
    709  *
    710  * @return An hx509 error code, see hx509_get_error_string().
    711  *
    712  * @ingroup hx509_cert
    713  */
    714 
    715 int
    716 hx509_cert_get_base_subject (
    717 	hx509_context /*context*/,
    718 	hx509_cert /*c*/,
    719 	hx509_name */*name*/);
    720 
    721 /**
    722  * Get friendly name of the certificate.
    723  *
    724  * @param cert cert to get the friendly name from.
    725  *
    726  * @return an friendly name or NULL if there is. The friendly name is
    727  * only valid as long as the certificate is referenced.
    728  *
    729  * @ingroup hx509_cert
    730  */
    731 
    732 const char *
    733 hx509_cert_get_friendly_name (hx509_cert /*cert*/);
    734 
    735 /**
    736  * Return the name of the issuer of the hx509 certificate.
    737  *
    738  * @param p a hx509 certificate object.
    739  * @param name a pointer to a hx509 name, should be freed by
    740  * hx509_name_free().
    741  *
    742  * @return An hx509 error code, see hx509_get_error_string().
    743  *
    744  * @ingroup hx509_cert
    745  */
    746 
    747 int
    748 hx509_cert_get_issuer (
    749 	hx509_cert /*p*/,
    750 	hx509_name */*name*/);
    751 
    752 /**
    753  * Get a copy of the Issuer Unique ID
    754  *
    755  * @param context a hx509_context
    756  * @param p a hx509 certificate
    757  * @param issuer the issuer id returned, free with der_free_bit_string()
    758  *
    759  * @return An hx509 error code, see hx509_get_error_string(). The
    760  * error code HX509_EXTENSION_NOT_FOUND is returned if the certificate
    761  * doesn't have a issuerUniqueID
    762  *
    763  * @ingroup hx509_cert
    764  */
    765 
    766 int
    767 hx509_cert_get_issuer_unique_id (
    768 	hx509_context /*context*/,
    769 	hx509_cert /*p*/,
    770 	heim_bit_string */*issuer*/);
    771 
    772 /**
    773  * Get notAfter time of the certificate.
    774  *
    775  * @param p a hx509 certificate object.
    776  *
    777  * @return return not after time.
    778  *
    779  * @ingroup hx509_cert
    780  */
    781 
    782 time_t
    783 hx509_cert_get_notAfter (hx509_cert /*p*/);
    784 
    785 /**
    786  * Get notBefore time of the certificate.
    787  *
    788  * @param p a hx509 certificate object.
    789  *
    790  * @return return not before time
    791  *
    792  * @ingroup hx509_cert
    793  */
    794 
    795 time_t
    796 hx509_cert_get_notBefore (hx509_cert /*p*/);
    797 
    798 /**
    799  * Get serial number of the certificate.
    800  *
    801  * @param p a hx509 certificate object.
    802  * @param i serial number, should be freed ith der_free_heim_integer().
    803  *
    804  * @return An hx509 error code, see hx509_get_error_string().
    805  *
    806  * @ingroup hx509_cert
    807  */
    808 
    809 int
    810 hx509_cert_get_serialnumber (
    811 	hx509_cert /*p*/,
    812 	heim_integer */*i*/);
    813 
    814 /**
    815  * Return the name of the subject of the hx509 certificate.
    816  *
    817  * @param p a hx509 certificate object.
    818  * @param name a pointer to a hx509 name, should be freed by
    819  * hx509_name_free(). See also hx509_cert_get_base_subject().
    820  *
    821  * @return An hx509 error code, see hx509_get_error_string().
    822  *
    823  * @ingroup hx509_cert
    824  */
    825 
    826 int
    827 hx509_cert_get_subject (
    828 	hx509_cert /*p*/,
    829 	hx509_name */*name*/);
    830 
    831 /**
    832  * Get a copy of the Subect Unique ID
    833  *
    834  * @param context a hx509_context
    835  * @param p a hx509 certificate
    836  * @param subject the subject id returned, free with der_free_bit_string()
    837  *
    838  * @return An hx509 error code, see hx509_get_error_string(). The
    839  * error code HX509_EXTENSION_NOT_FOUND is returned if the certificate
    840  * doesn't have a subjectUniqueID
    841  *
    842  * @ingroup hx509_cert
    843  */
    844 
    845 int
    846 hx509_cert_get_subject_unique_id (
    847 	hx509_context /*context*/,
    848 	hx509_cert /*p*/,
    849 	heim_bit_string */*subject*/);
    850 
    851 int
    852 hx509_cert_have_private_key (hx509_cert /*p*/);
    853 
    854 /**
    855  * Allocate and init an hx509 certificate object from the decoded
    856  * certificate `c.
    857  *
    858  * @param context A hx509 context.
    859  * @param c
    860  * @param error
    861  *
    862  * @return Returns an hx509 certificate
    863  *
    864  * @ingroup hx509_cert
    865  */
    866 
    867 hx509_cert
    868 hx509_cert_init (
    869 	hx509_context /*context*/,
    870 	const Certificate */*c*/,
    871 	heim_error_t */*error*/);
    872 
    873 /**
    874  * Just like hx509_cert_init(), but instead of a decode certificate
    875  * takes an pointer and length to a memory region that contains a
    876  * DER/BER encoded certificate.
    877  *
    878  * If the memory region doesn't contain just the certificate and
    879  * nothing more the function will fail with
    880  * HX509_EXTRA_DATA_AFTER_STRUCTURE.
    881  *
    882  * @param context A hx509 context.
    883  * @param ptr pointer to memory region containing encoded certificate.
    884  * @param len length of memory region.
    885  * @param error possibly returns an error
    886  *
    887  * @return An hx509 certificate
    888  *
    889  * @ingroup hx509_cert
    890  */
    891 
    892 hx509_cert
    893 hx509_cert_init_data (
    894 	hx509_context /*context*/,
    895 	const void */*ptr*/,
    896 	size_t /*len*/,
    897 	heim_error_t */*error*/);
    898 
    899 /**
    900  * Print certificate usage for a certificate to a string.
    901  *
    902  * @param context A hx509 context.
    903  * @param c a certificate print the keyusage for.
    904  * @param s the return string with the keysage printed in to, free
    905  * with hx509_xfree().
    906  *
    907  * @return An hx509 error code, see hx509_get_error_string().
    908  *
    909  * @ingroup hx509_print
    910  */
    911 
    912 int
    913 hx509_cert_keyusage_print (
    914 	hx509_context /*context*/,
    915 	hx509_cert /*c*/,
    916 	char **/*s*/);
    917 
    918 int
    919 hx509_cert_public_encrypt (
    920 	hx509_context /*context*/,
    921 	const heim_octet_string */*cleartext*/,
    922 	const hx509_cert /*p*/,
    923 	heim_oid */*encryption_oid*/,
    924 	heim_octet_string */*ciphertext*/);
    925 
    926 /**
    927  * Add a reference to a hx509 certificate object.
    928  *
    929  * @param cert a pointer to an hx509 certificate object.
    930  *
    931  * @return the same object as is passed in.
    932  *
    933  * @ingroup hx509_cert
    934  */
    935 
    936 hx509_cert
    937 hx509_cert_ref (hx509_cert /*cert*/);
    938 
    939 /**
    940  * Set the friendly name on the certificate.
    941  *
    942  * @param cert The certificate to set the friendly name on
    943  * @param name Friendly name.
    944  *
    945  * @return An hx509 error code, see hx509_get_error_string().
    946  *
    947  * @ingroup hx509_cert
    948  */
    949 
    950 int
    951 hx509_cert_set_friendly_name (
    952 	hx509_cert /*cert*/,
    953 	const char */*name*/);
    954 
    955 /**
    956  * Add a certificate to the certificiate store.
    957  *
    958  * The receiving keyset certs will either increase reference counter
    959  * of the cert or make a deep copy, either way, the caller needs to
    960  * free the cert itself.
    961  *
    962  * @param context a hx509 context.
    963  * @param certs certificate store to add the certificate to.
    964  * @param cert certificate to add.
    965  *
    966  * @return Returns an hx509 error code.
    967  *
    968  * @ingroup hx509_keyset
    969  */
    970 
    971 int
    972 hx509_certs_add (
    973 	hx509_context /*context*/,
    974 	hx509_certs /*certs*/,
    975 	hx509_cert /*cert*/);
    976 
    977 /**
    978  * Same a hx509_certs_merge() but use a lock and name to describe the
    979  * from source.
    980  *
    981  * @param context a hx509 context.
    982  * @param to the store to merge into.
    983  * @param lock a lock that unlocks the certificates store, use NULL to
    984  * select no password/certifictes/prompt lock (see @ref page_lock).
    985  * @param name name of the source store
    986  *
    987  * @return Returns an hx509 error code.
    988  *
    989  * @ingroup hx509_keyset
    990  */
    991 
    992 int
    993 hx509_certs_append (
    994 	hx509_context /*context*/,
    995 	hx509_certs /*to*/,
    996 	hx509_lock /*lock*/,
    997 	const char */*name*/);
    998 
    999 /**
   1000  * End the iteration over certificates.
   1001  *
   1002  * @param context a hx509 context.
   1003  * @param certs certificate store to iterate over.
   1004  * @param cursor cursor that will keep track of progress, freed.
   1005  *
   1006  * @return Returns an hx509 error code.
   1007  *
   1008  * @ingroup hx509_keyset
   1009  */
   1010 
   1011 int
   1012 hx509_certs_end_seq (
   1013 	hx509_context /*context*/,
   1014 	hx509_certs /*certs*/,
   1015 	hx509_cursor /*cursor*/);
   1016 
   1017 /**
   1018  * Filter certificate matching the query.
   1019  *
   1020  * @param context a hx509 context.
   1021  * @param certs certificate store to search.
   1022  * @param q query allocated with @ref hx509_query functions.
   1023  * @param result the filtered certificate store, caller must free with
   1024  *        hx509_certs_free().
   1025  *
   1026  * @return Returns an hx509 error code.
   1027  *
   1028  * @ingroup hx509_keyset
   1029  */
   1030 
   1031 int
   1032 hx509_certs_filter (
   1033 	hx509_context /*context*/,
   1034 	hx509_certs /*certs*/,
   1035 	const hx509_query */*q*/,
   1036 	hx509_certs */*result*/);
   1037 
   1038 /**
   1039  * Find a certificate matching the query.
   1040  *
   1041  * @param context a hx509 context.
   1042  * @param certs certificate store to search.
   1043  * @param q query allocated with @ref hx509_query functions.
   1044  * @param r return certificate (or NULL on error), should be freed
   1045  * with hx509_cert_free().
   1046  *
   1047  * @return Returns an hx509 error code.
   1048  *
   1049  * @ingroup hx509_keyset
   1050  */
   1051 
   1052 int
   1053 hx509_certs_find (
   1054 	hx509_context /*context*/,
   1055 	hx509_certs /*certs*/,
   1056 	const hx509_query */*q*/,
   1057 	hx509_cert */*r*/);
   1058 
   1059 /**
   1060  * Free a certificate store.
   1061  *
   1062  * @param certs certificate store to free.
   1063  *
   1064  * @ingroup hx509_keyset
   1065  */
   1066 
   1067 void
   1068 hx509_certs_free (hx509_certs */*certs*/);
   1069 
   1070 /**
   1071  * Print some info about the certificate store.
   1072  *
   1073  * @param context a hx509 context.
   1074  * @param certs certificate store to print information about.
   1075  * @param func function that will get each line of the information, if
   1076  * NULL is used the data is printed on a FILE descriptor that should
   1077  * be passed in ctx, if ctx also is NULL, stdout is used.
   1078  * @param ctx parameter to func.
   1079  *
   1080  * @return Returns an hx509 error code.
   1081  *
   1082  * @ingroup hx509_keyset
   1083  */
   1084 
   1085 int
   1086 hx509_certs_info (
   1087 	hx509_context /*context*/,
   1088 	hx509_certs /*certs*/,
   1089 	int (*/*func*/)(void *, const char *),
   1090 	void */*ctx*/);
   1091 
   1092 /**
   1093  * Open or creates a new hx509 certificate store.
   1094  *
   1095  * @param context A hx509 context
   1096  * @param name name of the store, format is TYPE:type-specific-string,
   1097  * if NULL is used the MEMORY store is used.
   1098  * @param flags list of flags:
   1099  * - HX509_CERTS_CREATE create a new keystore of the specific TYPE.
   1100  * - HX509_CERTS_UNPROTECT_ALL fails if any private key failed to be extracted.
   1101  * @param lock a lock that unlocks the certificates store, use NULL to
   1102  * select no password/certifictes/prompt lock (see @ref page_lock).
   1103  * @param certs return pointer, free with hx509_certs_free().
   1104  *
   1105  * @return Returns an hx509 error code.
   1106  *
   1107  * @ingroup hx509_keyset
   1108  */
   1109 
   1110 int
   1111 hx509_certs_init (
   1112 	hx509_context /*context*/,
   1113 	const char */*name*/,
   1114 	int /*flags*/,
   1115 	hx509_lock /*lock*/,
   1116 	hx509_certs */*certs*/);
   1117 
   1118 /**
   1119  * Iterate over all certificates in a keystore and call a block
   1120  * for each of them.
   1121  *
   1122  * @param context a hx509 context.
   1123  * @param certs certificate store to iterate over.
   1124  * @param func block to call for each certificate. The function
   1125  * should return non-zero to abort the iteration, that value is passed
   1126  * back to the caller of hx509_certs_iter().
   1127  *
   1128  * @return Returns an hx509 error code.
   1129  *
   1130  * @ingroup hx509_keyset
   1131  */
   1132 
   1133 #ifdef __BLOCKS__
   1134 int
   1135 hx509_certs_iter (
   1136 	hx509_context /*context*/,
   1137 	hx509_certs /*certs*/,
   1138 	int (^func)(hx509_cert));
   1139 #endif /* __BLOCKS__ */
   1140 
   1141 /**
   1142  * Iterate over all certificates in a keystore and call a function
   1143  * for each of them.
   1144  *
   1145  * @param context a hx509 context.
   1146  * @param certs certificate store to iterate over.
   1147  * @param func function to call for each certificate. The function
   1148  * should return non-zero to abort the iteration, that value is passed
   1149  * back to the caller of hx509_certs_iter_f().
   1150  * @param ctx context variable that will passed to the function.
   1151  *
   1152  * @return Returns an hx509 error code.
   1153  *
   1154  * @ingroup hx509_keyset
   1155  */
   1156 
   1157 int
   1158 hx509_certs_iter_f (
   1159 	hx509_context /*context*/,
   1160 	hx509_certs /*certs*/,
   1161 	int (*/*func*/)(hx509_context, void *, hx509_cert),
   1162 	void */*ctx*/);
   1163 
   1164 /**
   1165  * Merge a certificate store into another. The from store is keep
   1166  * intact.
   1167  *
   1168  * @param context a hx509 context.
   1169  * @param to the store to merge into.
   1170  * @param from the store to copy the object from.
   1171  *
   1172  * @return Returns an hx509 error code.
   1173  *
   1174  * @ingroup hx509_keyset
   1175  */
   1176 
   1177 int
   1178 hx509_certs_merge (
   1179 	hx509_context /*context*/,
   1180 	hx509_certs /*to*/,
   1181 	hx509_certs /*from*/);
   1182 
   1183 /**
   1184  * Get next ceritificate from the certificate keystore pointed out by
   1185  * cursor.
   1186  *
   1187  * @param context a hx509 context.
   1188  * @param certs certificate store to iterate over.
   1189  * @param cursor cursor that keeps track of progress.
   1190  * @param cert return certificate next in store, NULL if the store
   1191  * contains no more certificates. Free with hx509_cert_free().
   1192  *
   1193  * @return Returns an hx509 error code.
   1194  *
   1195  * @ingroup hx509_keyset
   1196  */
   1197 
   1198 int
   1199 hx509_certs_next_cert (
   1200 	hx509_context /*context*/,
   1201 	hx509_certs /*certs*/,
   1202 	hx509_cursor /*cursor*/,
   1203 	hx509_cert */*cert*/);
   1204 
   1205 hx509_certs
   1206 hx509_certs_ref (hx509_certs /*certs*/);
   1207 
   1208 /**
   1209  * Start the integration
   1210  *
   1211  * @param context a hx509 context.
   1212  * @param certs certificate store to iterate over
   1213  * @param cursor cursor that will keep track of progress, free with
   1214  * hx509_certs_end_seq().
   1215  *
   1216  * @return Returns an hx509 error code. HX509_UNSUPPORTED_OPERATION is
   1217  * returned if the certificate store doesn't support the iteration
   1218  * operation.
   1219  *
   1220  * @ingroup hx509_keyset
   1221  */
   1222 
   1223 int
   1224 hx509_certs_start_seq (
   1225 	hx509_context /*context*/,
   1226 	hx509_certs /*certs*/,
   1227 	hx509_cursor */*cursor*/);
   1228 
   1229 /**
   1230  * Write the certificate store to stable storage.
   1231  *
   1232  * @param context A hx509 context.
   1233  * @param certs a certificate store to store.
   1234  * @param flags currently unused, use 0.
   1235  * @param lock a lock that unlocks the certificates store, use NULL to
   1236  * select no password/certifictes/prompt lock (see @ref page_lock).
   1237  *
   1238  * @return Returns an hx509 error code. HX509_UNSUPPORTED_OPERATION if
   1239  * the certificate store doesn't support the store operation.
   1240  *
   1241  * @ingroup hx509_keyset
   1242  */
   1243 
   1244 int
   1245 hx509_certs_store (
   1246 	hx509_context /*context*/,
   1247 	hx509_certs /*certs*/,
   1248 	int /*flags*/,
   1249 	hx509_lock /*lock*/);
   1250 
   1251 /**
   1252  * Function to use to hx509_certs_iter_f() as a function argument, the
   1253  * ctx variable to hx509_certs_iter_f() should be a FILE file descriptor.
   1254  *
   1255  * @param context a hx509 context.
   1256  * @param ctx used by hx509_certs_iter_f().
   1257  * @param c a certificate
   1258  *
   1259  * @return Returns an hx509 error code.
   1260  *
   1261  * @ingroup hx509_keyset
   1262  */
   1263 
   1264 int
   1265 hx509_ci_print_names (
   1266 	hx509_context /*context*/,
   1267 	void */*ctx*/,
   1268 	hx509_cert /*c*/);
   1269 
   1270 /**
   1271  * Resets the error strings the hx509 context.
   1272  *
   1273  * @param context A hx509 context.
   1274  *
   1275  * @ingroup hx509_error
   1276  */
   1277 
   1278 void
   1279 hx509_clear_error_string (hx509_context /*context*/);
   1280 
   1281 int
   1282 hx509_cms_create_signed (
   1283 	hx509_context /*context*/,
   1284 	int /*flags*/,
   1285 	const heim_oid */*eContentType*/,
   1286 	const void */*data*/,
   1287 	size_t /*length*/,
   1288 	const AlgorithmIdentifier */*digest_alg*/,
   1289 	hx509_certs /*certs*/,
   1290 	hx509_peer_info /*peer*/,
   1291 	hx509_certs /*anchors*/,
   1292 	hx509_certs /*pool*/,
   1293 	heim_octet_string */*signed_data*/);
   1294 
   1295 /**
   1296  * Decode SignedData and verify that the signature is correct.
   1297  *
   1298  * @param context A hx509 context.
   1299  * @param flags
   1300  * @param eContentType the type of the data.
   1301  * @param data data to sign
   1302  * @param length length of the data that data point to.
   1303  * @param digest_alg digest algorithm to use, use NULL to get the
   1304  * default or the peer determined algorithm.
   1305  * @param cert certificate to use for sign the data.
   1306  * @param peer info about the peer the message to send the message to,
   1307  * like what digest algorithm to use.
   1308  * @param anchors trust anchors that the client will use, used to
   1309  * polulate the certificates included in the message
   1310  * @param pool certificates to use in try to build the path to the
   1311  * trust anchors.
   1312  * @param signed_data the output of the function, free with
   1313  * der_free_octet_string().
   1314  *
   1315  * @return Returns an hx509 error code.
   1316  *
   1317  * @ingroup hx509_cms
   1318  */
   1319 
   1320 int
   1321 hx509_cms_create_signed_1 (
   1322 	hx509_context /*context*/,
   1323 	int /*flags*/,
   1324 	const heim_oid */*eContentType*/,
   1325 	const void */*data*/,
   1326 	size_t /*length*/,
   1327 	const AlgorithmIdentifier */*digest_alg*/,
   1328 	hx509_cert /*cert*/,
   1329 	hx509_peer_info /*peer*/,
   1330 	hx509_certs /*anchors*/,
   1331 	hx509_certs /*pool*/,
   1332 	heim_octet_string */*signed_data*/);
   1333 
   1334 /**
   1335      * Use HX509_CMS_SIGNATURE_NO_SIGNER to create no sigInfo (no
   1336      * signatures).
   1337  */
   1338 
   1339 int
   1340 hx509_cms_decrypt_encrypted (
   1341 	hx509_context /*context*/,
   1342 	hx509_lock /*lock*/,
   1343 	const void */*data*/,
   1344 	size_t /*length*/,
   1345 	heim_oid */*contentType*/,
   1346 	heim_octet_string */*content*/);
   1347 
   1348 /**
   1349  * Encrypt end encode EnvelopedData.
   1350  *
   1351  * Encrypt and encode EnvelopedData. The data is encrypted with a
   1352  * random key and the the random key is encrypted with the
   1353  * certificates private key. This limits what private key type can be
   1354  * used to RSA.
   1355  *
   1356  * @param context A hx509 context.
   1357  * @param flags flags to control the behavior.
   1358  *    - HX509_CMS_EV_NO_KU_CHECK - Don't check KU on certificate
   1359  *    - HX509_CMS_EV_ALLOW_WEAK - Allow weak crytpo
   1360  *    - HX509_CMS_EV_ID_NAME - prefer issuer name and serial number
   1361  * @param cert Certificate to encrypt the EnvelopedData encryption key
   1362  * with.
   1363  * @param data pointer the data to encrypt.
   1364  * @param length length of the data that data point to.
   1365  * @param encryption_type Encryption cipher to use for the bulk data,
   1366  * use NULL to get default.
   1367  * @param contentType type of the data that is encrypted
   1368  * @param content the output of the function,
   1369  * free with der_free_octet_string().
   1370  *
   1371  * @return an hx509 error code.
   1372  *
   1373  * @ingroup hx509_cms
   1374  */
   1375 
   1376 int
   1377 hx509_cms_envelope_1 (
   1378 	hx509_context /*context*/,
   1379 	int /*flags*/,
   1380 	hx509_cert /*cert*/,
   1381 	const void */*data*/,
   1382 	size_t /*length*/,
   1383 	const heim_oid */*encryption_type*/,
   1384 	const heim_oid */*contentType*/,
   1385 	heim_octet_string */*content*/);
   1386 
   1387 /**
   1388  * Decode and unencrypt EnvelopedData.
   1389  *
   1390  * Extract data and parameteres from from the EnvelopedData. Also
   1391  * supports using detached EnvelopedData.
   1392  *
   1393  * @param context A hx509 context.
   1394  * @param certs Certificate that can decrypt the EnvelopedData
   1395  * encryption key.
   1396  * @param flags HX509_CMS_UE flags to control the behavior.
   1397  * @param data pointer the structure the contains the DER/BER encoded
   1398  * EnvelopedData stucture.
   1399  * @param length length of the data that data point to.
   1400  * @param encryptedContent in case of detached signature, this
   1401  * contains the actual encrypted data, othersize its should be NULL.
   1402  * @param time_now set the current time, if zero the library uses now as the date.
   1403  * @param contentType output type oid, should be freed with der_free_oid().
   1404  * @param content the data, free with der_free_octet_string().
   1405  *
   1406  * @return an hx509 error code.
   1407  *
   1408  * @ingroup hx509_cms
   1409  */
   1410 
   1411 int
   1412 hx509_cms_unenvelope (
   1413 	hx509_context /*context*/,
   1414 	hx509_certs /*certs*/,
   1415 	int /*flags*/,
   1416 	const void */*data*/,
   1417 	size_t /*length*/,
   1418 	const heim_octet_string */*encryptedContent*/,
   1419 	time_t /*time_now*/,
   1420 	heim_oid */*contentType*/,
   1421 	heim_octet_string */*content*/);
   1422 
   1423 /**
   1424  * Decode an ContentInfo and unwrap data and oid it.
   1425  *
   1426  * @param in the encoded buffer.
   1427  * @param oid type of the content.
   1428  * @param out data to be wrapped.
   1429  * @param have_data since the data is optional, this flags show dthe
   1430  * diffrence between no data and the zero length data.
   1431  *
   1432  * @return Returns an hx509 error code.
   1433  *
   1434  * @ingroup hx509_cms
   1435  */
   1436 
   1437 int
   1438 hx509_cms_unwrap_ContentInfo (
   1439 	const heim_octet_string */*in*/,
   1440 	heim_oid */*oid*/,
   1441 	heim_octet_string */*out*/,
   1442 	int */*have_data*/);
   1443 
   1444 /**
   1445  * Decode SignedData and verify that the signature is correct.
   1446  *
   1447  * @param context A hx509 context.
   1448  * @param ctx a hx509 verify context.
   1449  * @param flags to control the behaivor of the function.
   1450  *    - HX509_CMS_VS_NO_KU_CHECK - Don't check KeyUsage
   1451  *    - HX509_CMS_VS_ALLOW_DATA_OID_MISMATCH - allow oid mismatch
   1452  *    - HX509_CMS_VS_ALLOW_ZERO_SIGNER - no signer, see below.
   1453  * @param data pointer to CMS SignedData encoded data.
   1454  * @param length length of the data that data point to.
   1455  * @param signedContent external data used for signature.
   1456  * @param pool certificate pool to build certificates paths.
   1457  * @param contentType free with der_free_oid().
   1458  * @param content the output of the function, free with
   1459  * der_free_octet_string().
   1460  * @param signer_certs list of the cerficates used to sign this
   1461  * request, free with hx509_certs_free().
   1462  *
   1463  * @return an hx509 error code.
   1464  *
   1465  * @ingroup hx509_cms
   1466  */
   1467 
   1468 int
   1469 hx509_cms_verify_signed (
   1470 	hx509_context /*context*/,
   1471 	hx509_verify_ctx /*ctx*/,
   1472 	unsigned int /*flags*/,
   1473 	const void */*data*/,
   1474 	size_t /*length*/,
   1475 	const heim_octet_string */*signedContent*/,
   1476 	hx509_certs /*pool*/,
   1477 	heim_oid */*contentType*/,
   1478 	heim_octet_string */*content*/,
   1479 	hx509_certs */*signer_certs*/);
   1480 
   1481 /**
   1482  * Wrap data and oid in a ContentInfo and encode it.
   1483  *
   1484  * @param oid type of the content.
   1485  * @param buf data to be wrapped. If a NULL pointer is passed in, the
   1486  * optional content field in the ContentInfo is not going be filled
   1487  * in.
   1488  * @param res the encoded buffer, the result should be freed with
   1489  * der_free_octet_string().
   1490  *
   1491  * @return Returns an hx509 error code.
   1492  *
   1493  * @ingroup hx509_cms
   1494  */
   1495 
   1496 int
   1497 hx509_cms_wrap_ContentInfo (
   1498 	const heim_oid */*oid*/,
   1499 	const heim_octet_string */*buf*/,
   1500 	heim_octet_string */*res*/);
   1501 
   1502 /**
   1503  * Free the context allocated by hx509_context_init().
   1504  *
   1505  * @param context context to be freed.
   1506  *
   1507  * @ingroup hx509
   1508  */
   1509 
   1510 void
   1511 hx509_context_free (hx509_context */*context*/);
   1512 
   1513 /**
   1514  * Creates a hx509 context that most functions in the library
   1515  * uses. The context is only allowed to be used by one thread at each
   1516  * moment. Free the context with hx509_context_free().
   1517  *
   1518  * @param context Returns a pointer to new hx509 context.
   1519  *
   1520  * @return Returns an hx509 error code.
   1521  *
   1522  * @ingroup hx509
   1523  */
   1524 
   1525 int
   1526 hx509_context_init (hx509_context */*context*/);
   1527 
   1528 /**
   1529  * Selects if the hx509_revoke_verify() function is going to require
   1530  * the existans of a revokation method (OCSP, CRL) or not. Note that
   1531  * hx509_verify_path(), hx509_cms_verify_signed(), and other function
   1532  * call hx509_revoke_verify().
   1533  *
   1534  * @param context hx509 context to change the flag for.
   1535  * @param flag zero, revokation method required, non zero missing
   1536  * revokation method ok
   1537  *
   1538  * @ingroup hx509_verify
   1539  */
   1540 
   1541 void
   1542 hx509_context_set_missing_revoke (
   1543 	hx509_context /*context*/,
   1544 	int /*flag*/);
   1545 
   1546 /**
   1547  * Add revoked certificate to an CRL context.
   1548  *
   1549  * @param context a hx509 context.
   1550  * @param crl the CRL to add the revoked certificate to.
   1551  * @param certs keyset of certificate to revoke.
   1552  *
   1553  * @return An hx509 error code, see hx509_get_error_string().
   1554  *
   1555  * @ingroup hx509_verify
   1556  */
   1557 
   1558 int
   1559 hx509_crl_add_revoked_certs (
   1560 	hx509_context /*context*/,
   1561 	hx509_crl /*crl*/,
   1562 	hx509_certs /*certs*/);
   1563 
   1564 /**
   1565  * Create a CRL context. Use hx509_crl_free() to free the CRL context.
   1566  *
   1567  * @param context a hx509 context.
   1568  * @param crl return pointer to a newly allocated CRL context.
   1569  *
   1570  * @return An hx509 error code, see hx509_get_error_string().
   1571  *
   1572  * @ingroup hx509_verify
   1573  */
   1574 
   1575 int
   1576 hx509_crl_alloc (
   1577 	hx509_context /*context*/,
   1578 	hx509_crl */*crl*/);
   1579 
   1580 /**
   1581  * Free a CRL context.
   1582  *
   1583  * @param context a hx509 context.
   1584  * @param crl a CRL context to free.
   1585  *
   1586  * @ingroup hx509_verify
   1587  */
   1588 
   1589 void
   1590 hx509_crl_free (
   1591 	hx509_context /*context*/,
   1592 	hx509_crl */*crl*/);
   1593 
   1594 /**
   1595  * Set the lifetime of a CRL context.
   1596  *
   1597  * @param context a hx509 context.
   1598  * @param crl a CRL context
   1599  * @param delta delta time the certificate is valid, library adds the
   1600  * current time to this.
   1601  *
   1602  * @return An hx509 error code, see hx509_get_error_string().
   1603  *
   1604  * @ingroup hx509_verify
   1605  */
   1606 
   1607 int
   1608 hx509_crl_lifetime (
   1609 	hx509_context /*context*/,
   1610 	hx509_crl /*crl*/,
   1611 	int /*delta*/);
   1612 
   1613 /**
   1614  * Sign a CRL and return an encode certificate.
   1615  *
   1616  * @param context a hx509 context.
   1617  * @param signer certificate to sign the CRL with
   1618  * @param crl the CRL to sign
   1619  * @param os return the signed and encoded CRL, free with
   1620  * free_heim_octet_string()
   1621  *
   1622  * @return An hx509 error code, see hx509_get_error_string().
   1623  *
   1624  * @ingroup hx509_verify
   1625  */
   1626 
   1627 int
   1628 hx509_crl_sign (
   1629 	hx509_context /*context*/,
   1630 	hx509_cert /*signer*/,
   1631 	hx509_crl /*crl*/,
   1632 	heim_octet_string */*os*/);
   1633 
   1634 const AlgorithmIdentifier *
   1635 hx509_crypto_aes128_cbc (void);
   1636 
   1637 const AlgorithmIdentifier *
   1638 hx509_crypto_aes256_cbc (void);
   1639 
   1640 void
   1641 hx509_crypto_allow_weak (hx509_crypto /*crypto*/);
   1642 
   1643 int
   1644 hx509_crypto_available (
   1645 	hx509_context /*context*/,
   1646 	int /*type*/,
   1647 	hx509_cert /*source*/,
   1648 	AlgorithmIdentifier **/*val*/,
   1649 	unsigned int */*plen*/);
   1650 
   1651 int
   1652 hx509_crypto_decrypt (
   1653 	hx509_crypto /*crypto*/,
   1654 	const void */*data*/,
   1655 	const size_t /*length*/,
   1656 	heim_octet_string */*ivec*/,
   1657 	heim_octet_string */*clear*/);
   1658 
   1659 const AlgorithmIdentifier *
   1660 hx509_crypto_des_rsdi_ede3_cbc (void);
   1661 
   1662 void
   1663 hx509_crypto_destroy (hx509_crypto /*crypto*/);
   1664 
   1665 int
   1666 hx509_crypto_encrypt (
   1667 	hx509_crypto /*crypto*/,
   1668 	const void */*data*/,
   1669 	const size_t /*length*/,
   1670 	const heim_octet_string */*ivec*/,
   1671 	heim_octet_string **/*ciphertext*/);
   1672 
   1673 const heim_oid *
   1674 hx509_crypto_enctype_by_name (const char */*name*/);
   1675 
   1676 void
   1677 hx509_crypto_free_algs (
   1678 	AlgorithmIdentifier */*val*/,
   1679 	unsigned int /*len*/);
   1680 
   1681 int
   1682 hx509_crypto_get_params (
   1683 	hx509_context /*context*/,
   1684 	hx509_crypto /*crypto*/,
   1685 	const heim_octet_string */*ivec*/,
   1686 	heim_octet_string */*param*/);
   1687 
   1688 int
   1689 hx509_crypto_init (
   1690 	hx509_context /*context*/,
   1691 	const char */*provider*/,
   1692 	const heim_oid */*enctype*/,
   1693 	hx509_crypto */*crypto*/);
   1694 
   1695 const char *
   1696 hx509_crypto_provider (hx509_crypto /*crypto*/);
   1697 
   1698 int
   1699 hx509_crypto_random_iv (
   1700 	hx509_crypto /*crypto*/,
   1701 	heim_octet_string */*ivec*/);
   1702 
   1703 int
   1704 hx509_crypto_select (
   1705 	const hx509_context /*context*/,
   1706 	int /*type*/,
   1707 	const hx509_private_key /*source*/,
   1708 	hx509_peer_info /*peer*/,
   1709 	AlgorithmIdentifier */*selected*/);
   1710 
   1711 int
   1712 hx509_crypto_set_key_data (
   1713 	hx509_crypto /*crypto*/,
   1714 	const void */*data*/,
   1715 	size_t /*length*/);
   1716 
   1717 int
   1718 hx509_crypto_set_key_name (
   1719 	hx509_crypto /*crypto*/,
   1720 	const char */*name*/);
   1721 
   1722 void
   1723 hx509_crypto_set_padding (
   1724 	hx509_crypto /*crypto*/,
   1725 	int /*padding_type*/);
   1726 
   1727 int
   1728 hx509_crypto_set_params (
   1729 	hx509_context /*context*/,
   1730 	hx509_crypto /*crypto*/,
   1731 	const heim_octet_string */*param*/,
   1732 	heim_octet_string */*ivec*/);
   1733 
   1734 int
   1735 hx509_crypto_set_random_key (
   1736 	hx509_crypto /*crypto*/,
   1737 	heim_octet_string */*key*/);
   1738 
   1739 /**
   1740  * Add a new key/value pair to the hx509_env.
   1741  *
   1742  * @param context A hx509 context.
   1743  * @param env environment to add the environment variable too.
   1744  * @param key key to add
   1745  * @param value value to add
   1746  *
   1747  * @return An hx509 error code, see hx509_get_error_string().
   1748  *
   1749  * @ingroup hx509_env
   1750  */
   1751 
   1752 int
   1753 hx509_env_add (
   1754 	hx509_context /*context*/,
   1755 	hx509_env */*env*/,
   1756 	const char */*key*/,
   1757 	const char */*value*/);
   1758 
   1759 /**
   1760  * Add a new key/binding pair to the hx509_env.
   1761  *
   1762  * @param context A hx509 context.
   1763  * @param env environment to add the environment variable too.
   1764  * @param key key to add
   1765  * @param list binding list to add
   1766  *
   1767  * @return An hx509 error code, see hx509_get_error_string().
   1768  *
   1769  * @ingroup hx509_env
   1770  */
   1771 
   1772 int
   1773 hx509_env_add_binding (
   1774 	hx509_context /*context*/,
   1775 	hx509_env */*env*/,
   1776 	const char */*key*/,
   1777 	hx509_env /*list*/);
   1778 
   1779 /**
   1780  * Search the hx509_env for a key.
   1781  *
   1782  * @param context A hx509 context.
   1783  * @param env environment to add the environment variable too.
   1784  * @param key key to search for.
   1785  *
   1786  * @return the value if the key is found, NULL otherwise.
   1787  *
   1788  * @ingroup hx509_env
   1789  */
   1790 
   1791 const char *
   1792 hx509_env_find (
   1793 	hx509_context /*context*/,
   1794 	hx509_env /*env*/,
   1795 	const char */*key*/);
   1796 
   1797 /**
   1798  * Search the hx509_env for a binding.
   1799  *
   1800  * @param context A hx509 context.
   1801  * @param env environment to add the environment variable too.
   1802  * @param key key to search for.
   1803  *
   1804  * @return the binding if the key is found, NULL if not found.
   1805  *
   1806  * @ingroup hx509_env
   1807  */
   1808 
   1809 hx509_env
   1810 hx509_env_find_binding (
   1811 	hx509_context /*context*/,
   1812 	hx509_env /*env*/,
   1813 	const char */*key*/);
   1814 
   1815 /**
   1816  * Free an hx509_env environment context.
   1817  *
   1818  * @param env the environment to free.
   1819  *
   1820  * @ingroup hx509_env
   1821  */
   1822 
   1823 void
   1824 hx509_env_free (hx509_env */*env*/);
   1825 
   1826 /**
   1827  * Search the hx509_env for a length based key.
   1828  *
   1829  * @param context A hx509 context.
   1830  * @param env environment to add the environment variable too.
   1831  * @param key key to search for.
   1832  * @param len length of key.
   1833  *
   1834  * @return the value if the key is found, NULL otherwise.
   1835  *
   1836  * @ingroup hx509_env
   1837  */
   1838 
   1839 const char *
   1840 hx509_env_lfind (
   1841 	hx509_context /*context*/,
   1842 	hx509_env /*env*/,
   1843 	const char */*key*/,
   1844 	size_t /*len*/);
   1845 
   1846 /**
   1847  * Print error message and fatally exit from error code
   1848  *
   1849  * @param context A hx509 context.
   1850  * @param exit_code exit() code from process.
   1851  * @param error_code Error code for the reason to exit.
   1852  * @param fmt format string with the exit message.
   1853  * @param ... argument to format string.
   1854  *
   1855  * @ingroup hx509_error
   1856  */
   1857 
   1858 void
   1859 hx509_err (
   1860 	hx509_context /*context*/,
   1861 	int /*exit_code*/,
   1862 	int /*error_code*/,
   1863 	const char */*fmt*/,
   1864 	...);
   1865 
   1866 hx509_private_key_ops *
   1867 hx509_find_private_alg (const heim_oid */*oid*/);
   1868 
   1869 /**
   1870  * Free error string returned by hx509_get_error_string().
   1871  *
   1872  * @param str error string to free.
   1873  *
   1874  * @ingroup hx509_error
   1875  */
   1876 
   1877 void
   1878 hx509_free_error_string (char */*str*/);
   1879 
   1880 /**
   1881  * Free a list of octet strings returned by another hx509 library
   1882  * function.
   1883  *
   1884  * @param list list to be freed.
   1885  *
   1886  * @ingroup hx509_misc
   1887  */
   1888 
   1889 void
   1890 hx509_free_octet_string_list (hx509_octet_string_list */*list*/);
   1891 
   1892 /**
   1893  * Unparse the hx509 name in name into a string.
   1894  *
   1895  * @param name the name to print
   1896  * @param str an allocated string returns the name in string form
   1897  *
   1898  * @return An hx509 error code, see hx509_get_error_string().
   1899  *
   1900  * @ingroup hx509_name
   1901  */
   1902 
   1903 int
   1904 hx509_general_name_unparse (
   1905 	GeneralName */*name*/,
   1906 	char **/*str*/);
   1907 
   1908 /**
   1909  * Get an error string from context associated with error_code.
   1910  *
   1911  * @param context A hx509 context.
   1912  * @param error_code Get error message for this error code.
   1913  *
   1914  * @return error string, free with hx509_free_error_string().
   1915  *
   1916  * @ingroup hx509_error
   1917  */
   1918 
   1919 char *
   1920 hx509_get_error_string (
   1921 	hx509_context /*context*/,
   1922 	int /*error_code*/);
   1923 
   1924 /**
   1925  * Get one random certificate from the certificate store.
   1926  *
   1927  * @param context a hx509 context.
   1928  * @param certs a certificate store to get the certificate from.
   1929  * @param c return certificate, should be freed with hx509_cert_free().
   1930  *
   1931  * @return Returns an hx509 error code.
   1932  *
   1933  * @ingroup hx509_keyset
   1934  */
   1935 
   1936 int
   1937 hx509_get_one_cert (
   1938 	hx509_context /*context*/,
   1939 	hx509_certs /*certs*/,
   1940 	hx509_cert */*c*/);
   1941 
   1942 int
   1943 hx509_lock_add_cert (
   1944 	hx509_context /*context*/,
   1945 	hx509_lock /*lock*/,
   1946 	hx509_cert /*cert*/);
   1947 
   1948 int
   1949 hx509_lock_add_certs (
   1950 	hx509_context /*context*/,
   1951 	hx509_lock /*lock*/,
   1952 	hx509_certs /*certs*/);
   1953 
   1954 int
   1955 hx509_lock_add_password (
   1956 	hx509_lock /*lock*/,
   1957 	const char */*password*/);
   1958 
   1959 int
   1960 hx509_lock_command_string (
   1961 	hx509_lock /*lock*/,
   1962 	const char */*string*/);
   1963 
   1964 void
   1965 hx509_lock_free (hx509_lock /*lock*/);
   1966 
   1967 /**
   1968  * @page page_lock Locking and unlocking certificates and encrypted data.
   1969  *
   1970  * See the library functions here: @ref hx509_lock
   1971  */
   1972 
   1973 int
   1974 hx509_lock_init (
   1975 	hx509_context /*context*/,
   1976 	hx509_lock */*lock*/);
   1977 
   1978 int
   1979 hx509_lock_prompt (
   1980 	hx509_lock /*lock*/,
   1981 	hx509_prompt */*prompt*/);
   1982 
   1983 void
   1984 hx509_lock_reset_certs (
   1985 	hx509_context /*context*/,
   1986 	hx509_lock /*lock*/);
   1987 
   1988 void
   1989 hx509_lock_reset_passwords (hx509_lock /*lock*/);
   1990 
   1991 void
   1992 hx509_lock_reset_promper (hx509_lock /*lock*/);
   1993 
   1994 int
   1995 hx509_lock_set_prompter (
   1996 	hx509_lock /*lock*/,
   1997 	hx509_prompter_fct /*prompt*/,
   1998 	void */*data*/);
   1999 
   2000 /**
   2001  * Convert a hx509_name object to DER encoded name.
   2002  *
   2003  * @param name name to concert
   2004  * @param os data to a DER encoded name, free the resulting octet
   2005  * string with hx509_xfree(os->data).
   2006  *
   2007  * @return An hx509 error code, see hx509_get_error_string().
   2008  *
   2009  * @ingroup hx509_name
   2010  */
   2011 
   2012 int
   2013 hx509_name_binary (
   2014 	const hx509_name /*name*/,
   2015 	heim_octet_string */*os*/);
   2016 
   2017 /**
   2018  * Compare to hx509 name object, useful for sorting.
   2019  *
   2020  * @param n1 a hx509 name object.
   2021  * @param n2 a hx509 name object.
   2022  *
   2023  * @return 0 the objects are the same, returns > 0 is n2 is "larger"
   2024  * then n2, < 0 if n1 is "smaller" then n2.
   2025  *
   2026  * @ingroup hx509_name
   2027  */
   2028 
   2029 int
   2030 hx509_name_cmp (
   2031 	hx509_name /*n1*/,
   2032 	hx509_name /*n2*/);
   2033 
   2034 /**
   2035  * Copy a hx509 name object.
   2036  *
   2037  * @param context A hx509 cotext.
   2038  * @param from the name to copy from
   2039  * @param to the name to copy to
   2040  *
   2041  * @return An hx509 error code, see hx509_get_error_string().
   2042  *
   2043  * @ingroup hx509_name
   2044  */
   2045 
   2046 int
   2047 hx509_name_copy (
   2048 	hx509_context /*context*/,
   2049 	const hx509_name /*from*/,
   2050 	hx509_name */*to*/);
   2051 
   2052 /**
   2053  * Expands variables in the name using env. Variables are on the form
   2054  * ${name}. Useful when dealing with certificate templates.
   2055  *
   2056  * @param context A hx509 cotext.
   2057  * @param name the name to expand.
   2058  * @param env environment variable to expand.
   2059  *
   2060  * @return An hx509 error code, see hx509_get_error_string().
   2061  *
   2062  * @ingroup hx509_name
   2063  */
   2064 
   2065 int
   2066 hx509_name_expand (
   2067 	hx509_context /*context*/,
   2068 	hx509_name /*name*/,
   2069 	hx509_env /*env*/);
   2070 
   2071 /**
   2072  * Free a hx509 name object, upond return *name will be NULL.
   2073  *
   2074  * @param name a hx509 name object to be freed.
   2075  *
   2076  * @ingroup hx509_name
   2077  */
   2078 
   2079 void
   2080 hx509_name_free (hx509_name */*name*/);
   2081 
   2082 /**
   2083  * Unparse the hx509 name in name into a string.
   2084  *
   2085  * @param name the name to check if its empty/null.
   2086  *
   2087  * @return non zero if the name is empty/null.
   2088  *
   2089  * @ingroup hx509_name
   2090  */
   2091 
   2092 int
   2093 hx509_name_is_null_p (const hx509_name /*name*/);
   2094 
   2095 int
   2096 hx509_name_normalize (
   2097 	hx509_context /*context*/,
   2098 	hx509_name /*name*/);
   2099 
   2100 /**
   2101  * Convert a hx509_name into a Name.
   2102  *
   2103  * @param from the name to copy from
   2104  * @param to the name to copy to
   2105  *
   2106  * @return An hx509 error code, see hx509_get_error_string().
   2107  *
   2108  * @ingroup hx509_name
   2109  */
   2110 
   2111 int
   2112 hx509_name_to_Name (
   2113 	const hx509_name /*from*/,
   2114 	Name */*to*/);
   2115 
   2116 /**
   2117  * Convert the hx509 name object into a printable string.
   2118  * The resulting string should be freed with free().
   2119  *
   2120  * @param name name to print
   2121  * @param str the string to return
   2122  *
   2123  * @return An hx509 error code, see hx509_get_error_string().
   2124  *
   2125  * @ingroup hx509_name
   2126  */
   2127 
   2128 int
   2129 hx509_name_to_string (
   2130 	const hx509_name /*name*/,
   2131 	char **/*str*/);
   2132 
   2133 /**
   2134  * Create an OCSP request for a set of certificates.
   2135  *
   2136  * @param context a hx509 context
   2137  * @param reqcerts list of certificates to request ocsp data for
   2138  * @param pool certificate pool to use when signing
   2139  * @param signer certificate to use to sign the request
   2140  * @param digest the signing algorithm in the request, if NULL use the
   2141  * default signature algorithm,
   2142  * @param request the encoded request, free with free_heim_octet_string().
   2143  * @param nonce nonce in the request, free with free_heim_octet_string().
   2144  *
   2145  * @return An hx509 error code, see hx509_get_error_string().
   2146  *
   2147  * @ingroup hx509_revoke
   2148  */
   2149 
   2150 int
   2151 hx509_ocsp_request (
   2152 	hx509_context /*context*/,
   2153 	hx509_certs /*reqcerts*/,
   2154 	hx509_certs /*pool*/,
   2155 	hx509_cert /*signer*/,
   2156 	const AlgorithmIdentifier */*digest*/,
   2157 	heim_octet_string */*request*/,
   2158 	heim_octet_string */*nonce*/);
   2159 
   2160 /**
   2161  * Verify that the certificate is part of the OCSP reply and it's not
   2162  * expired. Doesn't verify signature the OCSP reply or it's done by a
   2163  * authorized sender, that is assumed to be already done.
   2164  *
   2165  * @param context a hx509 context
   2166  * @param now the time right now, if 0, use the current time.
   2167  * @param cert the certificate to verify
   2168  * @param flags flags control the behavior
   2169  * @param data pointer to the encode ocsp reply
   2170  * @param length the length of the encode ocsp reply
   2171  * @param expiration return the time the OCSP will expire and need to
   2172  * be rechecked.
   2173  *
   2174  * @return An hx509 error code, see hx509_get_error_string().
   2175  *
   2176  * @ingroup hx509_verify
   2177  */
   2178 
   2179 int
   2180 hx509_ocsp_verify (
   2181 	hx509_context /*context*/,
   2182 	time_t /*now*/,
   2183 	hx509_cert /*cert*/,
   2184 	int /*flags*/,
   2185 	const void */*data*/,
   2186 	size_t /*length*/,
   2187 	time_t */*expiration*/);
   2188 
   2189 /**
   2190  * Print a oid using a hx509_vprint_func function. To print to stdout
   2191  * use hx509_print_stdout().
   2192  *
   2193  * @param oid oid to print
   2194  * @param func hx509_vprint_func to print with.
   2195  * @param ctx context variable to hx509_vprint_func function.
   2196  *
   2197  * @ingroup hx509_print
   2198  */
   2199 
   2200 void
   2201 hx509_oid_print (
   2202 	const heim_oid */*oid*/,
   2203 	hx509_vprint_func /*func*/,
   2204 	void */*ctx*/);
   2205 
   2206 /**
   2207  * Print a oid to a string.
   2208  *
   2209  * @param oid oid to print
   2210  * @param str allocated string, free with hx509_xfree().
   2211  *
   2212  * @return An hx509 error code, see hx509_get_error_string().
   2213  *
   2214  * @ingroup hx509_print
   2215  */
   2216 
   2217 int
   2218 hx509_oid_sprint (
   2219 	const heim_oid */*oid*/,
   2220 	char **/*str*/);
   2221 
   2222 /**
   2223  * Parse a string into a hx509 name object.
   2224  *
   2225  * @param context A hx509 context.
   2226  * @param str a string to parse.
   2227  * @param name the resulting object, NULL in case of error.
   2228  *
   2229  * @return An hx509 error code, see hx509_get_error_string().
   2230  *
   2231  * @ingroup hx509_name
   2232  */
   2233 
   2234 int
   2235 hx509_parse_name (
   2236 	hx509_context /*context*/,
   2237 	const char */*str*/,
   2238 	hx509_name */*name*/);
   2239 
   2240 int
   2241 hx509_parse_private_key (
   2242 	hx509_context /*context*/,
   2243 	const AlgorithmIdentifier */*keyai*/,
   2244 	const void */*data*/,
   2245 	size_t /*len*/,
   2246 	hx509_key_format_t /*format*/,
   2247 	hx509_private_key */*private_key*/);
   2248 
   2249 /**
   2250  * Add an additional algorithm that the peer supports.
   2251  *
   2252  * @param context A hx509 context.
   2253  * @param peer the peer to set the new algorithms for
   2254  * @param val an AlgorithmsIdentier to add
   2255  *
   2256  * @return An hx509 error code, see hx509_get_error_string().
   2257  *
   2258  * @ingroup hx509_peer
   2259  */
   2260 
   2261 int
   2262 hx509_peer_info_add_cms_alg (
   2263 	hx509_context /*context*/,
   2264 	hx509_peer_info /*peer*/,
   2265 	const AlgorithmIdentifier */*val*/);
   2266 
   2267 /**
   2268  * Allocate a new peer info structure an init it to default values.
   2269  *
   2270  * @param context A hx509 context.
   2271  * @param peer return an allocated peer, free with hx509_peer_info_free().
   2272  *
   2273  * @return An hx509 error code, see hx509_get_error_string().
   2274  *
   2275  * @ingroup hx509_peer
   2276  */
   2277 
   2278 int
   2279 hx509_peer_info_alloc (
   2280 	hx509_context /*context*/,
   2281 	hx509_peer_info */*peer*/);
   2282 
   2283 /**
   2284  * Free a peer info structure.
   2285  *
   2286  * @param peer peer info to be freed.
   2287  *
   2288  * @ingroup hx509_peer
   2289  */
   2290 
   2291 void
   2292 hx509_peer_info_free (hx509_peer_info /*peer*/);
   2293 
   2294 /**
   2295  * Set the certificate that remote peer is using.
   2296  *
   2297  * @param peer peer info to update
   2298  * @param cert cerificate of the remote peer.
   2299  *
   2300  * @return An hx509 error code, see hx509_get_error_string().
   2301  *
   2302  * @ingroup hx509_peer
   2303  */
   2304 
   2305 int
   2306 hx509_peer_info_set_cert (
   2307 	hx509_peer_info /*peer*/,
   2308 	hx509_cert /*cert*/);
   2309 
   2310 /**
   2311  * Set the algorithms that the peer supports.
   2312  *
   2313  * @param context A hx509 context.
   2314  * @param peer the peer to set the new algorithms for
   2315  * @param val array of supported AlgorithmsIdentiers
   2316  * @param len length of array val.
   2317  *
   2318  * @return An hx509 error code, see hx509_get_error_string().
   2319  *
   2320  * @ingroup hx509_peer
   2321  */
   2322 
   2323 int
   2324 hx509_peer_info_set_cms_algs (
   2325 	hx509_context /*context*/,
   2326 	hx509_peer_info /*peer*/,
   2327 	const AlgorithmIdentifier */*val*/,
   2328 	size_t /*len*/);
   2329 
   2330 int
   2331 hx509_pem_add_header (
   2332 	hx509_pem_header **/*headers*/,
   2333 	const char */*header*/,
   2334 	const char */*value*/);
   2335 
   2336 const char *
   2337 hx509_pem_find_header (
   2338 	const hx509_pem_header */*h*/,
   2339 	const char */*header*/);
   2340 
   2341 void
   2342 hx509_pem_free_header (hx509_pem_header */*headers*/);
   2343 
   2344 int
   2345 hx509_pem_read (
   2346 	hx509_context /*context*/,
   2347 	FILE */*f*/,
   2348 	hx509_pem_read_func /*func*/,
   2349 	void */*ctx*/);
   2350 
   2351 int
   2352 hx509_pem_write (
   2353 	hx509_context /*context*/,
   2354 	const char */*type*/,
   2355 	hx509_pem_header */*headers*/,
   2356 	FILE */*f*/,
   2357 	const void */*data*/,
   2358 	size_t /*size*/);
   2359 
   2360 /**
   2361  * Print a simple representation of a certificate
   2362  *
   2363  * @param context A hx509 context, can be NULL
   2364  * @param cert certificate to print
   2365  * @param out the stdio output stream, if NULL, stdout is used
   2366  *
   2367  * @return An hx509 error code
   2368  *
   2369  * @ingroup hx509_cert
   2370  */
   2371 
   2372 int
   2373 hx509_print_cert (
   2374 	hx509_context /*context*/,
   2375 	hx509_cert /*cert*/,
   2376 	FILE */*out*/);
   2377 
   2378 /**
   2379  * Helper function to print on stdout for:
   2380  * - hx509_oid_print(),
   2381  * - hx509_bitstring_print(),
   2382  * - hx509_validate_ctx_set_print().
   2383  *
   2384  * @param ctx the context to the print function. If the ctx is NULL,
   2385  * stdout is used.
   2386  * @param fmt the printing format.
   2387  * @param va the argumet list.
   2388  *
   2389  * @ingroup hx509_print
   2390  */
   2391 
   2392 void
   2393 hx509_print_stdout (
   2394 	void */*ctx*/,
   2395 	const char */*fmt*/,
   2396 	va_list /*va*/);
   2397 
   2398 int
   2399 hx509_private_key2SPKI (
   2400 	hx509_context /*context*/,
   2401 	hx509_private_key /*private_key*/,
   2402 	SubjectPublicKeyInfo */*spki*/);
   2403 
   2404 void
   2405 hx509_private_key_assign_rsa (
   2406 	hx509_private_key /*key*/,
   2407 	void */*ptr*/);
   2408 
   2409 int
   2410 hx509_private_key_free (hx509_private_key */*key*/);
   2411 
   2412 int
   2413 hx509_private_key_init (
   2414 	hx509_private_key */*key*/,
   2415 	hx509_private_key_ops */*ops*/,
   2416 	void */*keydata*/);
   2417 
   2418 int
   2419 hx509_private_key_private_decrypt (
   2420 	hx509_context /*context*/,
   2421 	const heim_octet_string */*ciphertext*/,
   2422 	const heim_oid */*encryption_oid*/,
   2423 	hx509_private_key /*p*/,
   2424 	heim_octet_string */*cleartext*/);
   2425 
   2426 int
   2427 hx509_prompt_hidden (hx509_prompt_type /*type*/);
   2428 
   2429 /**
   2430  * Allocate an query controller. Free using hx509_query_free().
   2431  *
   2432  * @param context A hx509 context.
   2433  * @param q return pointer to a hx509_query.
   2434  *
   2435  * @return An hx509 error code, see hx509_get_error_string().
   2436  *
   2437  * @ingroup hx509_cert
   2438  */
   2439 
   2440 int
   2441 hx509_query_alloc (
   2442 	hx509_context /*context*/,
   2443 	hx509_query **/*q*/);
   2444 
   2445 /**
   2446  * Free the query controller.
   2447  *
   2448  * @param context A hx509 context.
   2449  * @param q a pointer to the query controller.
   2450  *
   2451  * @ingroup hx509_cert
   2452  */
   2453 
   2454 void
   2455 hx509_query_free (
   2456 	hx509_context /*context*/,
   2457 	hx509_query */*q*/);
   2458 
   2459 /**
   2460  * Set the query controller to match using a specific match function.
   2461  *
   2462  * @param q a hx509 query controller.
   2463  * @param func function to use for matching, if the argument is NULL,
   2464  * the match function is removed.
   2465  * @param ctx context passed to the function.
   2466  *
   2467  * @return An hx509 error code, see hx509_get_error_string().
   2468  *
   2469  * @ingroup hx509_cert
   2470  */
   2471 
   2472 int
   2473 hx509_query_match_cmp_func (
   2474 	hx509_query */*q*/,
   2475 	int (*/*func*/)(hx509_context, hx509_cert, void *),
   2476 	void */*ctx*/);
   2477 
   2478 /**
   2479  * Set the query controller to require an one specific EKU (extended
   2480  * key usage). Any previous EKU matching is overwitten. If NULL is
   2481  * passed in as the eku, the EKU requirement is reset.
   2482  *
   2483  * @param q a hx509 query controller.
   2484  * @param eku an EKU to match on.
   2485  *
   2486  * @return An hx509 error code, see hx509_get_error_string().
   2487  *
   2488  * @ingroup hx509_cert
   2489  */
   2490 
   2491 int
   2492 hx509_query_match_eku (
   2493 	hx509_query */*q*/,
   2494 	const heim_oid */*eku*/);
   2495 
   2496 int
   2497 hx509_query_match_expr (
   2498 	hx509_context /*context*/,
   2499 	hx509_query */*q*/,
   2500 	const char */*expr*/);
   2501 
   2502 /**
   2503  * Set the query controller to match on a friendly name
   2504  *
   2505  * @param q a hx509 query controller.
   2506  * @param name a friendly name to match on
   2507  *
   2508  * @return An hx509 error code, see hx509_get_error_string().
   2509  *
   2510  * @ingroup hx509_cert
   2511  */
   2512 
   2513 int
   2514 hx509_query_match_friendly_name (
   2515 	hx509_query */*q*/,
   2516 	const char */*name*/);
   2517 
   2518 /**
   2519  * Set the issuer and serial number of match in the query
   2520  * controller. The function make copies of the isser and serial number.
   2521  *
   2522  * @param q a hx509 query controller
   2523  * @param issuer issuer to search for
   2524  * @param serialNumber the serialNumber of the issuer.
   2525  *
   2526  * @return An hx509 error code, see hx509_get_error_string().
   2527  *
   2528  * @ingroup hx509_cert
   2529  */
   2530 
   2531 int
   2532 hx509_query_match_issuer_serial (
   2533 	hx509_query */*q*/,
   2534 	const Name */*issuer*/,
   2535 	const heim_integer */*serialNumber*/);
   2536 
   2537 /**
   2538  * Set match options for the hx509 query controller.
   2539  *
   2540  * @param q query controller.
   2541  * @param option options to control the query controller.
   2542  *
   2543  * @return An hx509 error code, see hx509_get_error_string().
   2544  *
   2545  * @ingroup hx509_cert
   2546  */
   2547 
   2548 void
   2549 hx509_query_match_option (
   2550 	hx509_query */*q*/,
   2551 	hx509_query_option /*option*/);
   2552 
   2553 /**
   2554  * Set a statistic file for the query statistics.
   2555  *
   2556  * @param context A hx509 context.
   2557  * @param fn statistics file name
   2558  *
   2559  * @ingroup hx509_cert
   2560  */
   2561 
   2562 void
   2563 hx509_query_statistic_file (
   2564 	hx509_context /*context*/,
   2565 	const char */*fn*/);
   2566 
   2567 /**
   2568  * Unparse the statistics file and print the result on a FILE descriptor.
   2569  *
   2570  * @param context A hx509 context.
   2571  * @param printtype tyep to print
   2572  * @param out the FILE to write the data on.
   2573  *
   2574  * @ingroup hx509_cert
   2575  */
   2576 
   2577 void
   2578 hx509_query_unparse_stats (
   2579 	hx509_context /*context*/,
   2580 	int /*printtype*/,
   2581 	FILE */*out*/);
   2582 
   2583 void
   2584 hx509_request_free (hx509_request */*req*/);
   2585 
   2586 int
   2587 hx509_request_get_SubjectPublicKeyInfo (
   2588 	hx509_context /*context*/,
   2589 	hx509_request /*req*/,
   2590 	SubjectPublicKeyInfo */*key*/);
   2591 
   2592 int
   2593 hx509_request_get_name (
   2594 	hx509_context /*context*/,
   2595 	hx509_request /*req*/,
   2596 	hx509_name */*name*/);
   2597 
   2598 int
   2599 hx509_request_init (
   2600 	hx509_context /*context*/,
   2601 	hx509_request */*req*/);
   2602 
   2603 int
   2604 hx509_request_set_SubjectPublicKeyInfo (
   2605 	hx509_context /*context*/,
   2606 	hx509_request /*req*/,
   2607 	const SubjectPublicKeyInfo */*key*/);
   2608 
   2609 int
   2610 hx509_request_set_name (
   2611 	hx509_context /*context*/,
   2612 	hx509_request /*req*/,
   2613 	hx509_name /*name*/);
   2614 
   2615 /**
   2616  * Add a CRL file to the revokation context.
   2617  *
   2618  * @param context hx509 context
   2619  * @param ctx hx509 revokation context
   2620  * @param path path to file that is going to be added to the context.
   2621  *
   2622  * @return An hx509 error code, see hx509_get_error_string().
   2623  *
   2624  * @ingroup hx509_revoke
   2625  */
   2626 
   2627 int
   2628 hx509_revoke_add_crl (
   2629 	hx509_context /*context*/,
   2630 	hx509_revoke_ctx /*ctx*/,
   2631 	const char */*path*/);
   2632 
   2633 /**
   2634  * Add a OCSP file to the revokation context.
   2635  *
   2636  * @param context hx509 context
   2637  * @param ctx hx509 revokation context
   2638  * @param path path to file that is going to be added to the context.
   2639  *
   2640  * @return An hx509 error code, see hx509_get_error_string().
   2641  *
   2642  * @ingroup hx509_revoke
   2643  */
   2644 
   2645 int
   2646 hx509_revoke_add_ocsp (
   2647 	hx509_context /*context*/,
   2648 	hx509_revoke_ctx /*ctx*/,
   2649 	const char */*path*/);
   2650 
   2651 /**
   2652  * Free a hx509 revokation context.
   2653  *
   2654  * @param ctx context to be freed
   2655  *
   2656  * @ingroup hx509_revoke
   2657  */
   2658 
   2659 void
   2660 hx509_revoke_free (hx509_revoke_ctx */*ctx*/);
   2661 
   2662 /**
   2663  * Allocate a revokation context. Free with hx509_revoke_free().
   2664  *
   2665  * @param context A hx509 context.
   2666  * @param ctx returns a newly allocated revokation context.
   2667  *
   2668  * @return An hx509 error code, see hx509_get_error_string().
   2669  *
   2670  * @ingroup hx509_revoke
   2671  */
   2672 
   2673 int
   2674 hx509_revoke_init (
   2675 	hx509_context /*context*/,
   2676 	hx509_revoke_ctx */*ctx*/);
   2677 
   2678 /**
   2679  * Print the OCSP reply stored in a file.
   2680  *
   2681  * @param context a hx509 context
   2682  * @param path path to a file with a OCSP reply
   2683  * @param out the out FILE descriptor to print the reply on
   2684  *
   2685  * @return An hx509 error code, see hx509_get_error_string().
   2686  *
   2687  * @ingroup hx509_revoke
   2688  */
   2689 
   2690 int
   2691 hx509_revoke_ocsp_print (
   2692 	hx509_context /*context*/,
   2693 	const char */*path*/,
   2694 	FILE */*out*/);
   2695 
   2696 int
   2697 hx509_revoke_print (
   2698 	hx509_context /*context*/,
   2699 	hx509_revoke_ctx /*ctx*/,
   2700 	FILE */*out*/);
   2701 
   2702 /**
   2703  * Check that a certificate is not expired according to a revokation
   2704  * context. Also need the parent certificte to the check OCSP
   2705  * parent identifier.
   2706  *
   2707  * @param context hx509 context
   2708  * @param ctx hx509 revokation context
   2709  * @param certs
   2710  * @param now
   2711  * @param cert
   2712  * @param parent_cert
   2713  *
   2714  * @return An hx509 error code, see hx509_get_error_string().
   2715  *
   2716  * @ingroup hx509_revoke
   2717  */
   2718 
   2719 int
   2720 hx509_revoke_verify (
   2721 	hx509_context /*context*/,
   2722 	hx509_revoke_ctx /*ctx*/,
   2723 	hx509_certs /*certs*/,
   2724 	time_t /*now*/,
   2725 	hx509_cert /*cert*/,
   2726 	hx509_cert /*parent_cert*/);
   2727 
   2728 /**
   2729  * See hx509_set_error_stringv().
   2730  *
   2731  * @param context A hx509 context.
   2732  * @param flags
   2733  * - HX509_ERROR_APPEND appends the error string to the old messages
   2734      (code is updated).
   2735  * @param code error code related to error message
   2736  * @param fmt error message format
   2737  * @param ... arguments to error message format
   2738  *
   2739  * @ingroup hx509_error
   2740  */
   2741 
   2742 void
   2743 hx509_set_error_string (
   2744 	hx509_context /*context*/,
   2745 	int /*flags*/,
   2746 	int /*code*/,
   2747 	const char */*fmt*/,
   2748 	...);
   2749 
   2750 /**
   2751  * Add an error message to the hx509 context.
   2752  *
   2753  * @param context A hx509 context.
   2754  * @param flags
   2755  * - HX509_ERROR_APPEND appends the error string to the old messages
   2756      (code is updated).
   2757  * @param code error code related to error message
   2758  * @param fmt error message format
   2759  * @param ap arguments to error message format
   2760  *
   2761  * @ingroup hx509_error
   2762  */
   2763 
   2764 void
   2765 hx509_set_error_stringv (
   2766 	hx509_context /*context*/,
   2767 	int /*flags*/,
   2768 	int /*code*/,
   2769 	const char */*fmt*/,
   2770 	va_list /*ap*/);
   2771 
   2772 const AlgorithmIdentifier *
   2773 hx509_signature_ecPublicKey (void);
   2774 
   2775 const AlgorithmIdentifier *
   2776 hx509_signature_ecdsa_with_sha256 (void);
   2777 
   2778 const AlgorithmIdentifier *
   2779 hx509_signature_md5 (void);
   2780 
   2781 const AlgorithmIdentifier *
   2782 hx509_signature_rsa (void);
   2783 
   2784 const AlgorithmIdentifier *
   2785 hx509_signature_rsa_pkcs1_x509 (void);
   2786 
   2787 const AlgorithmIdentifier *
   2788 hx509_signature_rsa_with_md5 (void);
   2789 
   2790 const AlgorithmIdentifier *
   2791 hx509_signature_rsa_with_sha1 (void);
   2792 
   2793 const AlgorithmIdentifier *
   2794 hx509_signature_rsa_with_sha256 (void);
   2795 
   2796 const AlgorithmIdentifier *
   2797 hx509_signature_rsa_with_sha384 (void);
   2798 
   2799 const AlgorithmIdentifier *
   2800 hx509_signature_rsa_with_sha512 (void);
   2801 
   2802 const AlgorithmIdentifier *
   2803 hx509_signature_sha1 (void);
   2804 
   2805 const AlgorithmIdentifier *
   2806 hx509_signature_sha256 (void);
   2807 
   2808 const AlgorithmIdentifier *
   2809 hx509_signature_sha384 (void);
   2810 
   2811 const AlgorithmIdentifier *
   2812 hx509_signature_sha512 (void);
   2813 
   2814 /**
   2815  * Convert a DER encoded name info a string.
   2816  *
   2817  * @param data data to a DER/BER encoded name
   2818  * @param length length of data
   2819  * @param str the resulting string, is NULL on failure.
   2820  *
   2821  * @return An hx509 error code, see hx509_get_error_string().
   2822  *
   2823  * @ingroup hx509_name
   2824  */
   2825 
   2826 int
   2827 hx509_unparse_der_name (
   2828 	const void */*data*/,
   2829 	size_t /*length*/,
   2830 	char **/*str*/);
   2831 
   2832 /**
   2833  * Validate/Print the status of the certificate.
   2834  *
   2835  * @param context A hx509 context.
   2836  * @param ctx A hx509 validation context.
   2837  * @param cert the cerificate to validate/print.
   2838 
   2839  * @return An hx509 error code, see hx509_get_error_string().
   2840  *
   2841  * @ingroup hx509_print
   2842  */
   2843 
   2844 int
   2845 hx509_validate_cert (
   2846 	hx509_context /*context*/,
   2847 	hx509_validate_ctx /*ctx*/,
   2848 	hx509_cert /*cert*/);
   2849 
   2850 /**
   2851  * Add flags to control the behaivor of the hx509_validate_cert()
   2852  * function.
   2853  *
   2854  * @param ctx A hx509 validation context.
   2855  * @param flags flags to add to the validation context.
   2856  *
   2857  * @return An hx509 error code, see hx509_get_error_string().
   2858  *
   2859  * @ingroup hx509_print
   2860  */
   2861 
   2862 void
   2863 hx509_validate_ctx_add_flags (
   2864 	hx509_validate_ctx /*ctx*/,
   2865 	int /*flags*/);
   2866 
   2867 /**
   2868  * Free an hx509 validate context.
   2869  *
   2870  * @param ctx the hx509 validate context to free.
   2871  *
   2872  * @ingroup hx509_print
   2873  */
   2874 
   2875 void
   2876 hx509_validate_ctx_free (hx509_validate_ctx /*ctx*/);
   2877 
   2878 /**
   2879  * Allocate a hx509 validation/printing context.
   2880  *
   2881  * @param context A hx509 context.
   2882  * @param ctx a new allocated hx509 validation context, free with
   2883  * hx509_validate_ctx_free().
   2884 
   2885  * @return An hx509 error code, see hx509_get_error_string().
   2886  *
   2887  * @ingroup hx509_print
   2888  */
   2889 
   2890 int
   2891 hx509_validate_ctx_init (
   2892 	hx509_context /*context*/,
   2893 	hx509_validate_ctx */*ctx*/);
   2894 
   2895 /**
   2896  * Set the printing functions for the validation context.
   2897  *
   2898  * @param ctx a hx509 valication context.
   2899  * @param func the printing function to usea.
   2900  * @param c the context variable to the printing function.
   2901  *
   2902  * @return An hx509 error code, see hx509_get_error_string().
   2903  *
   2904  * @ingroup hx509_print
   2905  */
   2906 
   2907 void
   2908 hx509_validate_ctx_set_print (
   2909 	hx509_validate_ctx /*ctx*/,
   2910 	hx509_vprint_func /*func*/,
   2911 	void */*c*/);
   2912 
   2913 /**
   2914  * Set the trust anchors in the verification context, makes an
   2915  * reference to the keyset, so the consumer can free the keyset
   2916  * independent of the destruction of the verification context (ctx).
   2917  * If there already is a keyset attached, it's released.
   2918  *
   2919  * @param ctx a verification context
   2920  * @param set a keyset containing the trust anchors.
   2921  *
   2922  * @ingroup hx509_verify
   2923  */
   2924 
   2925 void
   2926 hx509_verify_attach_anchors (
   2927 	hx509_verify_ctx /*ctx*/,
   2928 	hx509_certs /*set*/);
   2929 
   2930 /**
   2931  * Attach an revocation context to the verfication context, , makes an
   2932  * reference to the revoke context, so the consumer can free the
   2933  * revoke context independent of the destruction of the verification
   2934  * context. If there is no revoke context, the verification process is
   2935  * NOT going to check any verification status.
   2936  *
   2937  * @param ctx a verification context.
   2938  * @param revoke_ctx a revoke context.
   2939  *
   2940  * @ingroup hx509_verify
   2941  */
   2942 
   2943 void
   2944 hx509_verify_attach_revoke (
   2945 	hx509_verify_ctx /*ctx*/,
   2946 	hx509_revoke_ctx /*revoke_ctx*/);
   2947 
   2948 void
   2949 hx509_verify_ctx_f_allow_best_before_signature_algs (
   2950 	hx509_context /*ctx*/,
   2951 	int /*boolean*/);
   2952 
   2953 /**
   2954  * Allow using the operating system builtin trust anchors if no other
   2955  * trust anchors are configured.
   2956  *
   2957  * @param ctx a verification context
   2958  * @param boolean if non zero, useing the operating systems builtin
   2959  * trust anchors.
   2960  *
   2961  *
   2962  * @return An hx509 error code, see hx509_get_error_string().
   2963  *
   2964  * @ingroup hx509_cert
   2965  */
   2966 
   2967 void
   2968 hx509_verify_ctx_f_allow_default_trustanchors (
   2969 	hx509_verify_ctx /*ctx*/,
   2970 	int /*boolean*/);
   2971 
   2972 /**
   2973  * Free an hx509 verification context.
   2974  *
   2975  * @param ctx the context to be freed.
   2976  *
   2977  * @ingroup hx509_verify
   2978  */
   2979 
   2980 void
   2981 hx509_verify_destroy_ctx (hx509_verify_ctx /*ctx*/);
   2982 
   2983 /**
   2984  * Verify that the certificate is allowed to be used for the hostname
   2985  * and address.
   2986  *
   2987  * @param context A hx509 context.
   2988  * @param cert the certificate to match with
   2989  * @param flags Flags to modify the behavior:
   2990  * - HX509_VHN_F_ALLOW_NO_MATCH no match is ok
   2991  * @param type type of hostname:
   2992  * - HX509_HN_HOSTNAME for plain hostname.
   2993  * - HX509_HN_DNSSRV for DNS SRV names.
   2994  * @param hostname the hostname to check
   2995  * @param sa address of the host
   2996  * @param sa_size length of address
   2997  *
   2998  * @return An hx509 error code, see hx509_get_error_string().
   2999  *
   3000  * @ingroup hx509_cert
   3001  */
   3002 
   3003 int
   3004 hx509_verify_hostname (
   3005 	hx509_context /*context*/,
   3006 	const hx509_cert /*cert*/,
   3007 	int /*flags*/,
   3008 	hx509_hostname_type /*type*/,
   3009 	const char */*hostname*/,
   3010 	const struct sockaddr */*sa*/,
   3011 	int /*sa_size*/);
   3012 
   3013 /**
   3014  * Allocate an verification context that is used fo control the
   3015  * verification process.
   3016  *
   3017  * @param context A hx509 context.
   3018  * @param ctx returns a pointer to a hx509_verify_ctx object.
   3019  *
   3020  * @return An hx509 error code, see hx509_get_error_string().
   3021  *
   3022  * @ingroup hx509_verify
   3023  */
   3024 
   3025 int
   3026 hx509_verify_init_ctx (
   3027 	hx509_context /*context*/,
   3028 	hx509_verify_ctx */*ctx*/);
   3029 
   3030 /**
   3031  * Build and verify the path for the certificate to the trust anchor
   3032  * specified in the verify context. The path is constructed from the
   3033  * certificate, the pool and the trust anchors.
   3034  *
   3035  * @param context A hx509 context.
   3036  * @param ctx A hx509 verification context.
   3037  * @param cert the certificate to build the path from.
   3038  * @param pool A keyset of certificates to build the chain from.
   3039  *
   3040  * @return An hx509 error code, see hx509_get_error_string().
   3041  *
   3042  * @ingroup hx509_verify
   3043  */
   3044 
   3045 int
   3046 hx509_verify_path (
   3047 	hx509_context /*context*/,
   3048 	hx509_verify_ctx /*ctx*/,
   3049 	hx509_cert /*cert*/,
   3050 	hx509_certs /*pool*/);
   3051 
   3052 /**
   3053  * Set the maximum depth of the certificate chain that the path
   3054  * builder is going to try.
   3055  *
   3056  * @param ctx a verification context
   3057  * @param max_depth maxium depth of the certificate chain, include
   3058  * trust anchor.
   3059  *
   3060  * @ingroup hx509_verify
   3061  */
   3062 
   3063 void
   3064 hx509_verify_set_max_depth (
   3065 	hx509_verify_ctx /*ctx*/,
   3066 	unsigned int /*max_depth*/);
   3067 
   3068 /**
   3069  * Allow or deny the use of proxy certificates
   3070  *
   3071  * @param ctx a verification context
   3072  * @param boolean if non zero, allow proxy certificates.
   3073  *
   3074  * @ingroup hx509_verify
   3075  */
   3076 
   3077 void
   3078 hx509_verify_set_proxy_certificate (
   3079 	hx509_verify_ctx /*ctx*/,
   3080 	int /*boolean*/);
   3081 
   3082 /**
   3083  * Select strict RFC3280 verification of certificiates. This means
   3084  * checking key usage on CA certificates, this will make version 1
   3085  * certificiates unuseable.
   3086  *
   3087  * @param ctx a verification context
   3088  * @param boolean if non zero, use strict verification.
   3089  *
   3090  * @ingroup hx509_verify
   3091  */
   3092 
   3093 void
   3094 hx509_verify_set_strict_rfc3280_verification (
   3095 	hx509_verify_ctx /*ctx*/,
   3096 	int /*boolean*/);
   3097 
   3098 /**
   3099  * Set the clock time the the verification process is going to
   3100  * use. Used to check certificate in the past and future time. If not
   3101  * set the current time will be used.
   3102  *
   3103  * @param ctx a verification context.
   3104  * @param t the time the verifiation is using.
   3105  *
   3106  *
   3107  * @ingroup hx509_verify
   3108  */
   3109 
   3110 void
   3111 hx509_verify_set_time (
   3112 	hx509_verify_ctx /*ctx*/,
   3113 	time_t /*t*/);
   3114 
   3115 /**
   3116  * Verify a signature made using the private key of an certificate.
   3117  *
   3118  * @param context A hx509 context.
   3119  * @param signer the certificate that made the signature.
   3120  * @param alg algorthm that was used to sign the data.
   3121  * @param data the data that was signed.
   3122  * @param sig the sigature to verify.
   3123  *
   3124  * @return An hx509 error code, see hx509_get_error_string().
   3125  *
   3126  * @ingroup hx509_crypto
   3127  */
   3128 
   3129 int
   3130 hx509_verify_signature (
   3131 	hx509_context /*context*/,
   3132 	const hx509_cert /*signer*/,
   3133 	const AlgorithmIdentifier */*alg*/,
   3134 	const heim_octet_string */*data*/,
   3135 	const heim_octet_string */*sig*/);
   3136 
   3137 /**
   3138  * Free a data element allocated in the library.
   3139  *
   3140  * @param ptr data to be freed.
   3141  *
   3142  * @ingroup hx509_misc
   3143  */
   3144 
   3145 void
   3146 hx509_xfree (void */*ptr*/);
   3147 
   3148 int
   3149 yywrap (void);
   3150 
   3151 #ifdef __cplusplus
   3152 }
   3153 #endif
   3154 
   3155 #endif /* DOXY */
   3156 #endif /* __hx509_protos_h__ */
   3157