Skip to content

Commit a95190e

Browse files
authored
Move PQDSA to FIPSMODULE (#2166)
As part of validating ML-DSA into AWS-LC-FIPS we must include both PQDSA and ML-DSA directories into the fipsmodule.
1 parent 2c6ff65 commit a95190e

15 files changed

+112
-110
lines changed

crypto/CMakeLists.txt

-2
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,6 @@ add_library(
421421
evp_extra/p_ed25519_asn1.c
422422
evp_extra/p_hmac_asn1.c
423423
evp_extra/p_kem_asn1.c
424-
evp_extra/p_pqdsa.c
425424
evp_extra/p_pqdsa_asn1.c
426425
evp_extra/p_rsa_asn1.c
427426
evp_extra/p_x25519.c
@@ -471,7 +470,6 @@ add_library(
471470
poly1305/poly1305_arm.c
472471
poly1305/poly1305_vec.c
473472
pool/pool.c
474-
pqdsa/pqdsa.c
475473
rand_extra/deterministic.c
476474
rand_extra/entropy_passive.c
477475
rand_extra/forkunsafe.c

crypto/evp_extra/evp_asn1.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@
6868
#include "../bytestring/internal.h"
6969
#include "../internal.h"
7070
#include "internal.h"
71-
#include "../pqdsa/internal.h"
71+
#include "../fipsmodule/pqdsa/internal.h"
7272

7373
// parse_key_type takes the algorithm cbs sequence |cbs| and extracts the OID.
7474
// The OID is then searched against ASN.1 methods for a method with that OID.

crypto/evp_extra/p_methods.c

-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ static const EVP_PKEY_METHOD *const non_fips_pkey_evp_methods[] = {
1111
&x25519_pkey_meth,
1212
&dh_pkey_meth,
1313
&dsa_pkey_meth,
14-
&pqdsa_pkey_meth
1514
};
1615

1716
const EVP_PKEY_ASN1_METHOD *const asn1_evp_pkey_methods[] = {

crypto/evp_extra/p_pqdsa_asn1.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#include <openssl/err.h>
88
#include <openssl/mem.h>
99

10-
#include "../crypto/pqdsa/internal.h"
10+
#include "../crypto/fipsmodule/pqdsa/internal.h"
1111
#include "../crypto/internal.h"
1212
#include "../fipsmodule/evp/internal.h"
1313
#include "../ml_dsa/ml_dsa.h"

crypto/evp_extra/p_pqdsa_test.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
#include "../fipsmodule/evp/internal.h"
1616
#include "../internal.h"
1717
#include "../ml_dsa/ml_dsa.h"
18-
#include "../pqdsa/internal.h"
18+
#include "../fipsmodule/pqdsa/internal.h"
1919
#include "../test/file_test.h"
2020
#include "../test/test_util.h"
2121

crypto/evp_extra/print.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@
6565
#include "../fipsmodule/evp/internal.h"
6666
#include "../fipsmodule/rsa/internal.h"
6767
#include "../ml_dsa/ml_dsa.h"
68-
#include "../pqdsa/internal.h"
68+
#include "../fipsmodule/pqdsa/internal.h"
6969

7070
static int print_hex(BIO *bp, const uint8_t *data, size_t len, int off) {
7171
for (size_t i = 0; i < len; i++) {

crypto/fipsmodule/bcm.c

+2
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@
118118
#include "evp/p_hkdf.c"
119119
#include "evp/p_hmac.c"
120120
#include "evp/p_kem.c"
121+
#include "evp/p_pqdsa.c"
121122
#include "evp/p_rsa.c"
122123
#include "hkdf/hkdf.c"
123124
#include "hmac/hmac.c"
@@ -136,6 +137,7 @@
136137
#include "modes/xts.c"
137138
#include "modes/polyval.c"
138139
#include "pbkdf/pbkdf.c"
140+
#include "pqdsa/pqdsa.c"
139141
#include "rand/ctrdrbg.c"
140142
#include "rand/fork_detect.c"
141143
#include "rand/rand.c"

crypto/fipsmodule/evp/digestsign.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@
5757

5858
#include <openssl/err.h>
5959

60-
#include "../../pqdsa/internal.h"
60+
#include "../pqdsa/internal.h"
6161
#include "../delocate.h"
6262
#include "../digest/internal.h"
6363
#include "internal.h"

crypto/fipsmodule/evp/evp_ctx.c

+1
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ DEFINE_LOCAL_DATA(struct fips_evp_pkey_methods, AWSLC_fips_evp_pkey_methods) {
7575
out->methods[4] = EVP_PKEY_hmac_pkey_meth();
7676
out->methods[5] = EVP_PKEY_ed25519_pkey_meth();
7777
out->methods[6] = EVP_PKEY_kem_pkey_meth();
78+
out->methods[7] = EVP_PKEY_pqdsa_pkey_meth();
7879
}
7980

8081
static const EVP_PKEY_METHOD *evp_pkey_meth_find(int type) {

crypto/fipsmodule/evp/internal.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -381,8 +381,8 @@ typedef struct {
381381
void evp_pkey_set_cb_translate(BN_GENCB *cb, EVP_PKEY_CTX *ctx);
382382

383383
#define ED25519_PUBLIC_KEY_OFFSET 32
384-
#define FIPS_EVP_PKEY_METHODS 7
385-
#define NON_FIPS_EVP_PKEY_METHODS 4
384+
#define FIPS_EVP_PKEY_METHODS 8
385+
#define NON_FIPS_EVP_PKEY_METHODS 3
386386
#define ASN1_EVP_PKEY_METHODS 10
387387

388388
struct fips_evp_pkey_methods {

crypto/evp_extra/p_pqdsa.c crypto/fipsmodule/evp/p_pqdsa.c

+26-25
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
#include <openssl/mem.h>
77

88
#include "../crypto/evp_extra/internal.h"
9-
#include "../crypto/ml_dsa/ml_dsa.h"
9+
#include "../delocate.h"
10+
#include "../../ml_dsa/ml_dsa.h"
1011
#include "../crypto/internal.h"
1112
#include "../pqdsa/internal.h"
1213

@@ -336,27 +337,27 @@ EVP_PKEY *EVP_PKEY_pqdsa_new_raw_private_key(int nid, const uint8_t *in, size_t
336337
return NULL;
337338
}
338339

339-
const EVP_PKEY_METHOD pqdsa_pkey_meth = {
340-
EVP_PKEY_PQDSA,
341-
pkey_pqdsa_init,
342-
NULL,
343-
pkey_pqdsa_cleanup,
344-
pkey_pqdsa_keygen,
345-
NULL,
346-
pkey_pqdsa_sign,
347-
pkey_pqdsa_sign_message,
348-
NULL,
349-
pkey_pqdsa_verify,
350-
pkey_pqdsa_verify_message,
351-
NULL,
352-
NULL,
353-
NULL,
354-
NULL,
355-
NULL,
356-
NULL,
357-
NULL,
358-
NULL,
359-
NULL,
360-
NULL,
361-
NULL,
362-
};
340+
DEFINE_METHOD_FUNCTION(EVP_PKEY_METHOD, EVP_PKEY_pqdsa_pkey_meth) {
341+
out->pkey_id = EVP_PKEY_PQDSA;
342+
out->init = pkey_pqdsa_init;
343+
out->copy = NULL;
344+
out->cleanup = pkey_pqdsa_cleanup;
345+
out->keygen = pkey_pqdsa_keygen;
346+
out->sign_init = NULL;
347+
out->sign = pkey_pqdsa_sign;
348+
out->sign_message = pkey_pqdsa_sign_message;
349+
out->verify_init = NULL;
350+
out->verify = pkey_pqdsa_verify;
351+
out->verify_message = pkey_pqdsa_verify_message;
352+
out->verify_recover = NULL;
353+
out->encrypt = NULL;
354+
out->decrypt = NULL;
355+
out->derive = NULL;
356+
out->paramgen = NULL;
357+
out->ctrl = NULL;
358+
out->ctrl_str = NULL;
359+
out->keygen_deterministic = NULL;
360+
out->encapsulate_deterministic = NULL;
361+
out->encapsulate = NULL;
362+
out->decapsulate = NULL;
363+
}
File renamed without changes.

crypto/pqdsa/pqdsa.c crypto/fipsmodule/pqdsa/pqdsa.c

+74-73
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@
22
// SPDX-License-Identifier: Apache-2.0 OR ISC
33
#include <openssl/evp.h>
44
#include <openssl/mem.h>
5-
65
#include <openssl/base.h>
7-
#include "../evp_extra/internal.h"
6+
7+
#include "../delocate.h"
8+
#include "../../evp_extra/internal.h"
89
#include "../crypto/ml_dsa/ml_dsa.h"
910
#include "internal.h"
1011

@@ -146,83 +147,83 @@ int PQDSA_KEY_set_raw_private_key(PQDSA_KEY *key, CBS *in) {
146147
return 1;
147148
}
148149

149-
static const PQDSA_METHOD sig_ml_dsa_44_method = {
150-
ml_dsa_44_keypair,
151-
ml_dsa_44_keypair_internal,
152-
ml_dsa_44_sign,
153-
ml_dsa_extmu_44_sign,
154-
ml_dsa_44_verify,
155-
ml_dsa_extmu_44_verify,
156-
ml_dsa_44_pack_pk_from_sk
157-
};
158-
159-
static const PQDSA_METHOD sig_ml_dsa_65_method = {
160-
ml_dsa_65_keypair,
161-
ml_dsa_65_keypair_internal,
162-
ml_dsa_65_sign,
163-
ml_dsa_extmu_65_sign,
164-
ml_dsa_65_verify,
165-
ml_dsa_extmu_65_verify,
166-
ml_dsa_65_pack_pk_from_sk
167-
};
168-
169-
static const PQDSA_METHOD sig_ml_dsa_87_method = {
170-
ml_dsa_87_keypair,
171-
ml_dsa_87_keypair_internal,
172-
ml_dsa_87_sign,
173-
ml_dsa_extmu_87_sign,
174-
ml_dsa_87_verify,
175-
ml_dsa_extmu_87_verify,
176-
ml_dsa_87_pack_pk_from_sk
177-
};
178-
179-
static const PQDSA sig_ml_dsa_44 = {
180-
NID_MLDSA44,
181-
kOIDMLDSA44,
182-
sizeof(kOIDMLDSA44),
183-
"MLDSA44",
184-
MLDSA44_PUBLIC_KEY_BYTES,
185-
MLDSA44_PRIVATE_KEY_BYTES,
186-
MLDSA44_SIGNATURE_BYTES,
187-
MLDSA44_KEYGEN_SEED_BYTES,
188-
MLDSA44_SIGNATURE_SEED_BYTES,
189-
&sig_ml_dsa_44_method,
190-
};
191-
192-
static const PQDSA sig_ml_dsa_65 = {
193-
NID_MLDSA65,
194-
kOIDMLDSA65,
195-
sizeof(kOIDMLDSA65),
196-
"MLDSA65",
197-
MLDSA65_PUBLIC_KEY_BYTES,
198-
MLDSA65_PRIVATE_KEY_BYTES,
199-
MLDSA65_SIGNATURE_BYTES,
200-
MLDSA65_KEYGEN_SEED_BYTES,
201-
MLDSA65_SIGNATURE_SEED_BYTES,
202-
&sig_ml_dsa_65_method,
203-
};
204-
205-
static const PQDSA sig_ml_dsa_87 = {
206-
NID_MLDSA87,
207-
kOIDMLDSA87,
208-
sizeof(kOIDMLDSA87),
209-
"MLDSA87",
210-
MLDSA87_PUBLIC_KEY_BYTES,
211-
MLDSA87_PRIVATE_KEY_BYTES,
212-
MLDSA87_SIGNATURE_BYTES,
213-
MLDSA87_KEYGEN_SEED_BYTES,
214-
MLDSA87_SIGNATURE_SEED_BYTES,
215-
&sig_ml_dsa_87_method,
216-
};
150+
DEFINE_LOCAL_DATA(PQDSA_METHOD, sig_ml_dsa_44_method) {
151+
out->pqdsa_keygen = ml_dsa_44_keypair;
152+
out->pqdsa_keygen_internal = ml_dsa_44_keypair_internal;
153+
out->pqdsa_sign_message = ml_dsa_44_sign;
154+
out->pqdsa_sign = ml_dsa_extmu_44_sign;
155+
out->pqdsa_verify_message = ml_dsa_44_verify;
156+
out->pqdsa_verify = ml_dsa_extmu_44_verify;
157+
out->pqdsa_pack_pk_from_sk = ml_dsa_44_pack_pk_from_sk;
158+
}
159+
160+
DEFINE_LOCAL_DATA(PQDSA_METHOD, sig_ml_dsa_65_method) {
161+
out->pqdsa_keygen = ml_dsa_65_keypair;
162+
out->pqdsa_keygen_internal = ml_dsa_65_keypair_internal;
163+
out->pqdsa_sign_message = ml_dsa_65_sign;
164+
out->pqdsa_sign = ml_dsa_extmu_65_sign;
165+
out->pqdsa_verify_message = ml_dsa_65_verify;
166+
out->pqdsa_verify = ml_dsa_extmu_65_verify;
167+
out->pqdsa_pack_pk_from_sk = ml_dsa_65_pack_pk_from_sk;
168+
}
169+
170+
DEFINE_LOCAL_DATA(PQDSA_METHOD, sig_ml_dsa_87_method) {
171+
out->pqdsa_keygen = ml_dsa_87_keypair;
172+
out->pqdsa_keygen_internal = ml_dsa_87_keypair_internal;
173+
out->pqdsa_sign_message = ml_dsa_87_sign;
174+
out->pqdsa_sign = ml_dsa_extmu_87_sign;
175+
out->pqdsa_verify_message = ml_dsa_87_verify;
176+
out->pqdsa_verify = ml_dsa_extmu_87_verify;
177+
out->pqdsa_pack_pk_from_sk = ml_dsa_87_pack_pk_from_sk;
178+
}
179+
180+
DEFINE_LOCAL_DATA(PQDSA, sig_ml_dsa_44) {
181+
out->nid = NID_MLDSA44;
182+
out->oid = kOIDMLDSA44;
183+
out->oid_len = sizeof(kOIDMLDSA44);
184+
out->comment = "MLDSA44";
185+
out->public_key_len = MLDSA44_PUBLIC_KEY_BYTES;
186+
out->private_key_len = MLDSA44_PRIVATE_KEY_BYTES;
187+
out->signature_len = MLDSA44_SIGNATURE_BYTES;
188+
out->keygen_seed_len = MLDSA44_KEYGEN_SEED_BYTES;
189+
out->sign_seed_len = MLDSA44_SIGNATURE_SEED_BYTES;
190+
out->method = sig_ml_dsa_44_method();
191+
}
192+
193+
DEFINE_LOCAL_DATA(PQDSA, sig_ml_dsa_65) {
194+
out->nid = NID_MLDSA65;
195+
out->oid = kOIDMLDSA65;
196+
out->oid_len = sizeof(kOIDMLDSA65);
197+
out->comment = "MLDSA65";
198+
out->public_key_len = MLDSA65_PUBLIC_KEY_BYTES;
199+
out->private_key_len = MLDSA65_PRIVATE_KEY_BYTES;
200+
out->signature_len = MLDSA65_SIGNATURE_BYTES;
201+
out->keygen_seed_len = MLDSA65_KEYGEN_SEED_BYTES;
202+
out->sign_seed_len = MLDSA65_SIGNATURE_SEED_BYTES;
203+
out->method = sig_ml_dsa_65_method();
204+
}
205+
206+
DEFINE_LOCAL_DATA(PQDSA, sig_ml_dsa_87) {
207+
out->nid = NID_MLDSA87;
208+
out->oid = kOIDMLDSA87;
209+
out->oid_len = sizeof(kOIDMLDSA87);
210+
out->comment = "MLDSA87";
211+
out->public_key_len = MLDSA87_PUBLIC_KEY_BYTES;
212+
out->private_key_len = MLDSA87_PRIVATE_KEY_BYTES;
213+
out->signature_len = MLDSA87_SIGNATURE_BYTES;
214+
out->keygen_seed_len = MLDSA87_KEYGEN_SEED_BYTES;
215+
out->sign_seed_len = MLDSA87_SIGNATURE_SEED_BYTES;
216+
out->method = sig_ml_dsa_87_method();
217+
}
217218

218219
const PQDSA *PQDSA_find_dsa_by_nid(int nid) {
219220
switch (nid) {
220221
case NID_MLDSA44:
221-
return &sig_ml_dsa_44;
222+
return sig_ml_dsa_44();
222223
case NID_MLDSA65:
223-
return &sig_ml_dsa_65;
224+
return sig_ml_dsa_65();
224225
case NID_MLDSA87:
225-
return &sig_ml_dsa_87;
226+
return sig_ml_dsa_87();
226227
default:
227228
return NULL;
228229
}

crypto/x509/algorithm.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@
6262
#include <openssl/evp.h>
6363
#include <openssl/obj.h>
6464

65-
#include "../pqdsa/internal.h"
65+
#include "../fipsmodule/pqdsa/internal.h"
6666
#include "../fipsmodule/evp/internal.h"
6767
#include "internal.h"
6868

crypto/x509/x509_test.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
#include "../evp_extra/internal.h"
4040
#include "../internal.h"
4141
#include "../test/test_util.h"
42-
#include "../pqdsa/internal.h"
42+
#include "../fipsmodule/pqdsa/internal.h"
4343

4444
#if defined(OPENSSL_THREADS)
4545
#include <thread>

0 commit comments

Comments
 (0)