QSC Post Quantum Cryptographic Library 1.1.0.2 (B2)
A post quantum secure library written in Ansi C
Loading...
Searching...
No Matches
x509certwrite.h
Go to the documentation of this file.
1/* 2020-2026 Quantum Resistant Cryptographic Solutions Corporation
2 * All Rights Reserved.
3 *
4 * NOTICE:
5 * This software and all accompanying materials are the exclusive property of
6 * Quantum Resistant Cryptographic Solutions Corporation (QRCS). The intellectual
7 * and technical concepts contained herein are proprietary to QRCS and are
8 * protected under applicable Canadian, U.S., and international copyright,
9 * patent, and trade secret laws.
10 *
11 * CRYPTOGRAPHIC ALGORITHMS AND IMPLEMENTATIONS:
12 * - This software includes implementations of cryptographic primitives and
13 * algorithms that are standardized or in the public domain, such as AES
14 * and SHA-3, which are not proprietary to QRCS.
15 * - This software also includes cryptographic primitives, constructions, and
16 * algorithms designed by QRCS, including but not limited to RCS, SCB, CSX, QMAC, and
17 * related components, which are proprietary to QRCS.
18 * - All source code, implementations, protocol compositions, optimizations,
19 * parameter selections, and engineering work contained in this software are
20 * original works of QRCS and are protected under this license.
21 *
22 * LICENSE AND USE RESTRICTIONS:
23 * - This software is licensed under the Quantum Resistant Cryptographic Solutions
24 * Public Research and Evaluation License (QRCS-PREL), 2025-2026.
25 * - Permission is granted solely for non-commercial evaluation, academic research,
26 * cryptographic analysis, interoperability testing, and feasibility assessment.
27 * - Commercial use, production deployment, commercial redistribution, or
28 * integration into products or services is strictly prohibited without a
29 * separate written license agreement executed with QRCS.
30 * - Licensing and authorized distribution are solely at the discretion of QRCS.
31 *
32 * EXPERIMENTAL CRYPTOGRAPHY NOTICE:
33 * Portions of this software may include experimental, novel, or evolving
34 * cryptographic designs. Use of this software is entirely at the user's risk.
35 *
36 * DISCLAIMER:
37 * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
38 * IMPLIED, INCLUDING BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS
39 * FOR A PARTICULAR PURPOSE, SECURITY, OR NON-INFRINGEMENT. QRCS DISCLAIMS ALL
40 * LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
41 * ARISING FROM THE USE OR MISUSE OF THIS SOFTWARE.
42 *
43 * FULL LICENSE:
44 * This software is subject to the Quantum Resistant Cryptographic Solutions
45 * Public Research and Evaluation License (QRCS-PREL), 2025-2026. The complete license terms
46 * are provided in the accompanying LICENSE file or at https://www.qrcscorp.ca.
47 *
48 * Written by: John G. Underhill
49 * Contact: contact@qrcscorp.ca
50 */
51
52#ifndef QSC_X509_CERTWRITE_H
53#define QSC_X509_CERTWRITE_H
54
55#include "qsccommon.h"
56#include "x509cert.h"
57#include "x509csr.h"
58#include "x509types.h"
59
60QSC_CPLUSPLUS_ENABLED_START
61
80
90#define QSC_X509_CERT_ISSUANCE_PROPAGATE_SUBJECT_ALT_NAME 0x00000001U
91
100#define QSC_X509_CERT_ISSUANCE_PROPAGATE_EXTENDED_KEY_USAGE 0x00000002U
101
111#define QSC_X509_CERT_ISSUANCE_PROPAGATE_SUBJECT_KEY_IDENTIFIER 0x00000004U
112
122#define QSC_X509_CERT_ISSUANCE_PROPAGATE_UNKNOWN_NON_CRITICAL 0x00000008U
123
133#define QSC_X509_CERT_ISSUANCE_PROPAGATE_DEFAULT (QSC_X509_CERT_ISSUANCE_PROPAGATE_SUBJECT_ALT_NAME | QSC_X509_CERT_ISSUANCE_PROPAGATE_EXTENDED_KEY_USAGE)
134
142#define QSC_X509_CERT_PROFILE_NONE 0U
143
151#define QSC_X509_CERT_PROFILE_ROOT_CA 1U
152
160#define QSC_X509_CERT_PROFILE_INTERMEDIATE_CA 2U
161
169#define QSC_X509_CERT_PROFILE_TLS_SERVER 3U
170
178#define QSC_X509_CERT_PROFILE_TLS_CLIENT 4U
179
192QSC_EXPORT_API void qsc_x509_certificate_builder_initialize(qsc_x509_certificate_builder* builder);
193
206QSC_EXPORT_API void qsc_x509_certificate_builder_clear(qsc_x509_certificate_builder* builder);
207
222QSC_EXPORT_API qsc_asn1_status qsc_x509_certificate_builder_set_serial(qsc_x509_certificate_builder* builder, const uint8_t* serialnumber, size_t serialnumberlen);
223
235QSC_EXPORT_API qsc_asn1_status qsc_x509_certificate_builder_set_issuer(qsc_x509_certificate_builder* builder, const qsc_x509_name* issuer);
236
248QSC_EXPORT_API qsc_asn1_status qsc_x509_certificate_builder_set_subject(qsc_x509_certificate_builder* builder, const qsc_x509_name* subject);
249
261QSC_EXPORT_API qsc_asn1_status qsc_x509_certificate_builder_set_validity(qsc_x509_certificate_builder* builder, const qsc_x509_validity* validity);
262
275QSC_EXPORT_API qsc_asn1_status qsc_x509_certificate_builder_set_spki(qsc_x509_certificate_builder* builder, const qsc_x509_subject_public_key_info* spki);
276
289QSC_EXPORT_API qsc_asn1_status qsc_x509_certificate_builder_set_signature_algorithm(qsc_x509_certificate_builder* builder, const qsc_x509_algorithm_identifier* signaturealgorithm);
290
302QSC_EXPORT_API qsc_asn1_status qsc_x509_certificate_builder_set_basic_constraints(qsc_x509_certificate_builder* builder, const qsc_x509_basic_constraints* basicconstraints);
303
315QSC_EXPORT_API qsc_asn1_status qsc_x509_certificate_builder_set_key_usage(qsc_x509_certificate_builder* builder, const qsc_x509_key_usage* keyusage);
316
328QSC_EXPORT_API qsc_asn1_status qsc_x509_certificate_builder_set_extended_key_usage(qsc_x509_certificate_builder* builder, const qsc_x509_extended_key_usage* extendedkeyusage);
329
341QSC_EXPORT_API qsc_asn1_status qsc_x509_certificate_builder_set_subject_key_identifier(qsc_x509_certificate_builder* builder, const qsc_x509_subject_key_identifier* subjectkeyidentifier);
342
354QSC_EXPORT_API qsc_asn1_status qsc_x509_certificate_builder_set_authority_key_identifier(qsc_x509_certificate_builder* builder, const qsc_x509_authority_key_identifier* authoritykeyidentifier);
355
369QSC_EXPORT_API qsc_asn1_status qsc_x509_certificate_builder_add_subject_alt_name_dns(qsc_x509_certificate_builder* builder, const char* dnsname, size_t dsnamelen);
370
384QSC_EXPORT_API qsc_asn1_status qsc_x509_certificate_builder_add_subject_alt_name_ip(qsc_x509_certificate_builder* builder, const uint8_t* address, size_t addresslen);
385
398QSC_EXPORT_API qsc_asn1_status qsc_x509_certificate_builder_add_extension(qsc_x509_certificate_builder* builder, const qsc_x509_extension* extension);
399
415QSC_EXPORT_API qsc_asn1_status qsc_x509_certificate_builder_encode_tbs_der(const qsc_x509_certificate_builder* builder, uint8_t* output, size_t* outputlen);
416
434QSC_EXPORT_API qsc_asn1_status qsc_x509_certificate_builder_sign(const qsc_x509_certificate_builder* builder, qsc_x509_certificate_sign_callback signcallback, void* context, uint8_t* output, size_t* outputlen);
435
448
462QSC_EXPORT_API qsc_asn1_status qsc_x509_cert_issuance_filter_requested_extensions(const qsc_x509_csr* csr, uint32_t policyflags, qsc_x509_extensions* filteredextensions);
463
477QSC_EXPORT_API qsc_asn1_status qsc_x509_cert_issuance_apply_csr_extensions(qsc_x509_certificate_builder* builder, const qsc_x509_csr* csr, uint32_t policyflags);
478
491QSC_EXPORT_API qsc_asn1_status qsc_x509_certificate_builder_set_issuer_from_certificate(qsc_x509_certificate_builder* builder, const qsc_x509_certificate* issuer);
492
505QSC_EXPORT_API qsc_asn1_status qsc_x509_compute_subject_key_identifier(const qsc_x509_subject_public_key_info* spki, qsc_x509_subject_key_identifier* subjectkeyidentifier);
506
519QSC_EXPORT_API qsc_asn1_status qsc_x509_compute_authority_key_identifier(const qsc_x509_certificate* issuer, qsc_x509_authority_key_identifier* authoritykeyidentifier);
520
533QSC_EXPORT_API qsc_asn1_status qsc_x509_certificate_builder_apply_generated_identifiers(qsc_x509_certificate_builder* builder, const qsc_x509_certificate* issuer);
534
547QSC_EXPORT_API qsc_asn1_status qsc_x509_certificate_builder_apply_profile(qsc_x509_certificate_builder* builder, uint32_t profile);
548
562QSC_EXPORT_API qsc_asn1_status qsc_x509_certificate_builder_validate_profile(const qsc_x509_certificate_builder* builder, const qsc_x509_certificate* issuer, uint32_t profile);
563
579QSC_EXPORT_API qsc_asn1_status qsc_x509_certificate_encode_pem(const uint8_t* der, size_t derlen, char* output, size_t* outputlen);
580
581QSC_CPLUSPLUS_ENABLED_END
582
583#endif
enum qsc_asn1_status_t qsc_asn1_status
ASN.1 helper status codes.
Contains common definitions for the Quantum Secure Cryptographic (QSC) library.
#define QSC_EXPORT_API
API export macro for Microsoft compilers when importing from a DLL.
Definition qsccommon.h:605
QSC_EXPORT_API qsc_asn1_status qsc_x509_cert_issuance_validate_csr(const qsc_x509_csr *csr)
Validate a certificate signing request for issuance use.
Definition x509certwrite.c:1597
QSC_EXPORT_API qsc_asn1_status qsc_x509_certificate_builder_add_extension(qsc_x509_certificate_builder *builder, const qsc_x509_extension *extension)
Add a raw extension to the builder.
Definition x509certwrite.c:904
QSC_EXPORT_API qsc_asn1_status qsc_x509_certificate_builder_set_extended_key_usage(qsc_x509_certificate_builder *builder, const qsc_x509_extended_key_usage *extendedkeyusage)
Set the Extended Key Usage extension content.
Definition x509certwrite.c:779
QSC_EXPORT_API qsc_asn1_status qsc_x509_certificate_builder_sign(const qsc_x509_certificate_builder *builder, qsc_x509_certificate_sign_callback signcallback, void *context, uint8_t *output, size_t *outputlen)
Sign and encode a complete certificate.
Definition x509certwrite.c:1087
QSC_EXPORT_API void qsc_x509_certificate_builder_initialize(qsc_x509_certificate_builder *builder)
Initialize a certificate builder instance.
Definition x509certwrite.c:568
QSC_EXPORT_API qsc_asn1_status qsc_x509_certificate_builder_set_validity(qsc_x509_certificate_builder *builder, const qsc_x509_validity *validity)
Set the certificate validity interval.
Definition x509certwrite.c:669
QSC_EXPORT_API qsc_asn1_status qsc_x509_certificate_builder_set_subject_key_identifier(qsc_x509_certificate_builder *builder, const qsc_x509_subject_key_identifier *subjectkeyidentifier)
Set the Subject Key Identifier extension content.
Definition x509certwrite.c:798
QSC_EXPORT_API qsc_asn1_status qsc_x509_certificate_builder_set_basic_constraints(qsc_x509_certificate_builder *builder, const qsc_x509_basic_constraints *basicconstraints)
Set the Basic Constraints extension content.
Definition x509certwrite.c:741
QSC_EXPORT_API void qsc_x509_certificate_builder_clear(qsc_x509_certificate_builder *builder)
Clear a certificate builder instance.
Definition x509certwrite.c:579
QSC_EXPORT_API qsc_asn1_status qsc_x509_certificate_builder_set_authority_key_identifier(qsc_x509_certificate_builder *builder, const qsc_x509_authority_key_identifier *authoritykeyidentifier)
Set the Authority Key Identifier extension content.
Definition x509certwrite.c:817
QSC_EXPORT_API qsc_asn1_status qsc_x509_certificate_builder_set_serial(qsc_x509_certificate_builder *builder, const uint8_t *serialnumber, size_t serialnumberlen)
Set the certificate serial number.
Definition x509certwrite.c:589
QSC_EXPORT_API qsc_asn1_status qsc_x509_certificate_builder_validate_profile(const qsc_x509_certificate_builder *builder, const qsc_x509_certificate *issuer, uint32_t profile)
Validate builder contents against a predefined profile.
Definition x509certwrite.c:1362
QSC_EXPORT_API qsc_asn1_status qsc_x509_certificate_builder_set_spki(qsc_x509_certificate_builder *builder, const qsc_x509_subject_public_key_info *spki)
Set the subject public key information.
Definition x509certwrite.c:694
QSC_EXPORT_API qsc_asn1_status qsc_x509_certificate_builder_add_subject_alt_name_dns(qsc_x509_certificate_builder *builder, const char *dnsname, size_t dsnamelen)
Add a DNS subject alternative name entry.
Definition x509certwrite.c:836
QSC_EXPORT_API qsc_asn1_status qsc_x509_certificate_builder_set_issuer_from_certificate(qsc_x509_certificate_builder *builder, const qsc_x509_certificate *issuer)
Set the issuer name from an issuer certificate.
Definition x509certwrite.c:1160
QSC_EXPORT_API qsc_asn1_status qsc_x509_compute_subject_key_identifier(const qsc_x509_subject_public_key_info *spki, qsc_x509_subject_key_identifier *subjectkeyidentifier)
Compute a Subject Key Identifier from subject public key information.
Definition x509certwrite.c:1178
QSC_EXPORT_API qsc_asn1_status qsc_x509_certificate_builder_apply_generated_identifiers(qsc_x509_certificate_builder *builder, const qsc_x509_certificate *issuer)
Apply generated key identifiers to the builder.
Definition x509certwrite.c:1243
QSC_EXPORT_API qsc_asn1_status qsc_x509_cert_issuance_apply_csr_extensions(qsc_x509_certificate_builder *builder, const qsc_x509_csr *csr, uint32_t policyflags)
Apply CSR-requested extensions to a certificate builder.
Definition x509certwrite.c:1740
QSC_EXPORT_API qsc_asn1_status qsc_x509_certificate_builder_add_subject_alt_name_ip(qsc_x509_certificate_builder *builder, const uint8_t *address, size_t addresslen)
Add an IP-address subject alternative name entry.
Definition x509certwrite.c:870
QSC_EXPORT_API qsc_asn1_status qsc_x509_compute_authority_key_identifier(const qsc_x509_certificate *issuer, qsc_x509_authority_key_identifier *authoritykeyidentifier)
Compute an Authority Key Identifier from an issuer certificate.
Definition x509certwrite.c:1206
QSC_EXPORT_API qsc_asn1_status qsc_x509_certificate_builder_apply_profile(qsc_x509_certificate_builder *builder, uint32_t profile)
Apply a predefined certificate profile to the builder.
Definition x509certwrite.c:1287
QSC_EXPORT_API qsc_asn1_status qsc_x509_certificate_builder_set_subject(qsc_x509_certificate_builder *builder, const qsc_x509_name *subject)
Set the subject distinguished name.
Definition x509certwrite.c:651
QSC_EXPORT_API qsc_asn1_status qsc_x509_certificate_builder_set_key_usage(qsc_x509_certificate_builder *builder, const qsc_x509_key_usage *keyusage)
Set the Key Usage extension content.
Definition x509certwrite.c:760
QSC_EXPORT_API qsc_asn1_status qsc_x509_certificate_builder_set_issuer(qsc_x509_certificate_builder *builder, const qsc_x509_name *issuer)
Set the issuer distinguished name.
Definition x509certwrite.c:633
QSC_EXPORT_API qsc_asn1_status qsc_x509_certificate_encode_pem(const uint8_t *der, size_t derlen, char *output, size_t *outputlen)
Encode a DER certificate into PEM.
Definition x509certwrite.c:1506
QSC_EXPORT_API qsc_asn1_status qsc_x509_certificate_builder_encode_tbs_der(const qsc_x509_certificate_builder *builder, uint8_t *output, size_t *outputlen)
Encode the TBSCertificate portion as DER.
Definition x509certwrite.c:957
QSC_EXPORT_API qsc_asn1_status qsc_x509_certificate_builder_set_signature_algorithm(qsc_x509_certificate_builder *builder, const qsc_x509_algorithm_identifier *signaturealgorithm)
Set the certificate signature algorithm identifier.
Definition x509certwrite.c:716
QSC_EXPORT_API qsc_asn1_status qsc_x509_cert_issuance_filter_requested_extensions(const qsc_x509_csr *csr, uint32_t policyflags, qsc_x509_extensions *filteredextensions)
Filter CSR-requested extensions under issuer policy.
Definition x509certwrite.c:1664
PKCS#10 certificate signing request encoding, decoding, mutation, and verification interface.
QSC_EXPORT_API struct qsc_x509_csr_t qsc_x509_csr
A decoded or mutable PKCS#10 certificate signing request.