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
Merged
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

170 changes: 170 additions & 0 deletions libraries/eosiolib/core/eosio/crypto_bls_ext.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,170 @@
#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);
}
}

using bls_scalar = uint8_t[32];
using bls_fp = uint8_t[48];
using bls_fp2 = bls_fp[2];
using bls_g1 = uint8_t[144];
using bls_g2 = uint8_t[288];
using bls_gt = uint8_t[576];

int32_t bls_g1_add(const bls_g1& op1, const bls_g1& op2, bls_g1& res)
{
return internal_use_do_not_use::bls_g1_add(
reinterpret_cast<const char*>(op1),
sizeof(bls_g1),
reinterpret_cast<const char*>(op2),
sizeof(bls_g1),
reinterpret_cast<char*>(res),
sizeof(bls_g1)
);
}

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

int32_t bls_g1_mul(const bls_g1& point, const bls_scalar& scalar, bls_g1& res)
{
return internal_use_do_not_use::bls_g1_mul(
reinterpret_cast<const char*>(point),
sizeof(bls_g1),
reinterpret_cast<const char*>(scalar),
sizeof(bls_scalar),
reinterpret_cast<char*>(res),
sizeof(bls_g1)
);
}

int32_t bls_g2_mul(const bls_g2& point, const bls_scalar& scalar, bls_g2& res)
{
return internal_use_do_not_use::bls_g2_mul(
reinterpret_cast<const char*>(point),
sizeof(bls_g2),
reinterpret_cast<const char*>(scalar),
sizeof(bls_scalar),
reinterpret_cast<char*>(res),
sizeof(bls_g2)
);
}

int32_t bls_g1_exp(const bls_g1* points, const bls_scalar* scalars, const uint32_t num, bls_g1& res)
{
return internal_use_do_not_use::bls_g1_exp(
reinterpret_cast<const char*>(points),
num * sizeof(bls_g1),
reinterpret_cast<const char*>(scalars),
num * sizeof(bls_scalar),
num,
reinterpret_cast<char*>(res),
sizeof(bls_g1)
);
}

int32_t bls_g2_exp(const bls_g2* points, const bls_scalar* scalars, const uint32_t num, bls_g2& res)
{
return internal_use_do_not_use::bls_g2_exp(
reinterpret_cast<const char*>(points),
num * sizeof(bls_g2),
reinterpret_cast<const char*>(scalars),
num * sizeof(bls_scalar),
num,
reinterpret_cast<char*>(res),
sizeof(bls_g2)
);
}

int32_t bls_pairing(const bls_g1* g1_points, const bls_g2* g2_points, const uint32_t num, bls_gt& res)
{
return internal_use_do_not_use::bls_pairing(
reinterpret_cast<const char*>(g1_points),
num * sizeof(bls_g1),
reinterpret_cast<const char*>(g2_points),
num * sizeof(bls_g2),
num,
reinterpret_cast<char*>(res),
sizeof(bls_gt)
);
}

int32_t bls_g1_map(const bls_fp& e, bls_g1& res)
{
return internal_use_do_not_use::bls_g1_map(
reinterpret_cast<const char*>(e),
sizeof(bls_fp),
reinterpret_cast<char*>(res),
sizeof(bls_g1)
);
}

int32_t bls_g2_map(const bls_fp2& e, bls_g2& res)
{
return internal_use_do_not_use::bls_g2_map(
reinterpret_cast<const char*>(e),
sizeof(bls_fp2),
reinterpret_cast<char*>(res),
sizeof(bls_g2)
);
}

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

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
Loading