package elliptic
import (
_
)
var p256Precomputed string
type (
p256Curve struct {
*CurveParams
}
p256Point struct {
xyz [12]uint64
}
)
var p256 p256Curve
func () {
p256.CurveParams = &CurveParams{Name: "P-256"}
p256.P, _ = new(big.Int).SetString("115792089210356248762697446949407573530086143415290314195533631308867097853951", 10)
p256.N, _ = new(big.Int).SetString("115792089210356248762697446949407573529996955224135760342422259061068512044369", 10)
p256.B, _ = new(big.Int).SetString("5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b", 16)
p256.Gx, _ = new(big.Int).SetString("6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", 16)
p256.Gy, _ = new(big.Int).SetString("4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5", 16)
p256.BitSize = 256
}
func ( p256Curve) () *CurveParams {
return .CurveParams
}
func (, , []uint64)
func (, []uint64, int)
func (, []uint64)
func ( []uint64, int)
func (, , []uint64, int)
func ( []uint64, []byte)
func ( []byte, []uint64)
func (, []uint64, int)
func ( *[12]uint64, string, int)
func (, , []uint64)
func (, []uint64, int)
func (, , []uint64, , , int)
func (, , []uint64) int
func (, []uint64)
func ( p256Curve) ( *big.Int) *big.Int {
if .Sign() < 0 {
= new(big.Int).Neg()
}
if .Cmp(p256.N) >= 0 {
= new(big.Int).Mod(, p256.N)
}
var [4 * 9]uint64
var (
= [4*0 : 4*1]
= [4*1 : 4*2]
= [4*2 : 4*3]
= [4*3 : 4*4]
= [4*4 : 4*5]
= [4*5 : 4*6]
= [4*6 : 4*7]
= [4*7 : 4*8]
= [4*8 : 4*9]
)
fromBig([:], )
:= []uint64{0x83244c95be79eea2, 0x4699799c49bd6fa6, 0x2845b2392b6bec59, 0x66e12d94f3d95620}
p256OrdMul(, , )
p256OrdSqr(, , 1)
p256OrdMul(, , )
p256OrdMul(, , )
p256OrdMul(, , )
p256OrdSqr(, , 1)
p256OrdMul(, , )
p256OrdSqr(, , 1)
p256OrdMul(, , )
p256OrdSqr(, , 1)
p256OrdMul(, , )
p256OrdMul(, , )
p256OrdSqr(, , 2)
p256OrdMul(, , )
p256OrdSqr(, , 8)
p256OrdMul(, , )
p256OrdSqr(, , 16)
p256OrdMul(, , )
p256OrdSqr(, , 64)
p256OrdMul(, , )
p256OrdSqr(, , 32)
p256OrdMul(, , )
:= []uint8{
6, 5, 4, 5, 5,
4, 3, 3, 5, 9,
6, 2, 5, 6, 5,
4, 5, 5, 3, 10,
2, 5, 5, 3, 7, 6}
:= [][]uint64{
, , , , ,
, , , , ,
, , , , ,
, , , , ,
, , , , , }
for , := range {
p256OrdSqr(, , int())
p256OrdMul(, , [])
}
:= []uint64{1, 0, 0, 0}
p256OrdMul(, , )
:= make([]byte, 32)
p256LittleToBig(, )
return new(big.Int).SetBytes()
}
func ( []uint64, *big.Int) {
for := range {
[] = 0
}
for , := range .Bits() {
[] = uint64()
}
}
func ( []uint64, []byte) {
:= new(big.Int).SetBytes()
if .Cmp(p256.N) >= 0 {
.Mod(, p256.N)
}
fromBig(, )
}
var rr = []uint64{0x0000000000000003, 0xfffffffbffffffff, 0xfffffffffffffffe, 0x00000004fffffffd}
func ( *big.Int) *big.Int {
if .Cmp(p256.P) < 0 {
return
}
return new(big.Int).Mod(, p256.P)
}
func ( p256Curve) (, *big.Int, , []byte) (, *big.Int) {
:= make([]uint64, 4)
var , p256Point
p256GetScalar(, )
:= scalarIsZero()
.p256BaseMult()
p256GetScalar(, )
:= scalarIsZero()
fromBig(.xyz[0:4], maybeReduceModP())
fromBig(.xyz[4:8], maybeReduceModP())
p256Mul(.xyz[0:4], .xyz[0:4], rr[:])
p256Mul(.xyz[4:8], .xyz[4:8], rr[:])
.xyz[8] = 0x0000000000000001
.xyz[9] = 0xffffffff00000000
.xyz[10] = 0xffffffffffffffff
.xyz[11] = 0x00000000fffffffe
.p256ScalarMult()
var , p256Point
:= p256PointAddAsm(.xyz[:], .xyz[:], .xyz[:])
p256PointDoubleAsm(.xyz[:], .xyz[:])
.CopyConditional(&, )
.CopyConditional(&, )
.CopyConditional(&, )
return .p256PointToAffine()
}
func ( p256Curve) ( []byte) (, *big.Int) {
:= make([]uint64, 4)
p256GetScalar(, )
var p256Point
.p256BaseMult()
return .p256PointToAffine()
}
func ( p256Curve) (, *big.Int, []byte) (, *big.Int) {
:= make([]uint64, 4)
p256GetScalar(, )
var p256Point
fromBig(.xyz[0:4], maybeReduceModP())
fromBig(.xyz[4:8], maybeReduceModP())
p256Mul(.xyz[0:4], .xyz[0:4], rr[:])
p256Mul(.xyz[4:8], .xyz[4:8], rr[:])
.xyz[8] = 0x0000000000000001
.xyz[9] = 0xffffffff00000000
.xyz[10] = 0xffffffffffffffff
.xyz[11] = 0x00000000fffffffe
.p256ScalarMult()
return .p256PointToAffine()
}
func ( uint64) int {
= ^
&= >> 32
&= >> 16
&= >> 8
&= >> 4
&= >> 2
&= >> 1
return int( & 1)
}
func ( []uint64) int {
return uint64IsZero([0] | [1] | [2] | [3])
}
func ( *p256Point) () (, *big.Int) {
:= make([]uint64, 4)
:= make([]uint64, 4)
p256Inverse(, .xyz[8:12])
p256Sqr(, , 1)
p256Mul(, , )
p256Mul(, .xyz[0:4], )
p256Mul(, .xyz[4:8], )
p256FromMont(, )
p256FromMont(, )
:= make([]byte, 32)
:= make([]byte, 32)
p256LittleToBig(, )
p256LittleToBig(, )
return new(big.Int).SetBytes(), new(big.Int).SetBytes()
}
func ( *p256Point) ( *p256Point, int) {
:= uint64() - 1
:= ^
for , := range .xyz {
.xyz[] = ( & ) | (.xyz[] & )
}
}
func (, []uint64) {
var [6 * 4]uint64
:= [4*0 : 4*0+4]
:= [4*1 : 4*1+4]
:= [4*2 : 4*2+4]
:= [4*3 : 4*3+4]
:= [4*4 : 4*4+4]
p256Sqr(, , 1)
p256Mul(, , )
p256Sqr(, , 2)
p256Mul(, , )
p256Sqr(, , 4)
p256Mul(, , )
p256Sqr(, , 8)
p256Mul(, , )
p256Sqr(, , 16)
p256Mul(, , )
p256Sqr(, , 32)
p256Mul(, , )
p256Sqr(, , 128)
p256Mul(, , )
p256Sqr(, , 32)
p256Mul(, , )
p256Sqr(, , 16)
p256Mul(, , )
p256Sqr(, , 8)
p256Mul(, , )
p256Sqr(, , 4)
p256Mul(, , )
p256Sqr(, , 2)
p256Mul(, , )
p256Sqr(, , 2)
p256Mul(, , )
}
func ( *p256Point) ( *[16 * 4 * 3]uint64, int) {
copy([*12:], .xyz[:])
}
func ( uint) (int, int) {
var uint = ^(( >> 5) - 1)
var uint = (1 << 6) - - 1
= ( & ) | ( & (^))
= ( >> 1) + ( & 1)
return int(), int( & 1)
}
func ( uint) (int, int) {
var uint = ^(( >> 6) - 1)
var uint = (1 << 7) - - 1
= ( & ) | ( & (^))
= ( >> 1) + ( & 1)
return int(), int( & 1)
}
func ( *p256Point) ( []uint64) {
:= ([0] << 1) & 0x7f
, := boothW6(uint())
p256SelectBase(&.xyz, p256Precomputed, )
p256NegCond(.xyz[4:8], )
.xyz[8] = 0x0000000000000001
.xyz[9] = 0xffffffff00000000
.xyz[10] = 0xffffffffffffffff
.xyz[11] = 0x00000000fffffffe
var p256Point
.xyz[8] = 0x0000000000000001
.xyz[9] = 0xffffffff00000000
.xyz[10] = 0xffffffffffffffff
.xyz[11] = 0x00000000fffffffe
:= uint(5)
:=
for := 1; < 43; ++ {
if < 192 {
= (([/64] >> ( % 64)) + ([/64+1] << (64 - ( % 64)))) & 0x7f
} else {
= ([/64] >> ( % 64)) & 0x7f
}
+= 6
, = boothW6(uint())
p256SelectBase(&.xyz, p256Precomputed[*32*8*8:], )
p256PointAddAffineAsm(.xyz[0:12], .xyz[0:12], .xyz[0:8], , , )
|=
}
}
func ( *p256Point) ( []uint64) {
var [16 * 4 * 3]uint64
var , , , p256Point
.p256StorePoint(&, 0)
p256PointDoubleAsm(.xyz[:], .xyz[:])
p256PointDoubleAsm(.xyz[:], .xyz[:])
p256PointDoubleAsm(.xyz[:], .xyz[:])
p256PointDoubleAsm(.xyz[:], .xyz[:])
.p256StorePoint(&, 1)
.p256StorePoint(&, 3)
.p256StorePoint(&, 7)
.p256StorePoint(&, 15)
p256PointAddAsm(.xyz[:], .xyz[:], .xyz[:])
p256PointAddAsm(.xyz[:], .xyz[:], .xyz[:])
p256PointAddAsm(.xyz[:], .xyz[:], .xyz[:])
.p256StorePoint(&, 2)
.p256StorePoint(&, 4)
.p256StorePoint(&, 8)
p256PointDoubleAsm(.xyz[:], .xyz[:])
p256PointDoubleAsm(.xyz[:], .xyz[:])
.p256StorePoint(&, 5)
.p256StorePoint(&, 9)
p256PointAddAsm(.xyz[:], .xyz[:], .xyz[:])
p256PointAddAsm(.xyz[:], .xyz[:], .xyz[:])
.p256StorePoint(&, 6)
.p256StorePoint(&, 10)
p256PointDoubleAsm(.xyz[:], .xyz[:])
p256PointDoubleAsm(.xyz[:], .xyz[:])
.p256StorePoint(&, 11)
.p256StorePoint(&, 13)
p256PointAddAsm(.xyz[:], .xyz[:], .xyz[:])
p256PointAddAsm(.xyz[:], .xyz[:], .xyz[:])
.p256StorePoint(&, 12)
.p256StorePoint(&, 14)
:= uint(254)
var , int
:= ([/64] >> ( % 64)) & 0x3f
, _ = boothW5(uint())
p256Select(.xyz[0:12], [0:], )
:=
for > 4 {
-= 5
p256PointDoubleAsm(.xyz[:], .xyz[:])
p256PointDoubleAsm(.xyz[:], .xyz[:])
p256PointDoubleAsm(.xyz[:], .xyz[:])
p256PointDoubleAsm(.xyz[:], .xyz[:])
p256PointDoubleAsm(.xyz[:], .xyz[:])
if < 192 {
= (([/64] >> ( % 64)) + ([/64+1] << (64 - ( % 64)))) & 0x3f
} else {
= ([/64] >> ( % 64)) & 0x3f
}
, = boothW5(uint())
p256Select(.xyz[0:], [0:], )
p256NegCond(.xyz[4:8], )
p256PointAddAsm(.xyz[:], .xyz[:], .xyz[:])
p256MovCond(.xyz[0:12], .xyz[0:12], .xyz[0:12], )
p256MovCond(.xyz[0:12], .xyz[0:12], .xyz[0:12], )
|=
}
p256PointDoubleAsm(.xyz[:], .xyz[:])
p256PointDoubleAsm(.xyz[:], .xyz[:])
p256PointDoubleAsm(.xyz[:], .xyz[:])
p256PointDoubleAsm(.xyz[:], .xyz[:])
p256PointDoubleAsm(.xyz[:], .xyz[:])
= ([0] << 1) & 0x3f
, = boothW5(uint())
p256Select(.xyz[0:], [0:], )
p256NegCond(.xyz[4:8], )
p256PointAddAsm(.xyz[:], .xyz[:], .xyz[:])
p256MovCond(.xyz[0:12], .xyz[0:12], .xyz[0:12], )
p256MovCond(.xyz[0:12], .xyz[0:12], .xyz[0:12], )
}