QSC Post Quantum Cryptographic Library 1.1.0.2 (B2)
A post quantum secure library written in Ansi C
Loading...
Searching...
No Matches
x509csr.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_CSR_H
53#define QSC_X509_CSR_H
54
55#include "qsccommon.h"
56#include "x509types.h"
57
58QSC_CPLUSPLUS_ENABLED_START
59
81
86#define QSC_X509_CSR_ATTRIBUTES_MAX 8U
87
92#define QSC_X509_CSR_ATTRIBUTE_VALUE_MAX 1024U
93
98#define QSC_X509_CSR_WRITE_MAX 16384U
99
115
120{
121 uint32_t version;
122 qsc_x509_name subject;
123 qsc_x509_subject_public_key_info spki;
124 qsc_x509_algorithm_identifier signaturealgorithm;
125 qsc_x509_extensions extensions;
128 uint8_t signature[QSC_X509_SIGNATURE_MAX];
131 const uint8_t* infodata;
132 size_t infodatalen;
133 const uint8_t* der;
134 size_t derlen;
135 bool derowned;
137
151typedef bool (*qsc_x509_csr_signature_verify_callback)(const qsc_x509_csr* csr, void* state);
152
167QSC_EXPORT_API bool qsc_x509_csr_verify_with_spki(const qsc_x509_csr* csr, const qsc_x509_subject_public_key_info* signerspki);
168
182
194
203QSC_EXPORT_API qsc_asn1_status qsc_x509_csr_set_subject(qsc_x509_csr* csr, const qsc_x509_name* subject);
204
213QSC_EXPORT_API qsc_asn1_status qsc_x509_csr_set_spki(qsc_x509_csr* csr, const qsc_x509_subject_public_key_info* spki);
214
223QSC_EXPORT_API qsc_asn1_status qsc_x509_csr_set_signature_algorithm(qsc_x509_csr* csr, const qsc_x509_algorithm_identifier* signaturealgorithm);
224
237QSC_EXPORT_API qsc_asn1_status qsc_x509_csr_set_extension_request(qsc_x509_csr* csr, const qsc_x509_extensions* extensions);
238
246QSC_EXPORT_API const qsc_x509_extensions* qsc_x509_csr_get_extension_request(const qsc_x509_csr* csr);
247
256QSC_EXPORT_API qsc_asn1_status qsc_x509_csr_copy_extension_request(const qsc_x509_csr* csr, qsc_x509_extensions* extensions);
257
270QSC_EXPORT_API qsc_asn1_status qsc_x509_csr_encode_info_der(const qsc_x509_csr* csr, uint8_t* output, size_t* outputlen);
271
287QSC_EXPORT_API qsc_asn1_status qsc_x509_csr_encode_der(const qsc_x509_csr* csr, qsc_x509_certificate_sign_callback signcallback, void* context, uint8_t* output, size_t* outputlen);
288
304QSC_EXPORT_API qsc_asn1_status qsc_x509_csr_sign(const qsc_x509_csr* csr, qsc_x509_certificate_sign_callback signcallback, void* context, uint8_t* output, size_t* outputlen);
305
315QSC_EXPORT_API qsc_asn1_status qsc_x509_csr_decode_der(qsc_x509_csr* csr, const uint8_t* input, size_t inputlen);
316
326QSC_EXPORT_API qsc_asn1_status qsc_x509_csr_decode_pem(qsc_x509_csr* csr, const char* input, size_t inputlen);
327
336QSC_EXPORT_API const qsc_x509_extension* qsc_x509_csr_find_extension(const qsc_x509_csr* csr, qsc_x509_extension_type type);
337
346
357
368QSC_EXPORT_API qsc_asn1_status qsc_x509_csr_encode_pem(const uint8_t* der, size_t derlen, char* output, size_t* outputlen);
369
384QSC_EXPORT_API qsc_asn1_status qsc_x509_csr_add_attribute(qsc_x509_csr* csr, const qsc_asn1_oid* oid, const uint8_t* value, size_t valuelen);
385
395
404QSC_EXPORT_API qsc_asn1_status qsc_x509_csr_set_subject_alt_name(qsc_x509_csr* csr, const qsc_x509_subject_alt_name* subjectaltname);
405
415QSC_EXPORT_API qsc_asn1_status qsc_x509_csr_add_san_dns(qsc_x509_csr* csr, const char* dnsname, size_t dnsnamelen);
416
426QSC_EXPORT_API qsc_asn1_status qsc_x509_csr_add_san_ip(qsc_x509_csr* csr, const uint8_t* address, size_t addresslen);
427
436QSC_EXPORT_API qsc_asn1_status qsc_x509_csr_set_extended_key_usage(qsc_x509_csr* csr, const qsc_x509_extended_key_usage* extendedkeyusage);
437
446QSC_EXPORT_API qsc_asn1_status qsc_x509_csr_set_subject_key_identifier(qsc_x509_csr* csr, const qsc_x509_subject_key_identifier* subjectkeyidentifier);
447
461
476QSC_EXPORT_API qsc_asn1_status qsc_x509_csr_set_ml_dsa_spki(qsc_x509_csr* csr, uint32_t level, const uint8_t* publickey, size_t publickeylen);
477
492QSC_EXPORT_API qsc_asn1_status qsc_x509_csr_set_ml_kem_spki(qsc_x509_csr* csr, uint32_t level, const uint8_t* publickey, size_t publickeylen);
493
494QSC_CPLUSPLUS_ENABLED_END
495
496#endif
enum qsc_asn1_status_t qsc_asn1_status
ASN.1 helper status codes.
QSC_EXPORT_API struct qsc_asn1_oid_t qsc_asn1_oid
A decoded ASN.1 OBJECT IDENTIFIER.
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
A decoded or mutable PKCS#10 CSR attribute.
Definition x509csr.h:110
size_t valuelen
Definition x509csr.h:113
uint8_t value[QSC_X509_CSR_ATTRIBUTE_VALUE_MAX]
Definition x509csr.h:112
qsc_asn1_oid oid
Definition x509csr.h:111
A decoded or mutable PKCS#10 certificate signing request.
Definition x509csr.h:120
const uint8_t * infodata
Definition x509csr.h:131
uint8_t signature[QSC_X509_SIGNATURE_MAX]
Definition x509csr.h:128
qsc_x509_csr_attribute attributes[QSC_X509_CSR_ATTRIBUTES_MAX]
Definition x509csr.h:126
size_t signaturelen
Definition x509csr.h:129
size_t infodatalen
Definition x509csr.h:132
size_t derlen
Definition x509csr.h:134
qsc_x509_subject_public_key_info spki
Definition x509csr.h:123
qsc_x509_algorithm_identifier signaturealgorithm
Definition x509csr.h:124
qsc_x509_extensions extensions
Definition x509csr.h:125
const uint8_t * der
Definition x509csr.h:133
bool derowned
Definition x509csr.h:135
uint32_t version
Definition x509csr.h:121
uint8_t signatureunusedbits
Definition x509csr.h:130
qsc_x509_name subject
Definition x509csr.h:122
size_t attributecount
Definition x509csr.h:127
QSC_EXPORT_API qsc_asn1_status qsc_x509_csr_set_signature_algorithm(qsc_x509_csr *csr, const qsc_x509_algorithm_identifier *signaturealgorithm)
Set the CSR signature algorithm identifier.
Definition x509csr.c:625
QSC_EXPORT_API qsc_asn1_status qsc_x509_csr_sign(const qsc_x509_csr *csr, qsc_x509_certificate_sign_callback signcallback, void *context, uint8_t *output, size_t *outputlen)
Sign and encode a CSR as DER.
Definition x509csr.c:1131
QSC_EXPORT_API qsc_asn1_status qsc_x509_csr_set_extended_key_usage(qsc_x509_csr *csr, const qsc_x509_extended_key_usage *extendedkeyusage)
Set the requested Extended Key Usage extension.
Definition x509csr.c:831
QSC_EXPORT_API void qsc_x509_csr_initialize(qsc_x509_csr *csr)
Initialize a CSR object.
Definition x509csr.c:559
bool(* qsc_x509_csr_signature_verify_callback)(const qsc_x509_csr *csr, void *state)
Caller-supplied CSR signature verification callback type.
Definition x509csr.h:151
QSC_EXPORT_API qsc_asn1_status qsc_x509_csr_set_extension_request(qsc_x509_csr *csr, const qsc_x509_extensions *extensions)
Set the normalized extensionRequest payload.
Definition x509csr.c:646
QSC_EXPORT_API qsc_asn1_status qsc_x509_csr_set_ml_dsa_signature_algorithm(qsc_x509_csr *csr, uint32_t level)
Set the CSR signature algorithm to an ML-DSA variant.
Definition x509csr.c:871
QSC_EXPORT_API qsc_asn1_status qsc_x509_csr_decode_pem(qsc_x509_csr *csr, const char *input, size_t inputlen)
Decode a PEM encoded CSR.
Definition x509csr.c:1330
#define QSC_X509_CSR_ATTRIBUTES_MAX
The maximum number of generic non-extension CSR attributes stored in a CSR object.
Definition x509csr.h:86
QSC_EXPORT_API qsc_asn1_status qsc_x509_csr_encode_info_der(const qsc_x509_csr *csr, uint8_t *output, size_t *outputlen)
Encode the CertificationRequestInfo structure as DER.
Definition x509csr.c:987
QSC_EXPORT_API bool qsc_x509_csr_verify_with_spki(const qsc_x509_csr *csr, const qsc_x509_subject_public_key_info *signerspki)
Verify a CSR signature against a caller-supplied signer SPKI.
Definition x509csr.c:1446
QSC_EXPORT_API qsc_asn1_status qsc_x509_csr_decode_der(qsc_x509_csr *csr, const uint8_t *input, size_t inputlen)
Decode a DER encoded CSR.
Definition x509csr.c:1144
QSC_EXPORT_API bool qsc_x509_csr_verify(const qsc_x509_csr *csr)
Verify a CSR using its contained subject public key information.
Definition x509csr.c:1425
QSC_EXPORT_API qsc_asn1_status qsc_x509_csr_set_ml_kem_spki(qsc_x509_csr *csr, uint32_t level, const uint8_t *publickey, size_t publickeylen)
Set the CSR subject public key information to an ML-KEM key.
Definition x509csr.c:948
QSC_EXPORT_API struct qsc_x509_csr_attribute_t qsc_x509_csr_attribute
A decoded or mutable PKCS#10 CSR attribute.
QSC_EXPORT_API qsc_asn1_status qsc_x509_csr_set_subject(qsc_x509_csr *csr, const qsc_x509_name *subject)
Set the CSR subject distinguished name.
Definition x509csr.c:581
QSC_EXPORT_API qsc_asn1_status qsc_x509_csr_encode_pem(const uint8_t *der, size_t derlen, char *output, size_t *outputlen)
Encode a DER CSR as PEM.
Definition x509csr.c:1492
QSC_EXPORT_API const qsc_x509_extension * qsc_x509_csr_find_extension(const qsc_x509_csr *csr, qsc_x509_extension_type type)
Find a requested extension by type.
Definition x509csr.c:1386
QSC_EXPORT_API qsc_asn1_status qsc_x509_csr_copy_extension_request(const qsc_x509_csr *csr, qsc_x509_extensions *extensions)
Copy the normalized extensionRequest payload.
Definition x509csr.c:685
QSC_EXPORT_API qsc_asn1_status qsc_x509_csr_set_subject_key_identifier(qsc_x509_csr *csr, const qsc_x509_subject_key_identifier *subjectkeyidentifier)
Set the requested Subject Key Identifier extension.
Definition x509csr.c:851
QSC_EXPORT_API bool qsc_x509_csr_verify_ex(const qsc_x509_csr *csr, qsc_x509_csr_signature_verify_callback verifycallback, void *state)
Verify a CSR using a caller-supplied verification callback.
Definition x509csr.c:1406
#define QSC_X509_CSR_ATTRIBUTE_VALUE_MAX
The maximum number of DER octets stored for a generic CSR attribute value.
Definition x509csr.h:92
QSC_EXPORT_API struct qsc_x509_csr_t qsc_x509_csr
A decoded or mutable PKCS#10 certificate signing request.
QSC_EXPORT_API void qsc_x509_csr_clear(qsc_x509_csr *csr)
Clear a CSR object.
Definition x509csr.c:570
QSC_EXPORT_API qsc_asn1_status qsc_x509_csr_add_san_ip(qsc_x509_csr *csr, const uint8_t *address, size_t addresslen)
Add an IP address to the requested Subject Alternative Name extension.
Definition x509csr.c:808
QSC_EXPORT_API qsc_asn1_status qsc_x509_csr_add_attribute(qsc_x509_csr *csr, const qsc_asn1_oid *oid, const uint8_t *value, size_t valuelen)
Add a generic non-extension CSR attribute.
Definition x509csr.c:705
QSC_EXPORT_API const qsc_x509_extensions * qsc_x509_csr_get_extension_request(const qsc_x509_csr *csr)
Get the normalized extensionRequest payload.
Definition x509csr.c:667
QSC_EXPORT_API qsc_asn1_status qsc_x509_csr_set_ml_dsa_spki(qsc_x509_csr *csr, uint32_t level, const uint8_t *publickey, size_t publickeylen)
Set the CSR subject public key information to an ML-DSA key.
Definition x509csr.c:909
QSC_EXPORT_API const qsc_x509_csr_attribute * qsc_x509_csr_get_attribute(const qsc_x509_csr *csr, const qsc_asn1_oid *oid)
Get a generic CSR attribute by OID.
Definition x509csr.c:744
QSC_EXPORT_API qsc_asn1_status qsc_x509_csr_set_spki(qsc_x509_csr *csr, const qsc_x509_subject_public_key_info *spki)
Set the CSR subject public key information.
Definition x509csr.c:600
QSC_EXPORT_API qsc_asn1_status qsc_x509_csr_set_subject_alt_name(qsc_x509_csr *csr, const qsc_x509_subject_alt_name *subjectaltname)
Set the requested Subject Alternative Name extension.
Definition x509csr.c:765
QSC_EXPORT_API qsc_asn1_status qsc_x509_csr_encode_der(const qsc_x509_csr *csr, qsc_x509_certificate_sign_callback signcallback, void *context, uint8_t *output, size_t *outputlen)
Encode and sign a complete CSR as DER.
Definition x509csr.c:1070
QSC_EXPORT_API qsc_asn1_status qsc_x509_csr_add_san_dns(qsc_x509_csr *csr, const char *dnsname, size_t dnsnamelen)
Add a DNS name to the requested Subject Alternative Name extension.
Definition x509csr.c:785