podman
46 строк · 1.1 Кб
1// Copyright 2022 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5//go:build go1.20
6
7package curve25519
8
9import "crypto/ecdh"
10
11func x25519(dst *[32]byte, scalar, point []byte) ([]byte, error) {
12curve := ecdh.X25519()
13pub, err := curve.NewPublicKey(point)
14if err != nil {
15return nil, err
16}
17priv, err := curve.NewPrivateKey(scalar)
18if err != nil {
19return nil, err
20}
21out, err := priv.ECDH(pub)
22if err != nil {
23return nil, err
24}
25copy(dst[:], out)
26return dst[:], nil
27}
28
29func scalarMult(dst, scalar, point *[32]byte) {
30if _, err := x25519(dst, scalar[:], point[:]); err != nil {
31// The only error condition for x25519 when the inputs are 32 bytes long
32// is if the output would have been the all-zero value.
33for i := range dst {
34dst[i] = 0
35}
36}
37}
38
39func scalarBaseMult(dst, scalar *[32]byte) {
40curve := ecdh.X25519()
41priv, err := curve.NewPrivateKey(scalar[:])
42if err != nil {
43panic("curve25519: internal error: scalarBaseMult was not 32 bytes")
44}
45copy(dst[:], priv.PublicKey().Bytes())
46}
47