aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMITSUNARI Shigeo <herumi@nifty.com>2017-01-14 10:37:44 +0800
committerMITSUNARI Shigeo <herumi@nifty.com>2017-01-14 10:37:44 +0800
commite272318a39ce54d7e2cd6e8a8d16725ac42ac645 (patch)
tree62a5fde92e5a6e5fb839db3ac3839a1909e76088
parent0b9930d734bd435b14027c75fb09af9dd58e4f6d (diff)
downloaddexon-mcl-e272318a39ce54d7e2cd6e8a8d16725ac42ac645.tar.gz
dexon-mcl-e272318a39ce54d7e2cd6e8a8d16725ac42ac645.tar.zst
dexon-mcl-e272318a39ce54d7e2cd6e8a8d16725ac42ac645.zip
enable Compress::fixed_power for Fp254BNb
-rw-r--r--include/mcl/bn.hpp15
-rw-r--r--test/bn_test.cpp37
2 files changed, 45 insertions, 7 deletions
diff --git a/include/mcl/bn.hpp b/include/mcl/bn.hpp
index ef1737c..58bfc27 100644
--- a/include/mcl/bn.hpp
+++ b/include/mcl/bn.hpp
@@ -28,7 +28,7 @@ struct CurveParam {
};
const CurveParam CurveSNARK1 = { 4965661367192848881, 3, 9 };
-const CurveParam CurveSNARK2 = { 4965661367192848881, 82, 9 };
+//const CurveParam CurveSNARK2 = { 4965661367192848881, 82, 9 };
const CurveParam CurveFp254BNb = { -((1LL << 62) + (1LL << 55) + (1LL << 0)), 2, 1 };
template<class Vec>
@@ -189,6 +189,7 @@ struct ParamT {
typedef Fp2T<Fp> Fp2;
typedef mcl::EcT<Fp> G1;
typedef mcl::EcT<Fp2> G2;
+ bool isCurveFp254BNb;
mpz_class z;
mpz_class abs_z;
bool isNegative;
@@ -223,6 +224,7 @@ struct ParamT {
void init(const CurveParam& cp = CurveFp254BNb, fp::Mode mode = fp::FP_AUTO)
{
+ isCurveFp254BNb = cp == CurveFp254BNb;
{
uint64_t t = std::abs(cp.z);
isNegative = cp.z < 0;
@@ -280,7 +282,7 @@ struct ParamT {
const mpz_class largest_c = abs(6 * z + 2);
useNAF = getGoodRepl(siTbl, largest_c);
- getGoodRepl(zReplTbl, abs(z)); // QQQ : snark
+ getGoodRepl(zReplTbl, abs(z));
exp_c0 = -2 + z * (-18 + z * (-30 - 36 *z));
exp_c1 = 1 + z * (-12 + z * (-18 - 36 * z));
exp_c2 = 6 * z * z + 1;
@@ -809,16 +811,14 @@ struct BNT {
}
public:
- // not used
- void decompress()
+ void decompress() // for test
{
Fp2 nume, denomi;
decompressBeforeInv(nume, denomi);
- denomi.inverse();
+ Fp2::inv(denomi, denomi);
g1_ = nume * denomi; // g1 is recoverd.
decompressAfterInv();
}
-
/*
2275clk * 186 = 423Kclk QQQ
*/
@@ -872,6 +872,7 @@ struct BNT {
*/
static void fixed_power(Fp12& z, const Fp12& x)
{
+ assert(param.isCurveFp254BNb);
Fp12 x_org = x;
Fp12 d62;
Fp2 c55nume, c55denomi, c62nume, c62denomi;
@@ -902,7 +903,7 @@ struct BNT {
static void pow_z(Fp12& y, const Fp12& x)
{
#if 1
- if (0) {
+ if (param.isCurveFp254BNb) {
Compress::fixed_power(y, x);
} else {
Fp12 orgX = x;
diff --git a/test/bn_test.cpp b/test/bn_test.cpp
index 29830dc..01f4bcf 100644
--- a/test/bn_test.cpp
+++ b/test/bn_test.cpp
@@ -6,6 +6,7 @@ cybozu::CpuClock clk;
#include <mcl/bn256.hpp>
#include <cybozu/option.hpp>
+typedef mcl::bn256::BN::Compress Compress;
using namespace mcl::bn256;
mcl::fp::Mode g_mode;
@@ -125,6 +126,40 @@ void testMapToG2()
}
}
+void testCyclotomic()
+{
+ Fp12 a;
+ for (int i = 0; i < 12; ++i) {
+ a.getFp0()[i] = i * i;
+ }
+ BN::mapToCyclotomic(a, a);
+ Fp12 d;
+ Compress b(d, a);
+ a *= a;
+ Fp12 d2;
+ Compress c(d2, b);
+ Compress::square_n(c, 1);
+ c.decompress();
+ CYBOZU_TEST_EQUAL(a, d2);
+ Compress::square_n(b, 1);
+ b.decompress();
+ CYBOZU_TEST_EQUAL(a, d);
+}
+
+void testCompress()
+{
+ if (!BN::param.isCurveFp254BNb) return;
+ Fp12 a;
+ for (int i = 0; i < 12; ++i) {
+ a.getFp0()[i] = i;
+ }
+ BN::mapToCyclotomic(a, a);
+ Fp12 b;
+ Compress::fixed_power(b, a);
+ Fp12 c;
+ Fp12::pow(c, a, BN::param.abs_z);
+ CYBOZU_TEST_EQUAL(b, c);
+}
void test(const TestSet& ts)
{
@@ -185,6 +220,8 @@ CYBOZU_TEST_AUTO(naive)
testSetStr(ts);
testMapToG1();
testMapToG2();
+ testCyclotomic();
+ testCompress();
test(ts);
//break;
}