File: cref.go

package info (click to toggle)
golang-github-bwesterb-go-ristretto 1.2.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 628 kB
  • sloc: ansic: 1,915; asm: 278; makefile: 3
file content (84 lines) | stat: -rw-r--r-- 1,827 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
// A C implementation of the Ristretto group based on the PandA library
// by Chuengsatiansup, Ribarski and Schwabe, which we use as a reference
// of our pure Go implementation.
// See also https://link.springer.com/chapter/10.1007/978-3-319-04873-4_14
package cref

// #include "cref.h"
import "C"

type Fe25519 C.fe25519
type GroupGe C.group_ge
type GroupScalar C.group_scalar

func (f *Fe25519) c() *C.fe25519 {
	return (*C.fe25519)(f)
}

func (f *Fe25519) Unpack(buf *[32]byte) {
	C.fe25519_unpack(f.c(), (*C.uchar)(&buf[0]))
}

func (f *Fe25519) Pack(buf *[32]byte) {
	C.fe25519_pack((*C.uchar)(&buf[0]), f.c())
}

func (g *GroupGe) c() *C.group_ge {
	return (*C.group_ge)(g)
}

func (g *GroupGe) Pack(buf *[32]byte) {
	C.group_ge_pack((*C.uchar)(&buf[0]), g.c())
}

func (g *GroupGe) Unpack(buf *[32]byte) int {
	return int(C.group_ge_unpack(g.c(), (*C.uchar)(&buf[0])))
}

func (g *GroupGe) Elligator(r0 *Fe25519) {
	C.group_ge_elligator(g.c(), r0.c())
}

func (g *GroupGe) Neg(x *GroupGe) {
	C.group_ge_negate(g.c(), x.c())
}

func (g *GroupGe) Add(x, y *GroupGe) {
	C.group_ge_add(g.c(), x.c(), y.c())
}

func (g *GroupGe) Double(x *GroupGe) {
	C.group_ge_double(g.c(), x.c())
}

func (g *GroupGe) ScalarMult(x *GroupGe, s *GroupScalar) {
	C.group_ge_scalarmult(g.c(), x.c(), s.c())
}

func (g *GroupGe) X() *Fe25519 {
	return (*Fe25519)(&g.c().x)
}

func (g *GroupGe) Y() *Fe25519 {
	return (*Fe25519)(&g.c().y)
}

func (g *GroupGe) Z() *Fe25519 {
	return (*Fe25519)(&g.c().z)
}

func (g *GroupGe) T() *Fe25519 {
	return (*Fe25519)(&g.c().t)
}

func (s *GroupScalar) c() *C.group_scalar {
	return (*C.group_scalar)(s)
}

func (s *GroupScalar) Unpack(buf *[32]byte) {
	C.group_scalar_unpack(s.c(), (*C.uchar)(&buf[0]))
}

func (s *GroupScalar) Pack(buf *[32]byte) {
	C.group_scalar_pack((*C.uchar)(&buf[0]), s.c())
}