-
Notifications
You must be signed in to change notification settings - Fork 10
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
0ec44ed
commit cd95b5e
Showing
25 changed files
with
2,661 additions
and
479 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,6 @@ | ||
//---------------------------------------------------------------------------// | ||
// Copyright (c) 2024 Alexey Yashunsky <[email protected]> | ||
// Copyright (c) 2024 Antoine Cyr <[email protected]> | ||
// Copyright (c) 2025 Antoine Cyr <[email protected]> | ||
// | ||
// MIT License | ||
// | ||
|
@@ -28,23 +28,13 @@ | |
#ifndef CRYPTO3_BBF_COMPONENTS_EC_DOUBLE_ECDSA_HPP | ||
#define CRYPTO3_BBF_COMPONENTS_EC_DOUBLE_ECDSA_HPP | ||
|
||
#include <functional> | ||
#include <nil/blueprint/bbf/generic.hpp> | ||
#include <nil/blueprint/blueprint/plonk/assignment.hpp> | ||
#include <nil/blueprint/blueprint/plonk/circuit.hpp> | ||
#include <nil/blueprint/component.hpp> | ||
#include <nil/crypto3/algebra/curves/pallas.hpp> | ||
#include <nil/crypto3/algebra/curves/vesta.hpp> | ||
#include <nil/crypto3/zk/snark/arithmetization/plonk/constraint_system.hpp> | ||
|
||
#include <nil/blueprint/bbf/components/algebra/fields/non_native/addition_mod_p.hpp> | ||
#include <nil/blueprint/bbf/components/algebra/fields/non_native/add_sub_mod_p.hpp> | ||
#include <nil/blueprint/bbf/components/algebra/fields/non_native/check_mod_p.hpp> | ||
#include <nil/blueprint/bbf/components/algebra/fields/non_native/flexible_multiplication.hpp> | ||
#include <nil/blueprint/bbf/components/algebra/fields/non_native/negation_mod_p.hpp> | ||
#include <nil/blueprint/bbf/components/detail/choice_function.hpp> | ||
#include <nil/blueprint/bbf/components/detail/range_check_multi.hpp> | ||
#include <stdexcept> | ||
#include <variant> | ||
#include <nil/blueprint/bbf/generic.hpp> | ||
#include <nil/crypto3/algebra/curves/pallas.hpp> | ||
#include <nil/crypto3/algebra/curves/vesta.hpp> | ||
|
||
namespace nil { | ||
namespace blueprint { | ||
|
@@ -56,8 +46,7 @@ namespace nil { | |
// Expects input as k-chunked values with b bits per chunk | ||
// p' = 2^(kb) - p | ||
// Input: xQ[0],...,xQ[k-1], yQ[0],...,yQ[k-1], p[0],...,p[k-1], | ||
// pp[0],...,pp[k-1], 0[0], ..., 0[k-1] | ||
// (expects zero vector constant as input) | ||
// pp[0],...,pp[k-1], 0 (expects zero constant as input) | ||
// Output: xR[0],...,xR[k-1], yR[0],...,yR[k-1] | ||
|
||
template<typename FieldType> | ||
|
@@ -67,7 +56,7 @@ namespace nil { | |
std::vector<TYPE> yQ; | ||
std::vector<TYPE> p; | ||
std::vector<TYPE> pp; | ||
std::vector<TYPE> zero; | ||
TYPE zero; | ||
}; | ||
|
||
template<typename FieldType, GenerationStage stage, | ||
|
@@ -76,8 +65,6 @@ namespace nil { | |
using generic_component<FieldType, stage>::allocate; | ||
using generic_component<FieldType, stage>::copy_constrain; | ||
using generic_component<FieldType, stage>::constrain; | ||
using generic_component<FieldType, stage>::lookup; | ||
using component_type = generic_component<FieldType, stage>; | ||
|
||
public: | ||
using typename generic_component<FieldType, stage>::TYPE; | ||
|
@@ -104,23 +91,23 @@ namespace nil { | |
} | ||
|
||
static std::tuple<std::vector<TYPE>, std::vector<TYPE>, | ||
std::vector<TYPE>, std::vector<TYPE>, std::vector<TYPE>> | ||
std::vector<TYPE>, std::vector<TYPE>, TYPE> | ||
form_input(context_type& context_object, raw_input_type raw_input, | ||
std::size_t num_chunks, std::size_t bit_size_chunk) { | ||
std::vector<TYPE> input_xQ(num_chunks); | ||
std::vector<TYPE> input_yQ(num_chunks); | ||
std::vector<TYPE> input_p(num_chunks); | ||
std::vector<TYPE> input_pp(num_chunks); | ||
std::vector<TYPE> input_zero(num_chunks); | ||
TYPE input_zero; | ||
|
||
if constexpr (stage == GenerationStage::ASSIGNMENT) { | ||
for (std::size_t i = 0; i < num_chunks; i++) { | ||
input_xQ[i] = raw_input.xQ[i]; | ||
input_yQ[i] = raw_input.yQ[i]; | ||
input_p[i] = raw_input.p[i]; | ||
input_pp[i] = raw_input.pp[i]; | ||
input_zero[i] = raw_input.zero[i]; | ||
} | ||
input_zero = raw_input.zero; | ||
} | ||
for (std::size_t i = 0; i < num_chunks; i++) { | ||
context_object.allocate(input_xQ[i], 0, i, | ||
|
@@ -131,16 +118,16 @@ namespace nil { | |
column_type::public_input); | ||
context_object.allocate(input_pp[i], 0, i + 3 * num_chunks, | ||
column_type::public_input); | ||
context_object.allocate(input_zero[i], 0, i + 4 * num_chunks, | ||
column_type::public_input); | ||
} | ||
context_object.allocate(input_zero, 0, 4 * num_chunks, | ||
column_type::public_input); | ||
return std::make_tuple(input_xQ, input_yQ, input_p, input_pp, | ||
input_zero); | ||
} | ||
|
||
ec_double(context_type& context_object, std::vector<TYPE> input_xQ, | ||
std::vector<TYPE> input_yQ, std::vector<TYPE> input_p, | ||
std::vector<TYPE> input_pp, std::vector<TYPE> input_zero, | ||
std::vector<TYPE> input_pp, TYPE input_zero, | ||
std::size_t num_chunks, std::size_t bit_size_chunk, | ||
bool make_links = true) | ||
: generic_component<FieldType, stage>(context_object) { | ||
|
@@ -149,18 +136,15 @@ namespace nil { | |
using non_native_integral_type = | ||
typename NonNativeFieldType::integral_type; | ||
|
||
using Choice_Function = | ||
typename bbf::components::choice_function<FieldType, stage>; | ||
using Range_Check = | ||
typename bbf::components::range_check_multi<FieldType, stage>; | ||
using Check_Mod_P = | ||
typename bbf::components::check_mod_p<FieldType, stage>; | ||
using Addition_Mod_P = | ||
typename bbf::components::addition_mod_p<FieldType, stage, | ||
NonNativeFieldType>; | ||
using Negation_Mod_P = | ||
typename bbf::components::negation_mod_p<FieldType, stage, | ||
NonNativeFieldType>; | ||
using Addition_Mod_P = typename bbf::components::add_sub_mod_p< | ||
FieldType, stage, NonNativeFieldType, true>; | ||
using Substraction_Mod_P = | ||
typename bbf::components::add_sub_mod_p< | ||
FieldType, stage, NonNativeFieldType, false>; | ||
using Multiplication_Mod_P = | ||
typename bbf::components::flexible_multiplication< | ||
FieldType, stage, NonNativeFieldType>; | ||
|
@@ -224,8 +208,9 @@ namespace nil { | |
input_pp, input_zero](std::vector<TYPE> x) { | ||
Range_Check rc = Range_Check(context_object, x, num_chunks, | ||
bit_size_chunk); | ||
Check_Mod_P cm = Check_Mod_P(context_object, x, input_pp, input_zero[0], | ||
num_chunks, bit_size_chunk); | ||
Check_Mod_P cm = | ||
Check_Mod_P(context_object, x, input_pp, input_zero, | ||
num_chunks, bit_size_chunk); | ||
}; | ||
|
||
// Copy constraint generation lambda expression | ||
|
@@ -242,46 +227,46 @@ namespace nil { | |
check_chunked(XR); | ||
check_chunked(YR); | ||
|
||
auto MultModP = [&context_object, input_p, input_pp, input_zero, num_chunks, | ||
bit_size_chunk](std::vector<TYPE> x, | ||
std::vector<TYPE> y) { | ||
Multiplication_Mod_P t = | ||
Multiplication_Mod_P(context_object, x, y, input_p, input_pp, input_zero[0], | ||
num_chunks, bit_size_chunk); | ||
auto MultModP = [&context_object, input_p, input_pp, input_zero, | ||
num_chunks, bit_size_chunk]( | ||
std::vector<TYPE> x, std::vector<TYPE> y) { | ||
Multiplication_Mod_P t = Multiplication_Mod_P( | ||
context_object, x, y, input_p, input_pp, input_zero, | ||
num_chunks, bit_size_chunk); | ||
return t.r; | ||
}; | ||
auto AddModP = [&context_object, input_p, input_pp, input_zero, num_chunks, | ||
bit_size_chunk](std::vector<TYPE> x, | ||
std::vector<TYPE> y) { | ||
auto AddModP = [&context_object, input_p, input_pp, input_zero, | ||
num_chunks, bit_size_chunk](std::vector<TYPE> x, | ||
std::vector<TYPE> y) { | ||
Addition_Mod_P t = | ||
Addition_Mod_P(context_object, x, y, input_p, input_pp, input_zero, | ||
num_chunks, bit_size_chunk); | ||
Addition_Mod_P(context_object, x, y, input_p, input_pp, | ||
input_zero, num_chunks, bit_size_chunk); | ||
return t.r; | ||
}; | ||
auto NegModP = [&context_object, input_p, input_pp, input_zero, num_chunks, | ||
bit_size_chunk](std::vector<TYPE> x) { | ||
Negation_Mod_P t = | ||
Negation_Mod_P(context_object, x, input_p, input_pp, input_zero, num_chunks, | ||
bit_size_chunk); | ||
auto SubModP = [&context_object, input_p, input_pp, input_zero, | ||
num_chunks, bit_size_chunk](std::vector<TYPE> x, | ||
std::vector<TYPE> y) { | ||
Substraction_Mod_P t = Substraction_Mod_P( | ||
context_object, x, y, input_p, input_pp, input_zero, | ||
num_chunks, bit_size_chunk); | ||
return t.r; | ||
}; | ||
|
||
auto t1 = MultModP(input_yQ,LAMBDA); // t1 = yQ * lambda | ||
auto t2 = AddModP(t1,t1); // t2 = t1 + t1 = 2yQ * lambda | ||
auto t3 = AddModP(input_xQ,input_xQ); // t3 = xQ + xQ = 2xQ | ||
auto t4 = AddModP(input_xQ,t3); // t4 = xQ + t3 = 3xQ | ||
auto t5 = MultModP(t4,input_xQ); // t5 = t4 * xQ = 3xQ^2 | ||
CopyConstrain(t2, t5); // 2yQ lambda = 3xQ^2 | ||
auto t6 = AddModP(XR,t3); // t6 = xR + t3 = xR + 2xQ | ||
auto t7 = MultModP(LAMBDA,LAMBDA); // t7 = lambda * lambda | ||
CopyConstrain(t6, t7); // xR + 2xQ = lambda^2 | ||
auto t8 = AddModP(YR,input_yQ); // t8 = yR + yQ | ||
auto t9 = NegModP(XR); // t9 = -xR | ||
auto t10 = AddModP(input_xQ,t9); // t10 = xQ + t9 = xQ - xR | ||
auto t11 = MultModP(LAMBDA,t10); // t11 = lambda * t10 =lambda(xQ-xR) | ||
CopyConstrain(t8, t11); // yR + yQ = lambda(xQ - xR) | ||
auto t12 = MultModP(Z,t1); // t12 = z * t1 = z * yQ * lambda | ||
CopyConstrain(LAMBDA, t12); // lambda = z yQ lambda | ||
auto t1 = MultModP(input_yQ, LAMBDA); // t1 = yQ * lambda | ||
auto t2 = AddModP(t1, t1); // t2 = t1 + t1 = 2yQ * lambda | ||
auto t3 = AddModP(input_xQ, input_xQ); // t3 = xQ + xQ = 2xQ | ||
auto t4 = AddModP(input_xQ, t3); // t4 = xQ + t3 = 3xQ | ||
auto t5 = MultModP(t4, input_xQ); // t5 = t4 * xQ = 3xQ^2 | ||
CopyConstrain(t2, t5); // 2yQ lambda = 3xQ^2 | ||
auto t6 = AddModP(XR, t3); // t6 = xR + t3 = xR + 2xQ | ||
auto t7 = MultModP(LAMBDA, LAMBDA); // t7 = lambda * lambda | ||
CopyConstrain(t6, t7); // xR + 2xQ = lambda^2 | ||
auto t8 = AddModP(YR, input_yQ); // t8 = yR + yQ | ||
auto t9 = SubModP(input_xQ, XR); // t9 = xQ - xR | ||
auto t10 = MultModP(LAMBDA, t9); // t10 = lambda * t9 =lambda(xQ-xR) | ||
CopyConstrain(t8, t10); // yR + yQ = lambda(xQ - xR) | ||
auto t11 = MultModP(Z, t1); // t11 = z * t1 = z * yQ * lambda | ||
CopyConstrain(LAMBDA, t11); // lambda = z yQ lambda | ||
|
||
for (int i = 0; i < num_chunks; ++i) { | ||
xR.push_back(XR[i]); | ||
|
Oops, something went wrong.