QSC Post Quantum Cryptographic Library 1.3.0.0 (C1)
A post quantum secure library written in Ansi C
Loading...
Searching...
No Matches
rcs.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_RCS_H
53#define QSC_RCS_H
54
55#include "qsccommon.h"
56#include "sha3.h"
57#if defined(QSC_SYSTEM_AESNI_ENABLED)
58# include "intrinsics.h"
59# include <immintrin.h>
60#endif
61
62QSC_CPLUSPLUS_ENABLED_START
63
115
116/***********************************
117* USER CONFIGURABLE SETTINGS *
118***********************************/
119
125#if !defined(QSC_RCS_AUTHENTICATED)
126# define QSC_RCS_AUTHENTICATED
127#endif
128
135//#define QSC_RCS_REDUCED_ROUNDS
136
137/***********************************
138* RCS CONSTANTS AND SIZES *
139***********************************/
140
145#define QSC_RCS_BLOCK_SIZE 32U
146
151#define QSC_RCS256_KEY_SIZE 32U
152
157#define QSC_RCS256_MAC_SIZE 32U
158
163#define QSC_RCS512_KEY_SIZE 64U
164
169#define QSC_RCS512_MAC_SIZE 64U
170
175#define QSC_RCS_NONCE_SIZE 32U
176
180typedef enum
181{
182 RCS256 = 0x01,
183 RCS512 = 0x02,
185
194QSC_EXPORT_API typedef struct
195{
196 const uint8_t* key;
197 size_t keylen;
198 uint8_t* nonce;
199 const uint8_t* info;
200 size_t infolen;
202
206QSC_EXPORT_API typedef struct
207{
209#if defined(QSC_SYSTEM_AESNI_ENABLED)
210 __m128i roundkeys[62U];
211# if defined(QSC_SYSTEM_HAS_AVX512)
212 __m512i roundkeysw[31U];
213# endif
214#else
215 uint32_t roundkeys[248U];
216#endif
217 size_t roundkeylen;
218 size_t rounds;
221 uint64_t counter;
222 bool encrypt;
224
234
245QSC_EXPORT_API void qsc_rcs_initialize(qsc_rcs_state* ctx, const qsc_rcs_keyparams* keyparams, bool encryption);
246
258QSC_EXPORT_API void qsc_rcs_set_associated(qsc_rcs_state* ctx, const uint8_t* data, size_t length);
259
269
284QSC_EXPORT_API bool qsc_rcs_transform(qsc_rcs_state* ctx, uint8_t* output, const uint8_t* input, size_t length);
285
302QSC_EXPORT_API bool qsc_rcs_extended_transform(qsc_rcs_state* ctx, uint8_t* output, const uint8_t* input, size_t length, bool finalize);
303
304QSC_CPLUSPLUS_ENABLED_END
305
306#endif
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:645
QSC_EXPORT_API void qsc_rcs_initialize(qsc_rcs_state *ctx, const qsc_rcs_keyparams *keyparams, bool encryption)
Initialize the state with the input cipher-key and optional info tweak.
Definition rcs.c:1117
rcs_cipher_type
The pre-defined cipher mode implementations.
Definition rcs.h:181
@ RCS512
Definition rcs.h:183
@ RCS256
Definition rcs.h:182
QSC_EXPORT_API void qsc_rcs_store_nonce(const qsc_rcs_state *ctx, uint8_t nonce[QSC_RCS_NONCE_SIZE])
Retrieves the current nonce from the state.
Definition rcs.c:1168
#define QSC_RCS_NONCE_SIZE
The nonce size in bytes.
Definition rcs.h:175
QSC_EXPORT_API bool qsc_rcs_transform(qsc_rcs_state *ctx, uint8_t *output, const uint8_t *input, size_t length)
Transform an array of bytes.
Definition rcs.c:1178
QSC_EXPORT_API void qsc_rcs_set_associated(qsc_rcs_state *ctx, const uint8_t *data, size_t length)
Set the associated data string used in authenticating the message.
Definition rcs.c:1150
QSC_EXPORT_API bool qsc_rcs_extended_transform(qsc_rcs_state *ctx, uint8_t *output, const uint8_t *input, size_t length, bool finalize)
A multi-call transform for a large array of bytes.
Definition rcs.c:1259
QSC_EXPORT_API void qsc_rcs_dispose(qsc_rcs_state *ctx)
Dispose of the RCS cipher state.
Definition rcs.c:1091
SHA3 family of hash functions.
The Keccak state array; state array must be initialized by the caller.
Definition sha3.h:256
The key parameters structure containing key, nonce, and info arrays and lengths.
Definition rcs.h:195
uint8_t * nonce
Definition rcs.h:198
const uint8_t * key
Definition rcs.h:196
size_t infolen
Definition rcs.h:200
size_t keylen
Definition rcs.h:197
const uint8_t * info
Definition rcs.h:199
The internal state structure containing the round-key array.
Definition rcs.h:207
uint32_t roundkeys[248U]
Definition rcs.h:215
uint64_t counter
Definition rcs.h:221
rcs_cipher_type ctype
Definition rcs.h:208
size_t roundkeylen
Definition rcs.h:217
size_t rounds
Definition rcs.h:218
qsc_keccak_state kstate
Definition rcs.h:219
uint8_t nonce[QSC_RCS_NONCE_SIZE]
Definition rcs.h:220
bool encrypt
Definition rcs.h:222