1
1
package crypto
2
2
3
3
import (
4
+ "bytes"
4
5
"errors"
5
6
"io"
6
7
7
8
"github.com/NebulousLabs/Sia/encoding"
8
- "github.com/NebulousLabs/ed25519"
9
9
"github.com/NebulousLabs/fastrand"
10
+
11
+ "golang.org/x/crypto/ed25519"
10
12
)
11
13
12
14
const (
13
15
// EntropySize defines the amount of entropy necessary to do secure
14
16
// cryptographic operations, in bytes.
15
- EntropySize = ed25519 . EntropySize
17
+ EntropySize = 32
16
18
17
19
// PublicKeySize defines the size of public keys in bytes.
18
20
PublicKeySize = ed25519 .PublicKeySize
19
21
20
22
// SecretKeySize defines the size of secret keys in bytes.
21
- SecretKeySize = ed25519 .SecretKeySize
23
+ SecretKeySize = ed25519 .PrivateKeySize
22
24
23
25
// SignatureSize defines the size of signatures in bytes.
24
26
SignatureSize = ed25519 .SignatureSize
@@ -51,16 +53,21 @@ func (sk SecretKey) PublicKey() (pk PublicKey) {
51
53
// GenerateKeyPair creates a public-secret keypair that can be used to sign and verify
52
54
// messages.
53
55
func GenerateKeyPair () (sk SecretKey , pk PublicKey ) {
54
- var entropy [EntropySize ]byte
55
- fastrand .Read (entropy [:])
56
- return GenerateKeyPairDeterministic (entropy )
56
+ // no error possible when using fastrand.Reader
57
+ epk , esk , _ := ed25519 .GenerateKey (fastrand .Reader )
58
+ copy (sk [:], esk )
59
+ copy (pk [:], epk )
60
+ return
57
61
}
58
62
59
63
// GenerateKeyPairDeterministic generates keys deterministically using the input
60
64
// entropy. The input entropy must be 32 bytes in length.
61
- func GenerateKeyPairDeterministic (entropy [EntropySize ]byte ) (SecretKey , PublicKey ) {
62
- sk , pk := ed25519 .GenerateKey (entropy )
63
- return * sk , * pk
65
+ func GenerateKeyPairDeterministic (entropy [EntropySize ]byte ) (sk SecretKey , pk PublicKey ) {
66
+ // no error possible when using bytes.Reader
67
+ epk , esk , _ := ed25519 .GenerateKey (bytes .NewReader (entropy [:]))
68
+ copy (sk [:], esk )
69
+ copy (pk [:], epk )
70
+ return
64
71
}
65
72
66
73
// ReadSignedObject reads a length-prefixed object prefixed by its signature,
@@ -86,16 +93,14 @@ func ReadSignedObject(r io.Reader, obj interface{}, maxLen uint64, pk PublicKey)
86
93
}
87
94
88
95
// SignHash signs a message using a secret key.
89
- func SignHash (data Hash , sk SecretKey ) Signature {
90
- skNorm := [ SecretKeySize ] byte ( sk )
91
- return * ed25519 . Sign ( & skNorm , data [:])
96
+ func SignHash (data Hash , sk SecretKey ) ( sig Signature ) {
97
+ copy ( sig [:], ed25519 . Sign ( sk [:], data [:]) )
98
+ return
92
99
}
93
100
94
101
// VerifyHash uses a public key and input data to verify a signature.
95
102
func VerifyHash (data Hash , pk PublicKey , sig Signature ) error {
96
- pkNorm := [PublicKeySize ]byte (pk )
97
- sigNorm := [SignatureSize ]byte (sig )
98
- verifies := ed25519 .Verify (& pkNorm , data [:], & sigNorm )
103
+ verifies := ed25519 .Verify (pk [:], data [:], sig [:])
99
104
if ! verifies {
100
105
return ErrInvalidSignature
101
106
}
0 commit comments