Packages

Erlang bindings for threshold cryptography over BLS12-381 keys

Current section

Files

Jump to
erlang_tc src tc_bicommitment.erl
Raw

src/tc_bicommitment.erl

-module(tc_bicommitment).
-export([
%% bivariate commitment API
degree/1,
eval/3,
row/2,
cmp/2,
reveal/1,
verify_poly/3,
verify_point/4,
validate_point/4,
serialize/1,
deserialize/1
]).
-type bicommitment() :: reference().
-export_type([bicommitment/0]).
-spec degree(C :: bicommitment()) -> non_neg_integer().
degree(C) ->
erlang_tc:degree_bivar_commitment(C).
-spec eval(C :: bicommitment(), X :: integer(), Y :: integer()) -> tc_g1:g1().
eval(C, X, Y) ->
erlang_tc:eval_bivar_commitment(C, X, Y).
-spec row(C :: bicommitment(), X :: integer()) -> tc_commitment:commitment().
row(C, X) ->
erlang_tc:row_bivar_commitment(C, X).
-spec cmp(C1 :: bicommitment(), C2 :: bicommitment()) -> boolean().
cmp(C1, C2) ->
erlang_tc:cmp_bivar_commitment(C1, C2).
-spec reveal(C :: bicommitment()) -> string().
reveal(C) ->
erlang_tc:reveal_bivar_commitment(C).
-spec verify_poly(
BiCommitment :: bicommitment(),
RowPoly :: tc_poly:poly(),
VerifierID :: non_neg_integer()
) -> boolean().
verify_poly(BiCommitment, RowPoly, VerifierID) ->
RowCommit = erlang_tc:row_bivar_commitment(BiCommitment, VerifierID),
erlang_tc:cmp_commitment(erlang_tc:commitment_poly(RowPoly), RowCommit).
-spec verify_point(
BiCommitment :: bicommitment(),
RowPoly :: tc_poly:poly(),
SenderID :: non_neg_integer(),
VerifierID :: non_neg_integer()
) -> boolean().
verify_point(BiCommitment, RowPoly, SenderID, VerifierID) ->
Val = tc_poly:eval(RowPoly, SenderID),
G1AffineOne = tc_g1_affine:one(),
ValG1 = tc_g1_affine:mul(G1AffineOne, Val),
erlang_tc:cmp_g1(erlang_tc:eval_bivar_commitment(BiCommitment, VerifierID, SenderID), ValG1).
-spec validate_point(BiCommitment :: bicommitment(),
SenderID :: non_neg_integer(),
VerifierID :: non_neg_integer(),
Point :: non_neg_integer() | tc_fr:fr()) -> boolean().
validate_point(BiCommitment, SenderID, VerifierID, Point) when is_reference(Point) ->
G1AffineOne = tc_g1_affine:one(),
ValG1 = tc_g1_affine:mul(G1AffineOne, Point),
erlang_tc:cmp_g1(erlang_tc:eval_bivar_commitment(BiCommitment, VerifierID, SenderID), ValG1);
validate_point(BiCommitment, SenderID, VerifierID, Point) when is_integer(Point) ->
G1AffineOne = tc_g1_affine:one(),
ValG1 = tc_g1_affine:mul(G1AffineOne, tc_fr:into(Point)),
erlang_tc:cmp_g1(erlang_tc:eval_bivar_commitment(BiCommitment, VerifierID, SenderID), ValG1).
-spec serialize(C :: bicommitment()) -> binary().
serialize(C) ->
erlang_tc:serialize_bivar_commitment(C).
-spec deserialize(B :: binary()) -> bicommitment().
deserialize(B) ->
erlang_tc:deserialize_bivar_commitment(B).