...
1 package common
2
3 import "encoding/binary"
4
5
6
7
8
9 func Cpick(pick int, out, in1, in2 []byte) {
10 which := byte((int8(pick << 7)) >> 7)
11 for i := range out {
12 out[i] = (in1[i] & which) | (in2[i] & ^which)
13 }
14 }
15
16
17
18
19 func BytesToFp2(fp2 *Fp2, input []byte, bytelen int) {
20 if len(input) < 2*bytelen {
21 panic("input byte slice too short")
22 }
23 numW64 := (bytelen*8 + 63) / 64
24 a := make([]byte, 8*numW64)
25 b := make([]byte, 8*numW64)
26 copy(a[:bytelen], input[:bytelen])
27 copy(b[:bytelen], input[bytelen:])
28 for i := 0; i < numW64; i++ {
29 fp2.A[i] = binary.LittleEndian.Uint64(a[i*8 : (i+1)*8])
30 fp2.B[i] = binary.LittleEndian.Uint64(b[i*8 : (i+1)*8])
31 }
32 }
33
34
35
36
37 func Fp2ToBytes(output []byte, fp2 *Fp2, bytelen int) {
38 if len(output) < 2*bytelen {
39 panic("output byte slice too short")
40 }
41 numW64 := (bytelen*8 + 63) / 64
42 a := make([]byte, 8*numW64)
43 b := make([]byte, 8*numW64)
44 for i := 0; i < numW64; i++ {
45 binary.LittleEndian.PutUint64(a[i*8:(i+1)*8], fp2.A[i])
46 binary.LittleEndian.PutUint64(b[i*8:(i+1)*8], fp2.B[i])
47 }
48 copy(output[:bytelen], a[:bytelen])
49 copy(output[bytelen:], b[:bytelen])
50 }
51
View as plain text