LCOV - code coverage report
Current view: top level - shared_model/bindings - client_api.cpp (source / functions) Hit Total Coverage
Test: coverage_cleared.info Lines: 0 68 0.0 %
Date: 2018-12-05 17:11:35 Functions: 0 16 0.0 %

          Line data    Source code
       1             : /**
       2             :  * Copyright Soramitsu Co., Ltd. All Rights Reserved.
       3             :  * SPDX-License-Identifier: Apache-2.0
       4             :  */
       5             : 
       6             : #include <boost/optional.hpp>
       7             : 
       8             : #include "backend/protobuf/transaction.hpp"
       9             : #include "backend/protobuf/util.hpp"
      10             : #include "bindings/client_api.hpp"
      11             : #include "common/bind.hpp"
      12             : #include "cryptography/crypto_provider/crypto_signer.hpp"
      13             : #include "cryptography/ed25519_sha3_impl/internal/sha3_hash.hpp"
      14             : #include "validators/default_validator.hpp"
      15             : 
      16             : namespace shared_model {
      17             :   namespace bindings {
      18             : 
      19             :     std::string convert(const Blob &blob) {
      20           0 :       return std::string(blob.begin(), blob.end());
      21             :     }
      22             : 
      23             :     template <typename Proto>
      24             :     boost::optional<Proto> get(const std::string &blob) {
      25           0 :       Proto proto;
      26           0 :       if (proto.ParseFromString(blob)) {
      27           0 :         return proto;
      28             :       }
      29           0 :       return {};
      30           0 :     }
      31             : 
      32             :     using namespace iroha;
      33             :     void validateTransaction(const Blob &b) {
      34           0 :       auto blob = convert(b);
      35             :       auto s = get<iroha::protocol::Transaction>(blob) | [](auto tx) {
      36           0 :         static validation::DefaultSignedTransactionValidator val;
      37           0 :         return boost::make_optional(
      38           0 :             val.validate(proto::Transaction(tx)).reason());
      39           0 :       };
      40           0 :       if (s) {
      41           0 :         auto &r = s.value();
      42           0 :         if (r == "") {
      43             :           return;
      44             :         }
      45           0 :         throw std::invalid_argument(r);
      46             :       }
      47           0 :       throw std::invalid_argument("unknown object");
      48           0 :     }
      49             : 
      50             :     void validateQuery(const Blob &b) {
      51           0 :       auto blob = convert(b);
      52             :       auto s = get<iroha::protocol::Query>(blob) | [](auto qry) {
      53           0 :         static validation::DefaultSignedQueryValidator val;
      54           0 :         return boost::make_optional(val.validate(proto::Query(qry)).reason());
      55           0 :       };
      56           0 :       if (s) {
      57           0 :         auto &r = s.value();
      58           0 :         if (r == "") {
      59             :           return;
      60             :         }
      61           0 :         throw std::invalid_argument(r);
      62             :       }
      63           0 :       throw std::invalid_argument("unknown object");
      64           0 :     }
      65             : 
      66             :     Blob signTransaction(const Blob &b, const crypto::Keypair &key) {
      67           0 :       auto blob = convert(b);
      68             :       auto s = get<iroha::protocol::Transaction>(blob) | [&key](auto tx) {
      69             :         auto signature =
      70           0 :             crypto::CryptoSigner<>::sign(proto::makeBlob(tx.payload()), key);
      71             : 
      72           0 :         auto sig = tx.add_signatures();
      73           0 :         sig->set_signature(crypto::toBinaryString(signature));
      74           0 :         sig->set_public_key(crypto::toBinaryString(key.publicKey()));
      75           0 :         return boost::make_optional(tx);
      76           0 :       };
      77           0 :       if (s) {
      78           0 :         return proto::makeBlob(s.value()).blob();
      79             :       }
      80           0 :       throw std::invalid_argument("unknown object");
      81           0 :     }
      82             : 
      83             :     Blob signQuery(const Blob &b, const crypto::Keypair &key) {
      84           0 :       auto blob = convert(b);
      85             :       auto s = get<iroha::protocol::Query>(blob) | [&key](auto qry) {
      86             :         auto signature =
      87           0 :             crypto::CryptoSigner<>::sign(proto::makeBlob(qry.payload()), key);
      88             : 
      89           0 :         auto sig = qry.mutable_signature();
      90           0 :         sig->set_signature(crypto::toBinaryString(signature));
      91           0 :         sig->set_public_key(crypto::toBinaryString(key.publicKey()));
      92           0 :         return boost::make_optional(qry);
      93           0 :       };
      94           0 :       if (s) {
      95           0 :         return proto::makeBlob(s.value()).blob();
      96             :       }
      97           0 :       throw std::invalid_argument("unknown object");
      98           0 :     }
      99             : 
     100             :     Blob hashTransaction(const Blob &b) {
     101           0 :       auto blob = convert(b);
     102             :       auto s = get<iroha::protocol::Transaction>(blob) | [](auto tx) {
     103           0 :         auto pl = proto::makeBlob(tx.payload());
     104           0 :         return boost::make_optional(
     105           0 :             sha3_256(pl.blob().data(), pl.blob().size()));
     106           0 :       };
     107           0 :       if (s) {
     108           0 :         return Blob(s->begin(), s->end());
     109             :       }
     110           0 :       throw std::invalid_argument("unknown object");
     111           0 :     }
     112             : 
     113             :     Blob hashQuery(const Blob &b) {
     114           0 :       auto blob = convert(b);
     115             :       auto s = get<iroha::protocol::Query>(blob) | [](auto qry) {
     116           0 :         auto pl = proto::makeBlob(qry.payload());
     117           0 :         return boost::make_optional(
     118           0 :             sha3_256(pl.blob().data(), pl.blob().size()));
     119           0 :       };
     120           0 :       if (s) {
     121           0 :         return Blob(s->begin(), s->end());
     122             :       }
     123           0 :       throw std::invalid_argument("unknown object");
     124           0 :     }
     125             : 
     126             :     interface::types::HashType utxReducedHash(
     127             :         const shared_model::proto::UnsignedWrapper<
     128             :             shared_model::proto::Transaction> &utx) {
     129           0 :       return utx.reducedHash();
     130             :     }
     131             :   }  // namespace bindings
     132             : }  // namespace shared_model

Generated by: LCOV version 1.13