1#include <vanetza/security/pqc/fndsa512.hpp>
16using OqsSignature = std::unique_ptr<OQS_SIG,
decltype(&OQS_SIG_free)>;
18OqsSignature create_signature_context()
20 OqsSignature context { OQS_SIG_new(OQS_SIG_alg_falcon_padded_512), OQS_SIG_free };
22 throw std::runtime_error(
"liboqs does not provide Falcon-padded-512");
25 if (context->length_public_key != fndsa512_public_key_size ||
26 context->length_secret_key != fndsa512_private_key_size ||
27 context->length_signature != fndsa512_signature_size) {
28 throw std::runtime_error(
"liboqs Falcon-padded-512 parameters do not match the ASN.1 profile");
34class OqsBackend
final :
public Backend
37 KeyPair generate_key_pair()
override
39 auto context = create_signature_context();
41 key_pair.public_key.bytes.resize(fndsa512_public_key_size);
42 key_pair.private_key.bytes.resize(fndsa512_private_key_size);
44 const auto result = OQS_SIG_keypair(
45 context.get(), key_pair.public_key.bytes.data(), key_pair.private_key.bytes.data());
46 if (result != OQS_SUCCESS) {
47 throw std::runtime_error(
"liboqs failed to generate an FN-DSA-512 key pair");
55 if (private_key.bytes.size() != fndsa512_private_key_size) {
56 throw std::invalid_argument(
"FN-DSA-512 private key has an invalid size");
59 auto context = create_signature_context();
61 signature.bytes.resize(fndsa512_signature_size);
62 std::size_t signature_size = 0;
63 const auto result = OQS_SIG_sign(
64 context.get(), signature.bytes.data(), &signature_size,
65 data.data(), data.size(), private_key.bytes.data());
66 if (result != OQS_SUCCESS) {
67 throw std::runtime_error(
"liboqs failed to create an FN-DSA-512 signature");
69 if (signature_size != fndsa512_signature_size) {
70 throw std::runtime_error(
"liboqs returned a non-padded FN-DSA-512 signature");
76 bool verify(
const PublicKey& public_key,
const ByteBuffer& data,
const Signature& signature)
override
78 if (public_key.bytes.size() != fndsa512_public_key_size ||
79 signature.bytes.size() != fndsa512_signature_size) {
83 auto context = create_signature_context();
84 return OQS_SIG_verify(
85 context.get(), data.data(), data.size(), signature.bytes.data(),
86 signature.bytes.size(), public_key.bytes.data()) == OQS_SUCCESS;
92std::unique_ptr<Backend> create_fndsa512_backend()
94 return std::unique_ptr<Backend> {
new OqsBackend() };