// Package ff provides finite fields and groups useful for the BLS12-381 curve. // // # Fp // // Fp are elements of the prime field GF(p), where // // p = 0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab // // The binary representation takes FpSize = 48 bytes encoded in big-endian form. // // # Fp2 // // Fp2 are elements of the finite field GF(p^2) = Fp[u]/(u^2+1) represented as // // (a[1]u + a[0]) in Fp2, where a[0],a[1] in Fp // // The binary representation takes Fp2Size = 96 bytes encoded as a[1] || a[0] // all in big-endian form. // // # Fp4 // // Fp4 is GF(p^4)=Fp2[t]/(t^2-(u+1)). We use the representation a[1]v+a[0]. // There is no fixed external form. // // # Fp6 // // Fp6 are elements of the finite field GF(p^6) = Fp2[v]/(v^3-u-1) represented as // // (a[2]v^2 + a[1]v + a[0]) in Fp6, where a[0],a[1],a[2] in Fp2 // // The binary representation takes Fp6Size = 288 bytes encoded as a[2] || a[1] || a[0] // all in big-endian form. // // # Fp12 // // Fp12 are elements of the finite field GF(p^12) = Fp6[w]/(w^2-v) represented as // // (a[1]w + a[0]) in Fp12, where a[0],a[1] in Fp6 // // The binary representation takes Fp12Size = 576 bytes encoded as a[1] || a[0] // all in big-endian form. // // We can also represent this field via Fp4[w]/(w^3-t). This is the struct Fp12alt, // used to accelerate the pairing calculation. // // # Scalar // // Scalar are elements of the prime field GF(r), where // // r = 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001 // // The binary representation takes ScalarSize = 32 bytes encoded in big-endian form. // // # Groups // // Cyclo6 are elements of the 6th cyclotomic group contained in Fp12. // For efficient arithmetic see Granger-Scott "Faster Squaring in the Cyclotomic Subgroup of Sixth // Degree Extensions" (https://eprint.iacr.org/2009/565). // // URoot are elements of the r-roots of unity group contained in Fp12. package ff