|
5 | 5 |
|
6 | 6 | #include "crypto/bls/impl/bls_provider_impl.hpp"
|
7 | 7 |
|
8 |
| -#include <filecoin-ffi/filecoin.h> |
9 |
| -#include <gsl/gsl_util> |
| 8 | +#include <filecoin-ffi/filcrypto.h> |
| 9 | + |
| 10 | +#include "common/ffi.hpp" |
| 11 | +#include "common/span.hpp" |
10 | 12 |
|
11 | 13 | namespace fc::crypto::bls {
|
| 14 | + namespace ffi = common::ffi; |
| 15 | + |
12 | 16 | outcome::result<KeyPair> BlsProviderImpl::generateKeyPair() const {
|
13 |
| - KeyPair key_pair{}; |
14 |
| - PrivateKeyGenerateResponse *private_key_response = private_key_generate(); |
15 |
| - if (private_key_response == nullptr) { |
| 17 | + auto response{ffi::wrap(fil_private_key_generate(), |
| 18 | + fil_destroy_private_key_generate_response)}; |
| 19 | + if (response == nullptr) { |
16 | 20 | return Errors::KeyPairGenerationFailed;
|
17 | 21 | }
|
18 |
| - auto free_private_response = gsl::finally([private_key_response]() { |
19 |
| - destroy_private_key_generate_response(private_key_response); |
20 |
| - }); |
21 |
| - std::move(std::begin(private_key_response->private_key), |
22 |
| - std::end(private_key_response->private_key), |
23 |
| - key_pair.private_key.begin()); |
24 |
| - OUTCOME_TRY(public_key, derivePublicKey(key_pair.private_key)); |
25 |
| - key_pair.public_key = public_key; |
26 |
| - return key_pair; |
| 22 | + auto private_key = ffi::array(response->private_key.inner); |
| 23 | + OUTCOME_TRY(public_key, derivePublicKey(private_key)); |
| 24 | + return KeyPair{private_key, public_key}; |
27 | 25 | }
|
28 | 26 |
|
29 | 27 | outcome::result<PublicKey> BlsProviderImpl::derivePublicKey(
|
30 | 28 | const PrivateKey &key) const {
|
31 |
| - PublicKey public_key; |
32 |
| - PrivateKeyPublicKeyResponse *response = private_key_public_key(key.data()); |
| 29 | + auto response{ffi::wrap(fil_private_key_public_key(key.data()), |
| 30 | + fil_destroy_private_key_public_key_response)}; |
33 | 31 | if (response == nullptr) {
|
34 | 32 | return Errors::InvalidPrivateKey;
|
35 | 33 | }
|
36 |
| - auto free_response = gsl::finally( |
37 |
| - [response]() { destroy_private_key_public_key_response(response); }); |
38 |
| - std::move(std::begin(response->public_key), |
39 |
| - std::end(response->public_key), |
40 |
| - public_key.begin()); |
41 |
| - return public_key; |
| 34 | + return ffi::array(response->public_key.inner); |
42 | 35 | }
|
43 | 36 |
|
44 | 37 | outcome::result<Signature> BlsProviderImpl::sign(
|
45 | 38 | gsl::span<const uint8_t> message, const PrivateKey &key) const {
|
46 |
| - Signature signature; |
47 |
| - PrivateKeySignResponse *response = |
48 |
| - private_key_sign(key.data(), message.data(), message.size()); |
| 39 | + auto response{ffi::wrap( |
| 40 | + fil_private_key_sign(key.data(), message.data(), message.size()), |
| 41 | + fil_destroy_private_key_sign_response)}; |
49 | 42 | if (response == nullptr) {
|
50 | 43 | return Errors::SignatureGenerationFailed;
|
51 | 44 | }
|
52 |
| - auto free_response = gsl::finally( |
53 |
| - [response]() { destroy_private_key_sign_response(response); }); |
54 |
| - std::move(std::begin(response->signature), |
55 |
| - std::end(response->signature), |
56 |
| - signature.begin()); |
57 |
| - return signature; |
| 45 | + return ffi::array(response->signature.inner); |
58 | 46 | }
|
59 | 47 |
|
60 | 48 | outcome::result<bool> BlsProviderImpl::verifySignature(
|
61 | 49 | gsl::span<const uint8_t> message,
|
62 | 50 | const Signature &signature,
|
63 | 51 | const PublicKey &key) const {
|
64 | 52 | OUTCOME_TRY(digest, generateHash(message));
|
65 |
| - if (verify(signature.data(), |
66 |
| - digest.data(), |
67 |
| - digest.size(), |
68 |
| - key.data(), |
69 |
| - key.size()) |
70 |
| - != 0) { |
71 |
| - return true; |
72 |
| - } |
73 |
| - return false; |
| 53 | + return fil_verify(signature.data(), |
| 54 | + digest.data(), |
| 55 | + digest.size(), |
| 56 | + key.data(), |
| 57 | + key.size()) |
| 58 | + > 0; |
74 | 59 | }
|
75 | 60 |
|
76 | 61 | outcome::result<Digest> BlsProviderImpl::generateHash(
|
77 | 62 | gsl::span<const uint8_t> message) {
|
78 |
| - Digest digest; |
79 |
| - HashResponse *response = hash(message.data(), message.size()); |
| 63 | + auto response{ffi::wrap(fil_hash(message.data(), message.size()), |
| 64 | + fil_destroy_hash_response)}; |
80 | 65 | if (response == nullptr) {
|
81 | 66 | return Errors::InternalError;
|
82 | 67 | }
|
83 |
| - auto free_response = |
84 |
| - gsl::finally([response]() { destroy_hash_response(response); }); |
85 |
| - std::move(std::begin(response->digest), |
86 |
| - std::end(response->digest), |
87 |
| - digest.begin()); |
88 |
| - return digest; |
| 68 | + return ffi::array(response->digest.inner); |
89 | 69 | }
|
90 | 70 |
|
91 | 71 | outcome::result<Signature> BlsProviderImpl::aggregateSignatures(
|
92 |
| - const std::vector<Signature> &signatures) const { |
93 |
| - Signature signature; |
94 |
| - // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) |
95 |
| - const uint8_t *flat_bytes = |
96 |
| - reinterpret_cast<const uint8_t *>(signatures.data()); |
97 |
| - size_t flat_size = sizeof(Signature) * signatures.size(); |
98 |
| - AggregateResponse *response = ::aggregate(flat_bytes, flat_size); |
| 72 | + gsl::span<const Signature> signatures) const { |
| 73 | + auto response{ffi::wrap( |
| 74 | + fil_aggregate(common::span::cast<const uint8_t>(signatures).data(), |
| 75 | + signatures.size_bytes()), |
| 76 | + fil_destroy_aggregate_response)}; |
99 | 77 | if (response == nullptr) {
|
100 | 78 | return Errors::InternalError;
|
101 | 79 | }
|
102 |
| - auto free_response = |
103 |
| - gsl::finally([response]() { destroy_aggregate_response(response); }); |
104 |
| - std::move(std::begin(response->signature), |
105 |
| - std::end(response->signature), |
106 |
| - signature.begin()); |
107 |
| - return signature; |
| 80 | + return ffi::array(response->signature.inner); |
108 | 81 | }
|
109 | 82 | }; // namespace fc::crypto::bls
|
110 | 83 |
|
|
0 commit comments