Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

BLS12-381 Crypto Primitives #154

Merged
merged 13 commits into from
Jul 18, 2023
40 changes: 40 additions & 0 deletions libraries/eosiolib/capi/eosio/crypto_bls_ext.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#pragma once
#include "types.h"
#ifdef __cplusplus
extern "C" {
#endif

__attribute__((eosio_wasm_import))
int32_t bls_g1_add(const char* op1, uint32_t op1_len, const char* op2, uint32_t op2_len, char* res, uint32_t res_len);

__attribute__((eosio_wasm_import))
int32_t bls_g2_add(const char* op1, uint32_t op1_len, const char* op2, uint32_t op2_len, char* res, uint32_t res_len);

__attribute__((eosio_wasm_import))
int32_t bls_g1_mul(const char* point, uint32_t point_len, const char* scalar, uint32_t scalar_len, char* res, uint32_t res_len);

__attribute__((eosio_wasm_import))
int32_t bls_g2_mul(const char* point, uint32_t point_len, const char* scalar, uint32_t scalar_len, char* res, uint32_t res_len);

__attribute__((eosio_wasm_import))
int32_t bls_g1_exp(const char* points, uint32_t points_len, const char* scalars, uint32_t scalars_len, uint32_t n, char* res, uint32_t res_len);

__attribute__((eosio_wasm_import))
int32_t bls_g2_exp(const char* points, uint32_t points_len, const char* scalars, uint32_t scalars_len, uint32_t n, char* res, uint32_t res_len);

__attribute__((eosio_wasm_import))
int32_t bls_pairing(const char* g1_points, uint32_t g1_points_len, const char* g2_points, uint32_t g2_points_len, uint32_t n, char* res, uint32_t res_len);

__attribute__((eosio_wasm_import))
int32_t bls_g1_map(const char* e, uint32_t e_len, char* res, uint32_t res_len);

__attribute__((eosio_wasm_import))
int32_t bls_g2_map(const char* e, uint32_t e_len, char* res, uint32_t res_len);

__attribute__((eosio_wasm_import))
int32_t bls_fp_mod(const char* s, uint32_t s_len, char* res, uint32_t res_len);

#ifdef __cplusplus
}
#endif

96 changes: 96 additions & 0 deletions libraries/eosiolib/core/eosio/crypto_bls_ext.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
#pragma once

#include "fixed_bytes.hpp"
#include "varint.hpp"
#include "serialize.hpp"

#include <array>
#include <vector>

namespace eosio {

namespace internal_use_do_not_use {
extern "C" {
__attribute__((eosio_wasm_import))
int32_t bls_g1_add(const char* op1, uint32_t op1_len, const char* op2, uint32_t op2_len, char* res, uint32_t res_len);

__attribute__((eosio_wasm_import))
int32_t bls_g2_add(const char* op1, uint32_t op1_len, const char* op2, uint32_t op2_len, char* res, uint32_t res_len);

__attribute__((eosio_wasm_import))
int32_t bls_g1_mul(const char* point, uint32_t point_len, const char* scalar, uint32_t scalar_len, char* res, uint32_t res_len);

__attribute__((eosio_wasm_import))
int32_t bls_g2_mul(const char* point, uint32_t point_len, const char* scalar, uint32_t scalar_len, char* res, uint32_t res_len);

__attribute__((eosio_wasm_import))
int32_t bls_g1_exp(const char* points, uint32_t points_len, const char* scalars, uint32_t scalars_len, uint32_t n, char* res, uint32_t res_len);

__attribute__((eosio_wasm_import))
int32_t bls_g2_exp(const char* points, uint32_t points_len, const char* scalars, uint32_t scalars_len, uint32_t n, char* res, uint32_t res_len);

__attribute__((eosio_wasm_import))
int32_t bls_pairing(const char* g1_points, uint32_t g1_points_len, const char* g2_points, uint32_t g2_points_len, uint32_t n, char* res, uint32_t res_len);

__attribute__((eosio_wasm_import))
int32_t bls_g1_map(const char* e, uint32_t e_len, char* res, uint32_t res_len);

__attribute__((eosio_wasm_import))
int32_t bls_g2_map(const char* e, uint32_t e_len, char* res, uint32_t res_len);

__attribute__((eosio_wasm_import))
int32_t bls_fp_mod(const char* s, uint32_t s_len, char* res, uint32_t res_len);
}
}

int32_t bls_g1_add(const uint8_t* op1, const uint8_t* op2, uint8_t* res)
Copy link
Contributor

@dimas1185 dimas1185 Jun 29, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what about something like this? that way you can enforce structure size:

using some_type = uint8_t[144];
    int32_t bls_g1_add(const some_type& op1, const some_type& op2, some_type& res)

Copy link
Contributor Author

@mschoenebeck mschoenebeck Jun 30, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added bls types to enforce correct operand sizes in: mschoenebeck@9d1424d

Edit: Updated https://github.com/mschoenebeck/aggsigtest/blob/main/aggsigtest.cpp as well.

{
return internal_use_do_not_use::bls_g1_add(reinterpret_cast<const char*>(op1), 144, reinterpret_cast<const char*>(op2), 144, reinterpret_cast<char*>(res), 144);
}

int32_t bls_g2_add(const uint8_t* op1, const uint8_t* op2, uint8_t* res)
{
return internal_use_do_not_use::bls_g2_add(reinterpret_cast<const char*>(op1), 288, reinterpret_cast<const char*>(op2), 288, reinterpret_cast<char*>(res), 288);
}

int32_t bls_g1_mul(const uint8_t* point, const uint8_t* scalar, uint8_t* res)
{
return internal_use_do_not_use::bls_g1_mul(reinterpret_cast<const char*>(point), 144, reinterpret_cast<const char*>(scalar), 32, reinterpret_cast<char*>(res), 144);
}

int32_t bls_g2_mul(const uint8_t* point, const uint8_t* scalar, uint8_t* res)
{
return internal_use_do_not_use::bls_g2_mul(reinterpret_cast<const char*>(point), 288, reinterpret_cast<const char*>(scalar), 32, reinterpret_cast<char*>(res), 288);
}

int32_t bls_g1_exp(const uint8_t* points, const uint8_t* scalars, const uint32_t num, uint8_t* res)
{
return internal_use_do_not_use::bls_g1_exp(reinterpret_cast<const char*>(points), num * 144, reinterpret_cast<const char*>(scalars), num * 32, num, reinterpret_cast<char*>(res), 144);
}

int32_t bls_g2_exp(const uint8_t* points, const uint8_t* scalars, const uint32_t num, uint8_t* res)
{
return internal_use_do_not_use::bls_g2_exp(reinterpret_cast<const char*>(points), num * 288, reinterpret_cast<const char*>(scalars), num * 32, num, reinterpret_cast<char*>(res), 288);
}

int32_t bls_pairing(const uint8_t* g1_points, const uint8_t* g2_points, const uint32_t num, uint8_t* res)
{
return internal_use_do_not_use::bls_pairing(reinterpret_cast<const char*>(g1_points), num * 144, reinterpret_cast<const char*>(g2_points), num * 288, num, reinterpret_cast<char*>(res), 576);
}

int32_t bls_g1_map(const uint8_t* e, uint8_t* res)
{
return internal_use_do_not_use::bls_g1_map(reinterpret_cast<const char*>(e), 48, reinterpret_cast<char*>(res), 144);
}

int32_t bls_g2_map(const uint8_t* e, uint8_t* res)
{
return internal_use_do_not_use::bls_g2_map(reinterpret_cast<const char*>(e), 96, reinterpret_cast<char*>(res), 288);
}

int32_t bls_fp_mod(const uint8_t* s, uint8_t* res)
{
return internal_use_do_not_use::bls_fp_mod(reinterpret_cast<const char*>(s), 64, reinterpret_cast<char*>(res), 48);
}
}

52 changes: 51 additions & 1 deletion libraries/native/intrinsics.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -935,4 +935,54 @@ int32_t mod_exp( const char* base, uint32_t base_len, const char* exp, uint32_t

void sha3( const char* data, uint32_t data_len, char* hash, uint32_t hash_len, int32_t keccak ) {
intrinsics::get().call<intrinsics::sha3>(data, data_len, hash, hash_len, keccak);
}
}

int32_t bls_g1_add(const char* op1, uint32_t op1_len, const char* op2, uint32_t op2_len, char* res, uint32_t res_len)
{
return intrinsics::get().call<intrinsics::bls_g1_add>(op1, op1_len, op2, op2_len, res, res_len);
}

int32_t bls_g2_add(const char* op1, uint32_t op1_len, const char* op2, uint32_t op2_len, char* res, uint32_t res_len)
{
return intrinsics::get().call<intrinsics::bls_g2_add>(op1, op1_len, op2, op2_len, res, res_len);
}

int32_t bls_g1_mul(const char* point, uint32_t point_len, const char* scalar, uint32_t scalar_len, char* res, uint32_t res_len)
{
return intrinsics::get().call<intrinsics::bls_g1_mul>(point, point_len, scalar, scalar_len, res, res_len);
}

int32_t bls_g2_mul(const char* point, uint32_t point_len, const char* scalar, uint32_t scalar_len, char* res, uint32_t res_len)
{
return intrinsics::get().call<intrinsics::bls_g2_mul>(point, point_len, scalar, scalar_len, res, res_len);
}

int32_t bls_g1_exp(const char* points, uint32_t points_len, const char* scalars, uint32_t scalars_len, uint32_t n, char* res, uint32_t res_len)
{
return intrinsics::get().call<intrinsics::bls_g1_exp>(points, points_len, scalars, scalars_len, n, res, res_len);
}

int32_t bls_g2_exp(const char* points, uint32_t points_len, const char* scalars, uint32_t scalars_len, uint32_t n, char* res, uint32_t res_len)
{
return intrinsics::get().call<intrinsics::bls_g2_exp>(points, points_len, scalars, scalars_len, n, res, res_len);
}

int32_t bls_pairing(const char* g1_points, uint32_t g1_points_len, const char* g2_points, uint32_t g2_points_len, uint32_t n, char* res, uint32_t res_len)
{
return intrinsics::get().call<intrinsics::bls_pairing>(g1_points, g1_points_len, g1_points, g1_points_len, n, res, res_len);
}

int32_t bls_g1_map(const char* e, uint32_t e_len, char* res, uint32_t res_len)
{
return intrinsics::get().call<intrinsics::bls_g1_map>(e, e_len, res, res_len);
}

int32_t bls_g2_map(const char* e, uint32_t e_len, char* res, uint32_t res_len)
{
return intrinsics::get().call<intrinsics::bls_g2_map>(e, e_len, res, res_len);
}

int32_t bls_fp_mod(const char* s, uint32_t s_len, char* res, uint32_t res_len)
{
return intrinsics::get().call<intrinsics::bls_fp_mod>(s, s_len, res, res_len);
}
13 changes: 12 additions & 1 deletion libraries/native/native/eosio/intrinsics_def.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
#include <eosio/chain.h>
#include <eosio/crypto.h>
#include <eosio/crypto_ext.h>
#include <eosio/crypto_bls_ext.h>
#include <eosio/db.h>
#include <eosio/permission.h>
#include <eosio/print.h>
Expand Down Expand Up @@ -172,7 +173,17 @@ intrinsic_macro(k1_recover) \
intrinsic_macro(alt_bn128_add) \
intrinsic_macro(alt_bn128_mul) \
intrinsic_macro(alt_bn128_pair) \
intrinsic_macro(mod_exp)
intrinsic_macro(mod_exp) \
intrinsic_macro(bls_g1_add) \
intrinsic_macro(bls_g2_add) \
intrinsic_macro(bls_g1_mul) \
intrinsic_macro(bls_g2_mul) \
intrinsic_macro(bls_g1_exp) \
intrinsic_macro(bls_g2_exp) \
intrinsic_macro(bls_pairing) \
intrinsic_macro(bls_g1_map) \
intrinsic_macro(bls_g2_map) \
intrinsic_macro(bls_fp_mod)



Expand Down