/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
*/

/* Fixed Data in ROM - Field and Curve parameters */

package FP256BN

// Base Bits= 56
var Modulus= [...]Chunk {0x292DDBAED33013,0x65FB12980A82D3,0x5EEE71A49F0CDC,0xFFFCF0CD46E5F2,0xFFFFFFFF}
var R2modp= [...]Chunk {0xEDE336303B9F8B,0x92FFEE9FEC54E8,0x13C1C063C55F79,0xA12F2EAC0123FA,0x8E559B2A}
const MConst Chunk=0x6C964E0537E5E5

const CURVE_Cof_I int= 1
const CURVE_A int= 0
const CURVE_B_I int= 3
var CURVE_B= [...]Chunk {0x3,0x0,0x0,0x0,0x0}
var CURVE_Order= [...]Chunk {0x2D536CD10B500D,0x65FB1299921AF6,0x5EEE71A49E0CDC,0xFFFCF0CD46E5F2,0xFFFFFFFF}
var CURVE_Gx= [...]Chunk {0x1,0x0,0x0,0x0,0x0}
var CURVE_Gy= [...]Chunk {0x2,0x0,0x0,0x0,0x0}

var Fra= [...]Chunk {0x760328AF943106,0x71511E3AB28F74,0x8DDB0867CF39A1,0xCA786F352D1A6E,0x3D617662}
var Frb= [...]Chunk {0xB32AB2FF3EFF0D,0xF4A9F45D57F35E,0xD113693CCFD33A,0x3584819819CB83,0xC29E899D}
var CURVE_Bnx= [...]Chunk {0x82F5C030B0A801,0x68,0x0,0x0,0x0}
var CURVE_Cof= [...]Chunk {0x1,0x0,0x0,0x0,0x0}
var CURVE_Cru= [...]Chunk {0x1C0A24A3A1B807,0xD79DF1932D1EDB,0x40921018659BCD,0x13988E1,0x0}
var CURVE_Pxa= [...]Chunk {0x2616B689C09EFB,0x539A12BF843CD2,0x577C28913ACE1C,0xB4C96C2028560F,0xFE0C3350}
var CURVE_Pxb= [...]Chunk {0x69ED34A37E6A2B,0x78E287D03589D2,0xC637D813B924DD,0x738AC054DB5AE1,0x4EA66057}
var CURVE_Pya= [...]Chunk {0x9B481BEDC27FF,0x24758D615848E9,0x75124E3E51EFCB,0xC542A3B376770D,0x702046E7}
var CURVE_Pyb= [...]Chunk {0x1281114AAD049B,0xBE80821A98B3E0,0x49297EB29F8B4C,0xD388C29042EEA6,0x554E3BC}
var CURVE_W=[2][5]Chunk {{0xF0036E1B054003,0xFFFFFFFE78663A,0xFFFF,0x0,0x0},{0x5EB8061615001,0xD1,0x0,0x0,0x0}}
var CURVE_SB=[2][2][5]Chunk {{{0xF5EEEE7C669004,0xFFFFFFFE78670B,0xFFFF,0x0,0x0},{0x5EB8061615001,0xD1,0x0,0x0,0x0}},{{0x5EB8061615001,0xD1,0x0,0x0,0x0},{0x3D4FFEB606100A,0x65FB129B19B4BB,0x5EEE71A49D0CDC,0xFFFCF0CD46E5F2,0xFFFFFFFF}}}
var CURVE_WB=[4][5]Chunk {{0x20678F0D30A800,0x55555554D2CC10,0x5555,0x0,0x0},{0xD6764C0D7DC805,0x8FBEA10BC3AD1A,0x806160104467DE,0xD105EB,0x0},{0xACB6061F173803,0x47DF5085E1D6C1,0xC030B0082233EF,0x6882F5,0x0},{0x26530F6E91F801,0x55555554D2CCE1,0x5555,0x0,0x0}}
var CURVE_BB=[4][4][5]Chunk {{{0xAA5DACA05AA80D,0x65FB1299921A8D,0x5EEE71A49E0CDC,0xFFFCF0CD46E5F2,0xFFFFFFFF},{0xAA5DACA05AA80C,0x65FB1299921A8D,0x5EEE71A49E0CDC,0xFFFCF0CD46E5F2,0xFFFFFFFF},{0xAA5DACA05AA80C,0x65FB1299921A8D,0x5EEE71A49E0CDC,0xFFFCF0CD46E5F2,0xFFFFFFFF},{0x5EB8061615002,0xD1,0x0,0x0,0x0}},{{0x5EB8061615001,0xD1,0x0,0x0,0x0},{0xAA5DACA05AA80C,0x65FB1299921A8D,0x5EEE71A49E0CDC,0xFFFCF0CD46E5F2,0xFFFFFFFF},{0xAA5DACA05AA80D,0x65FB1299921A8D,0x5EEE71A49E0CDC,0xFFFCF0CD46E5F2,0xFFFFFFFF},{0xAA5DACA05AA80C,0x65FB1299921A8D,0x5EEE71A49E0CDC,0xFFFCF0CD46E5F2,0xFFFFFFFF}},{{0x5EB8061615002,0xD1,0x0,0x0,0x0},{0x5EB8061615001,0xD1,0x0,0x0,0x0},{0x5EB8061615001,0xD1,0x0,0x0,0x0},{0x5EB8061615001,0xD1,0x0,0x0,0x0}},{{0x82F5C030B0A802,0x68,0x0,0x0,0x0},{0xBD700C2C2A002,0x1A2,0x0,0x0,0x0},{0x2767EC6FAA000A,0x65FB1299921A25,0x5EEE71A49E0CDC,0xFFFCF0CD46E5F2,0xFFFFFFFF},{0x82F5C030B0A802,0x68,0x0,0x0,0x0}}}

const USE_GLV bool=true
const USE_GS_G2 bool=true
const USE_GS_GT bool=true	
const GT_STRONG bool=false
