1// Copyright 2019 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// +build go1.13
6
7// Package ed25519 implements the Ed25519 signature algorithm. See
8// https://ed25519.cr.yp.to/.
9//
10// These functions are also compatible with the “Ed25519” function defined in
11// RFC 8032. However, unlike RFC 8032's formulation, this package's private key
12// representation includes a public key suffix to make multiple signing
13// operations with the same key more efficient. This package refers to the RFC
14// 8032 private key as the “seed”.
15//
16// Beginning with Go 1.13, the functionality of this package was moved to the
17// standard library as crypto/ed25519. This package only acts as a compatibility
18// wrapper.
19package ed25519
20
21import (
22	"crypto/ed25519"
23	"io"
24)
25
26const (
27	// PublicKeySize is the size, in bytes, of public keys as used in this package.
28	PublicKeySize = 32
29	// PrivateKeySize is the size, in bytes, of private keys as used in this package.
30	PrivateKeySize = 64
31	// SignatureSize is the size, in bytes, of signatures generated and verified by this package.
32	SignatureSize = 64
33	// SeedSize is the size, in bytes, of private key seeds. These are the private key representations used by RFC 8032.
34	SeedSize = 32
35)
36
37// PublicKey is the type of Ed25519 public keys.
38//
39// This type is an alias for crypto/ed25519's PublicKey type.
40// See the crypto/ed25519 package for the methods on this type.
41type PublicKey = ed25519.PublicKey
42
43// PrivateKey is the type of Ed25519 private keys. It implements crypto.Signer.
44//
45// This type is an alias for crypto/ed25519's PrivateKey type.
46// See the crypto/ed25519 package for the methods on this type.
47type PrivateKey = ed25519.PrivateKey
48
49// GenerateKey generates a public/private key pair using entropy from rand.
50// If rand is nil, crypto/rand.Reader will be used.
51func GenerateKey(rand io.Reader) (PublicKey, PrivateKey, error) {
52	return ed25519.GenerateKey(rand)
53}
54
55// NewKeyFromSeed calculates a private key from a seed. It will panic if
56// len(seed) is not SeedSize. This function is provided for interoperability
57// with RFC 8032. RFC 8032's private keys correspond to seeds in this
58// package.
59func NewKeyFromSeed(seed []byte) PrivateKey {
60	return ed25519.NewKeyFromSeed(seed)
61}
62
63// Sign signs the message with privateKey and returns a signature. It will
64// panic if len(privateKey) is not PrivateKeySize.
65func Sign(privateKey PrivateKey, message []byte) []byte {
66	return ed25519.Sign(privateKey, message)
67}
68
69// Verify reports whether sig is a valid signature of message by publicKey. It
70// will panic if len(publicKey) is not PublicKeySize.
71func Verify(publicKey PublicKey, message, sig []byte) bool {
72	return ed25519.Verify(publicKey, message, sig)
73}
74