hx509-protos.h revision 1.1 1 /* $NetBSD: hx509-protos.h,v 1.1 2019/12/15 22:45:43 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