Skip to content

Commit b757c54

Browse files
committed
Add ASCON
1 parent 43ab654 commit b757c54

File tree

8 files changed

+1855
-8
lines changed

8 files changed

+1855
-8
lines changed

include/acvp/acvp.h

Lines changed: 117 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
12
/**
23
* @file
34
* @brief This is the public header file to be included by applications
@@ -17,6 +18,7 @@
1718
#define acvp_h
1819

1920
#include <stddef.h>
21+
#include <stdbool.h>
2022

2123
#ifdef __cplusplus
2224
extern "C"
@@ -273,7 +275,11 @@ typedef enum acvp_cipher {
273275
ACVP_SLH_DSA_KEYGEN,
274276
ACVP_SLH_DSA_SIGGEN,
275277
ACVP_SLH_DSA_SIGVER,
276-
ACVP_CIPHER_END
278+
ACVP_ASCON_AEAD128, // 120
279+
ACVP_ASCON_CXOF128,
280+
ACVP_ASCON_HASH256,
281+
ACVP_ASCON_XOF128,
282+
ACVP_CIPHER_END
277283
} ACVP_CIPHER;
278284

279285

@@ -387,6 +393,14 @@ typedef enum acvp_alg_type_dsa {
387393
ACVP_SUB_DSA_SIGVER,
388394
} ACVP_SUB_DSA;
389395

396+
/** @enum ACVP_SUB_ASCON */
397+
typedef enum acvp_alg_type_ascon {
398+
ACVP_SUB_ASCON_AEAD128 = ACVP_ASCON_AEAD128,
399+
ACVP_SUB_ASCON_CXOF128,
400+
ACVP_SUB_ASCON_HASH256,
401+
ACVP_SUB_ASCON_XOF128,
402+
} ACVP_SUB_ASCON;
403+
390404
/** @enum ACVP_SUB_RSA */
391405
typedef enum acvp_alg_type_rsa {
392406
ACVP_SUB_RSA_KEYGEN = ACVP_RSA_KEYGEN,
@@ -1959,6 +1973,71 @@ typedef struct acvp_dsa_tc_t {
19591973
unsigned char *msg;
19601974
} ACVP_DSA_TC;
19611975

1976+
/** @enum ACVP_ASCON_MODE */
1977+
typedef enum acvp_ascon_mode {
1978+
ACVP_ASCON_MODE_AEAD128 = 0,
1979+
ACVP_ASCON_MODE_CXOF128,
1980+
ACVP_ASCON_MODE_HASH256,
1981+
ACVP_ASCON_MODE_XOF128,
1982+
ACVP_ASCON_MODE_NONE,
1983+
} ACVP_ASCON_MODE;
1984+
1985+
/** @enum ACVP_ASCON_PARM */
1986+
typedef enum acvp_ascon_parm {
1987+
ACVP_ASCON_MODE_PARM = 1,
1988+
ACVP_ASCON_REV_PARM,
1989+
ACVP_ASCON_DIR_PARM,
1990+
ACVP_ASCON_PAYLEN_PARM,
1991+
ACVP_ASCON_ADLEN_PARM,
1992+
ACVP_ASCON_TAGLEN_PARM,
1993+
ACVP_ASCON_NONCEMASK_PARM,
1994+
ACVP_ASCON_MSGLEN_PARM,
1995+
ACVP_ASCON_OUTLEN_PARM,
1996+
ACVP_ASCON_CUSSTRLEN_PARM,
1997+
} ACVP_ASCON_PARM;
1998+
1999+
typedef enum acvp_ascon_direction {
2000+
ACVP_ASCON_DIR_ENCRYPT = 1,
2001+
ACVP_ASCON_DIR_DECRYPT,
2002+
ACVP_ASCON_DIR_BOTH,
2003+
} ACVP_ASCON_DIRECTION;
2004+
2005+
typedef enum acvp_ascon_testtype {
2006+
ACVP_ASCON_AFT = 1,
2007+
} ACVP_ASCON_TESTTYPE;
2008+
2009+
/**
2010+
* @struct ACVP_ASCON_TC
2011+
* @brief This struct holds data that represents a single test case for ASCON
2012+
* testing. This data is passed between libacvp and the crypto module.
2013+
*/
2014+
typedef struct acvp_ascon_tc_t {
2015+
int tg_id;
2016+
int tc_id;
2017+
ACVP_CIPHER cipher;
2018+
ACVP_ASCON_TESTTYPE testtype;
2019+
ACVP_ASCON_MODE mode;
2020+
ACVP_ASCON_DIRECTION direction; // AEAD128
2021+
bool supports_nonce_mask; // AEAD128
2022+
unsigned char *key; // AEAD128
2023+
unsigned char *second_key; // AEAD128
2024+
unsigned char *nonce; // AEAD128
2025+
unsigned char *ad; // AEAD128
2026+
int ad_len; // AEAD128
2027+
unsigned char *tag; // AEAD128
2028+
int tag_len; // AEAD128
2029+
bool tag_match; // AEAD128
2030+
unsigned char *pt; // AEAD128
2031+
unsigned char *ct; // AEAD128
2032+
int payload_len; // AEAD128
2033+
unsigned char *msg; // CXOF128, Hash256, XOF128
2034+
int msg_len; // CXOF128, Hash256, XOF128
2035+
unsigned char *md; // CXOF128, XOF128
2036+
int out_len; // CXOF128, XOF128
2037+
unsigned char *cs; // CXOF128
2038+
int cs_len; // CXOF128
2039+
} ACVP_ASCON_TC;
2040+
19622041
/** @enum ACVP_KAS_ECC_MODE */
19632042
typedef enum acvp_kas_ecc_mode {
19642043
ACVP_KAS_ECC_MODE_COMPONENT = 1,
@@ -2997,11 +3076,14 @@ typedef struct acvp_test_case_t {
29973076
ACVP_ML_DSA_TC *ml_dsa;
29983077
ACVP_ML_KEM_TC *ml_kem;
29993078
ACVP_SLH_DSA_TC *slh_dsa;
3000-
} tc; //!< the union abstracting the test case for passing to the user application
3079+
ACVP_ASCON_TC *ascon;
3080+
} tc; //!< the union abstracting the test case for passing to the user
3081+
//!< application
30013082
} ACVP_TEST_CASE;
30023083

30033084

30043085

3086+
30053087
/** @defgroup APIs Public APIs for libacvp
30063088
* @brief this section describes APIs for libacvp.
30073089
*/
@@ -3332,6 +3414,39 @@ ACVP_RESULT acvp_cap_dsa_set_parm(ACVP_CTX *ctx,
33323414
ACVP_DSA_PARM param,
33333415
int value);
33343416

3417+
/**
3418+
* @brief acvp_enable_ascon_cap()
3419+
* This function should be used to enable ASCON capabilities. Specific
3420+
* modes and parameters can use acvp_cap_ascon_set_parm.
3421+
*
3422+
* When the application enables a crypto capability, such as ASCON, it
3423+
* also needs to specify a callback function that will be used by libacvp when
3424+
* that crypto capability is needed during a test session.
3425+
*
3426+
* @param ctx Pointer to ACVP_CTX that was previously created by calling
3427+
* acvp_create_test_session.
3428+
* @param cipher ACVP_CIPHER enum value identifying the crypto capability.
3429+
* @param crypto_handler Address of function implemented by application that is
3430+
* invoked by libacvp when the crypto capability is needed during a test
3431+
* session. This crypto_handler function is expected to return 0 on success and
3432+
* 1 for failure.
3433+
*
3434+
* @return ACVP_RESULT
3435+
*/
3436+
ACVP_RESULT
3437+
acvp_cap_ascon_enable(ACVP_CTX *ctx, ACVP_CIPHER cipher,
3438+
int (*crypto_handler)(ACVP_TEST_CASE *test_case));
3439+
3440+
ACVP_RESULT
3441+
acvp_cap_ascon_set_parm(ACVP_CTX *ctx, ACVP_CIPHER cipher,
3442+
ACVP_ASCON_MODE mode, ACVP_ASCON_PARM param,
3443+
int value);
3444+
3445+
ACVP_RESULT
3446+
acvp_cap_ascon_set_domain(ACVP_CTX *ctx, ACVP_CIPHER cipher,
3447+
ACVP_ASCON_MODE mode, ACVP_ASCON_PARM param, int min,
3448+
int max, int increment);
3449+
33353450
/**
33363451
* @brief acvp_enable_kas_ecc_cap()
33373452
* This function should be used to enable KAS-ECC capabilities. Specific modes and

include/acvp/acvp_lcl.h

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,9 @@
164164
// DSA
165165
#define ACVP_REV_DSA ACVP_REV_STR_1_0
166166

167+
// ASCON
168+
#define ACVP_REV_ASCON "SP800-232"
169+
167170
// RSA
168171
#define ACVP_REV_RSA ACVP_REV_STR_FIPS186_5
169172
#define ACVP_REV_RSA_DECPRIM ACVP_REV_STR_SP800_56BR2
@@ -307,6 +310,12 @@
307310
#define ACVP_ALG_CSHAKE_128 "cSHAKE-128"
308311
#define ACVP_ALG_CSHAKE_256 "cSHAKE-256"
309312

313+
#define ACVP_ALG_ASCON "ASCON"
314+
#define ACVP_ALG_ASCON_AEAD128 "AEAD128"
315+
#define ACVP_ALG_ASCON_CXOF128 "CXOF128"
316+
#define ACVP_ALG_ASCON_HASH256 "Hash256"
317+
#define ACVP_ALG_ASCON_XOF128 "XOF128"
318+
310319
#define ACVP_ALG_DSA "DSA"
311320
#define ACVP_ALG_DSA_PQGGEN "pqgGen"
312321
#define ACVP_ALG_DSA_PQGVER "pqgVer"
@@ -858,6 +867,23 @@
858867
#define ACVP_DSA_SEED_MAX_BYTES (ACVP_DSA_SEED_MAX / 2)
859868
#define ACVP_DSA_MAX_STRING 3072 //!< 3072 bytes
860869

870+
#define ACVP_ASCON_MSG_BIT_MAX 65536
871+
#define ACVP_ASCON_MSG_BYTE_MAX (ACVP_ASCON_MSG_BIT_MAX >> 3)
872+
#define ACVP_ASCON_MSG_STRING_MAX (ACVP_ASCON_MSG_BIT_MAX >> 2)
873+
#define ACVP_ASCON_TAG_BIT_MAX 128
874+
#define ACVP_ASCON_TAG_BYTE_MAX (ACVP_ASCON_TAG_BIT_MAX >> 3)
875+
#define ACVP_ASCON_TAG_STRING_MAX (ACVP_ASCON_TAG_BIT_MAX >> 2)
876+
#define ACVP_ASCON_KEY_BIT_MAX 128
877+
#define ACVP_ASCON_KEY_BYTE_MAX (ACVP_ASCON_TAG_BIT_MAX >> 3)
878+
#define ACVP_ASCON_NONCE_BIT_MAX 128
879+
#define ACVP_ASCON_NONCE_BYTE_MAX (ACVP_ASCON_TAG_BIT_MAX >> 3)
880+
#define ACVP_ASCON_HASH_BIT_MAX 256
881+
#define ACVP_ASCON_HASH_BYTE_MAX (ACVP_ASCON_HASH_BIT_MAX >> 3)
882+
#define ACVP_ASCON_HASH_STRING_MAX (ACVP_ASCON_HASH_BIT_MAX >> 2)
883+
#define ACVP_ASCON_CS_BIT_MAX 2048
884+
#define ACVP_ASCON_CS_BYTE_MAX (ACVP_ASCON_CS_BIT_MAX >> 3)
885+
#define ACVP_ASCON_CS_STRING_MAX (ACVP_ASCON_CS_BIT_MAX >> 2)
886+
861887
#define ACVP_ECDSA_EXP_LEN_MAX 512
862888
#define ACVP_ECDSA_MSGLEN_MAX 8192
863889

@@ -1078,6 +1104,7 @@ struct acvp_alg_handler_t {
10781104
ACVP_SUB_ML_DSA ml_dsa;
10791105
ACVP_SUB_ML_KEM ml_kem;
10801106
ACVP_SUB_SLH_DSA slh_dsa;
1107+
ACVP_SUB_ASCON ascon;
10811108
} alg;
10821109
};
10831110

@@ -1179,7 +1206,12 @@ typedef enum acvp_capability_type {
11791206
ACVP_ML_KEM_XCAP_TYPE,
11801207
ACVP_SLH_DSA_KEYGEN_TYPE,
11811208
ACVP_SLH_DSA_SIGGEN_TYPE,
1182-
ACVP_SLH_DSA_SIGVER_TYPE
1209+
ACVP_SLH_DSA_SIGVER_TYPE,
1210+
ACVP_ASCON_TYPE,
1211+
ACVP_ASCON_AEAD128_TYPE,
1212+
ACVP_ASCON_CXOF128_TYPE,
1213+
ACVP_ASCON_HASH256_TYPE,
1214+
ACVP_ASCON_XOF128_TYPE,
11831215
} ACVP_CAP_TYPE;
11841216

11851217
/*
@@ -1548,6 +1580,20 @@ typedef struct acvp_dsa_capability {
15481580
ACVP_DSA_CAP_MODE *dsa_cap_mode;
15491581
} ACVP_DSA_CAP;
15501582

1583+
#define ACVP_ASCON_MAX_MODES 4
1584+
typedef struct acvp_ascon_capability {
1585+
ACVP_CIPHER cipher;
1586+
ACVP_ASCON_MODE cap_mode;
1587+
ACVP_ASCON_DIRECTION direction;
1588+
ACVP_JSON_DOMAIN_OBJ payload_len;
1589+
ACVP_JSON_DOMAIN_OBJ ad_len;
1590+
ACVP_JSON_DOMAIN_OBJ tag_len;
1591+
bool nonce_masking;
1592+
ACVP_JSON_DOMAIN_OBJ msg_len;
1593+
ACVP_JSON_DOMAIN_OBJ out_len;
1594+
ACVP_JSON_DOMAIN_OBJ custom_len;
1595+
} ACVP_ASCON_CAP;
1596+
15511597
typedef struct acvp_kas_ecc_mac {
15521598
int alg;
15531599
int curve;
@@ -1786,6 +1832,7 @@ typedef struct acvp_caps_list_t {
17861832
ACVP_HASH_CAP *hash_cap;
17871833
ACVP_DRBG_CAP *drbg_cap;
17881834
ACVP_DSA_CAP *dsa_cap;
1835+
ACVP_ASCON_CAP *ascon_cap;
17891836
ACVP_HMAC_CAP *hmac_cap;
17901837
ACVP_CMAC_CAP *cmac_cap;
17911838
ACVP_KMAC_CAP *kmac_cap;
@@ -2149,6 +2196,8 @@ ACVP_RESULT acvp_kdf_tls13_kat_handler(ACVP_CTX *ctx, JSON_Object *obj);
21492196

21502197
ACVP_RESULT acvp_dsa_kat_handler(ACVP_CTX *ctx, JSON_Object *obj);
21512198

2199+
ACVP_RESULT acvp_ascon_kat_handler(ACVP_CTX *ctx, JSON_Object *obj);
2200+
21522201
ACVP_RESULT acvp_kas_ecc_kat_handler(ACVP_CTX *ctx, JSON_Object *obj);
21532202

21542203
ACVP_RESULT acvp_kas_ecc_ssc_kat_handler(ACVP_CTX *ctx, JSON_Object *obj);

src/Makefile.am

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ libacvp_la_SOURCES = acvp.c \
1111
acvp_operating_env.c \
1212
acvp_parse.c \
1313
acvp_aes.c \
14+
acvp_ascon.c \
1415
acvp_des.c \
1516
acvp_hash.c \
1617
acvp_drbg.c \

src/Makefile.in

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ libacvp_la_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
138138
$(am__DEPENDENCIES_1)
139139
am_libacvp_la_OBJECTS = acvp.lo acvp_build_register.lo \
140140
acvp_capabilities.lo acvp_operating_env.lo acvp_parse.lo \
141-
acvp_aes.lo acvp_des.lo acvp_hash.lo acvp_drbg.lo \
141+
acvp_aes.lo acvp_ascon.lo acvp_des.lo acvp_hash.lo acvp_drbg.lo \
142142
acvp_transport.lo acvp_util.lo parson.lo acvp_hmac.lo \
143143
acvp_cmac.lo acvp_kmac.lo acvp_cshake.lo acvp_rsa_keygen.lo \
144144
acvp_rsa_sig.lo acvp_rsa_prim.lo acvp_dsa.lo \
@@ -382,6 +382,7 @@ libacvp_la_SOURCES = acvp.c \
382382
acvp_operating_env.c \
383383
acvp_parse.c \
384384
acvp_aes.c \
385+
acvp_ascon.c \
385386
acvp_des.c \
386387
acvp_hash.c \
387388
acvp_drbg.c \
@@ -823,6 +824,7 @@ installcheck-am:
823824
maintainer-clean: maintainer-clean-am
824825
-rm -f ./$(DEPDIR)/acvp.Plo
825826
-rm -f ./$(DEPDIR)/acvp_aes.Plo
827+
-rm -f ./$(DEPDIR)/acvp_ascon.Plo
826828
-rm -f ./$(DEPDIR)/acvp_build_register.Plo
827829
-rm -f ./$(DEPDIR)/acvp_capabilities.Plo
828830
-rm -f ./$(DEPDIR)/acvp_cmac.Plo

src/acvp.c

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,8 +181,11 @@ ACVP_ALG_HANDLER alg_tbl[ACVP_ALG_MAX] = {
181181
{ ACVP_ML_KEM_XCAP, &acvp_ml_kem_kat_handler, ACVP_ALG_ML_KEM, ACVP_ALG_ML_KEM_XCAP, ACVP_REV_ML_KEM, {.ml_kem = ACVP_SUB_ML_KEM_XCAP}},
182182
{ ACVP_SLH_DSA_KEYGEN, &acvp_slh_dsa_kat_handler, ACVP_ALG_SLH_DSA, ACVP_ALG_SLH_DSA_KEYGEN, ACVP_REV_SLH_DSA, {.slh_dsa = ACVP_SUB_SLH_DSA_KEYGEN}},
183183
{ ACVP_SLH_DSA_SIGGEN, &acvp_slh_dsa_kat_handler, ACVP_ALG_SLH_DSA, ACVP_ALG_SLH_DSA_SIGGEN, ACVP_REV_SLH_DSA, {.slh_dsa = ACVP_SUB_SLH_DSA_SIGGEN}},
184-
{ ACVP_SLH_DSA_SIGVER, &acvp_slh_dsa_kat_handler, ACVP_ALG_SLH_DSA, ACVP_ALG_SLH_DSA_SIGVER, ACVP_REV_SLH_DSA, {.slh_dsa = ACVP_SUB_SLH_DSA_SIGVER}}
185-
};
184+
{ ACVP_SLH_DSA_SIGVER, &acvp_slh_dsa_kat_handler, ACVP_ALG_SLH_DSA, ACVP_ALG_SLH_DSA_SIGVER, ACVP_REV_SLH_DSA, {.slh_dsa = ACVP_SUB_SLH_DSA_SIGVER}},
185+
{ ACVP_ASCON_AEAD128, &acvp_ascon_kat_handler, ACVP_ALG_ASCON, ACVP_ALG_ASCON_AEAD128, ACVP_REV_ASCON, {.ascon = ACVP_SUB_ASCON_AEAD128}},
186+
{ ACVP_ASCON_CXOF128, &acvp_ascon_kat_handler, ACVP_ALG_ASCON, ACVP_ALG_ASCON_CXOF128, ACVP_REV_ASCON, {.ascon = ACVP_SUB_ASCON_CXOF128}},
187+
{ ACVP_ASCON_HASH256, &acvp_ascon_kat_handler, ACVP_ALG_ASCON, ACVP_ALG_ASCON_HASH256, ACVP_REV_ASCON, {.ascon = ACVP_SUB_ASCON_HASH256}},
188+
{ ACVP_ASCON_XOF128, &acvp_ascon_kat_handler, ACVP_ALG_ASCON, ACVP_ALG_ASCON_XOF128, ACVP_REV_ASCON, {.ascon = ACVP_SUB_ASCON_XOF128}}};
186189

187190
/*
188191
* This is the first function the user should invoke to allocate
@@ -735,6 +738,15 @@ ACVP_RESULT acvp_free_test_session(ACVP_CTX *ctx) {
735738
acvp_cap_free_dsa_attrs(cap_entry);
736739
free(cap_entry->cap.dsa_cap);
737740
break;
741+
case ACVP_ASCON_TYPE:
742+
acvp_cap_free_domain(&cap_entry->cap.ascon_cap->payload_len);
743+
acvp_cap_free_domain(&cap_entry->cap.ascon_cap->ad_len);
744+
acvp_cap_free_domain(&cap_entry->cap.ascon_cap->tag_len);
745+
acvp_cap_free_domain(&cap_entry->cap.ascon_cap->msg_len);
746+
acvp_cap_free_domain(&cap_entry->cap.ascon_cap->out_len);
747+
acvp_cap_free_domain(&cap_entry->cap.ascon_cap->custom_len);
748+
free(cap_entry->cap.ascon_cap);
749+
break;
738750
case ACVP_KAS_ECC_CDH_TYPE:
739751
case ACVP_KAS_ECC_COMP_TYPE:
740752
case ACVP_KAS_ECC_NOCOMP_TYPE:

0 commit comments

Comments
 (0)