Line data Source code
1 : /**
2 : * Copyright Soramitsu Co., Ltd. All Rights Reserved.
3 : * SPDX-License-Identifier: Apache-2.0
4 : */
5 :
6 : #include "consensus/yac/impl/yac_crypto_provider_impl.hpp"
7 :
8 : #include "consensus/yac/transport/yac_pb_converters.hpp"
9 : #include "cryptography/crypto_provider/crypto_signer.hpp"
10 : #include "cryptography/crypto_provider/crypto_verifier.hpp"
11 :
12 : namespace iroha {
13 : namespace consensus {
14 : namespace yac {
15 : CryptoProviderImpl::CryptoProviderImpl(
16 : const shared_model::crypto::Keypair &keypair,
17 : std::shared_ptr<shared_model::interface::CommonObjectsFactory>
18 : factory)
19 250 : : keypair_(keypair), factory_(std::move(factory)) {}
20 :
21 : bool CryptoProviderImpl::verify(const std::vector<VoteMessage> &msg) {
22 6692 : return std::all_of(
23 : std::begin(msg), std::end(msg), [](const auto &vote) {
24 : auto serialized =
25 7122 : PbConverters::serializeVote(vote).hash().SerializeAsString();
26 7122 : auto blob = shared_model::crypto::Blob(serialized);
27 :
28 7122 : return shared_model::crypto::CryptoVerifier<>::verify(
29 7122 : vote.signature->signedData(),
30 : blob,
31 7122 : vote.signature->publicKey());
32 7122 : });
33 : }
34 :
35 : VoteMessage CryptoProviderImpl::getVote(YacHash hash) {
36 3564 : VoteMessage vote;
37 3564 : vote.hash = hash;
38 : auto serialized =
39 3564 : PbConverters::serializeVotePayload(vote).hash().SerializeAsString();
40 3564 : auto blob = shared_model::crypto::Blob(serialized);
41 3564 : const auto &pubkey = keypair_.publicKey();
42 3564 : const auto &privkey = keypair_.privateKey();
43 3564 : auto signature = shared_model::crypto::CryptoSigner<>::sign(
44 3564 : blob, shared_model::crypto::Keypair(pubkey, privkey));
45 :
46 : // TODO 30.08.2018 andrei: IR-1670 Remove optional from YAC
47 : // CryptoProviderImpl::getVote
48 3564 : factory_->createSignature(pubkey, signature)
49 3564 : .match(
50 : [&](iroha::expected::Value<
51 : std::unique_ptr<shared_model::interface::Signature>> &sig) {
52 3564 : vote.signature = std::move(sig.value);
53 3564 : },
54 : [](iroha::expected::Error<std::string> &reason) {
55 0 : });
56 :
57 3564 : return vote;
58 3564 : }
59 :
60 : } // namespace yac
61 : } // namespace consensus
62 : } // namespace iroha
|