/*
    This file is part of TON Blockchain Library.
    TON Blockchain Library is free software: you can redistribute it and/or modify
    it under the terms of the GNU Lesser General Public License as published by
    the Free Software Foundation, either version 2 of the License, or
    (at your option) any later version.
    TON Blockchain Library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Lesser General Public License for more details.
    You should have received a copy of the GNU Lesser General Public License
    along with TON Blockchain Library.  If not, see .
*/
#include 
#include "td/utils/buffer.h"
#include "common/bitstring.h"
#include "common/refint.h"
namespace vm {
namespace bls {
const size_t P1_SIZE = 48;
const size_t P2_SIZE = 96;
const size_t FP_SIZE = 48;
using P1 = td::BitArray;
using P2 = td::BitArray;
using FP = td::BitArray;
using FP2 = td::BitArray;
bool verify(const P1 &pub, td::Slice msg, const P2 &sig);
P2 aggregate(const std::vector &sig);
bool fast_aggregate_verify(const std::vector &pubs, td::Slice msg, const P2 &sig);
bool aggregate_verify(const std::vector> &pubs_msgs, const P2 &sig);
P1 g1_add(const P1 &a, const P1 &b);
P1 g1_sub(const P1 &a, const P1 &b);
P1 g1_neg(const P1 &a);
P1 g1_mul(const P1 &p, const td::RefInt256 &x);
P1 g1_multiexp(const std::vector> &ps);
P1 g1_zero();
P1 map_to_g1(const FP &a);
bool g1_in_group(const P1 &a);
bool g1_is_zero(const P1 &a);
P2 g2_add(const P2 &a, const P2 &b);
P2 g2_sub(const P2 &a, const P2 &b);
P2 g2_neg(const P2 &a);
P2 g2_mul(const P2 &p, const td::RefInt256 &x);
P2 g2_multiexp(const std::vector> &ps);
P2 g2_zero();
P2 map_to_g2(const FP2 &a);
bool g2_in_group(const P2 &a);
bool g2_is_zero(const P2 &a);
bool pairing(const std::vector> &ps);
td::RefInt256 get_r();
}  // namespace bls
}  // namespace vm