Vanetza
Loading...
Searching...
No Matches
fndsa512_oqs.cpp
1#include <vanetza/security/pqc/fndsa512.hpp>
2#include <oqs/oqs.h>
3#include <memory>
4#include <stdexcept>
5
6namespace vanetza
7{
8namespace security
9{
10namespace pqc
11{
12
13namespace
14{
15
16using OqsSignature = std::unique_ptr<OQS_SIG, decltype(&OQS_SIG_free)>;
17
18OqsSignature create_signature_context()
19{
20 OqsSignature context { OQS_SIG_new(OQS_SIG_alg_falcon_padded_512), OQS_SIG_free };
21 if (!context) {
22 throw std::runtime_error("liboqs does not provide Falcon-padded-512");
23 }
24
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");
29 }
30
31 return context;
32}
33
34class OqsBackend final : public Backend
35{
36public:
37 KeyPair generate_key_pair() override
38 {
39 auto context = create_signature_context();
40 KeyPair key_pair;
41 key_pair.public_key.bytes.resize(fndsa512_public_key_size);
42 key_pair.private_key.bytes.resize(fndsa512_private_key_size);
43
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");
48 }
49
50 return key_pair;
51 }
52
53 Signature sign(const PrivateKey& private_key, const ByteBuffer& data) override
54 {
55 if (private_key.bytes.size() != fndsa512_private_key_size) {
56 throw std::invalid_argument("FN-DSA-512 private key has an invalid size");
57 }
58
59 auto context = create_signature_context();
60 Signature signature;
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");
68 }
69 if (signature_size != fndsa512_signature_size) {
70 throw std::runtime_error("liboqs returned a non-padded FN-DSA-512 signature");
71 }
72
73 return signature;
74 }
75
76 bool verify(const PublicKey& public_key, const ByteBuffer& data, const Signature& signature) override
77 {
78 if (public_key.bytes.size() != fndsa512_public_key_size ||
79 signature.bytes.size() != fndsa512_signature_size) {
80 return false;
81 }
82
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;
87 }
88};
89
90} // namespace
91
92std::unique_ptr<Backend> create_fndsa512_backend()
93{
94 return std::unique_ptr<Backend> { new OqsBackend() };
95}
96
97} // namespace pqc
98} // namespace security
99} // namespace vanetza