1
1
package org .biscuitsec .biscuit .crypto ;
2
2
3
- import biscuit .format .schema .Schema ;
4
- import java .security .InvalidKeyException ;
5
- import java .security .MessageDigest ;
6
- import java .security .NoSuchAlgorithmException ;
7
3
import java .security .SecureRandom ;
8
- import java .security .Signature ;
9
- import java .security .SignatureException ;
10
- import net .i2p .crypto .eddsa .EdDSAEngine ;
11
- import net .i2p .crypto .eddsa .EdDSAPrivateKey ;
12
- import net .i2p .crypto .eddsa .EdDSAPublicKey ;
13
- import net .i2p .crypto .eddsa .spec .EdDSANamedCurveSpec ;
14
- import net .i2p .crypto .eddsa .spec .EdDSANamedCurveTable ;
15
- import net .i2p .crypto .eddsa .spec .EdDSAPrivateKeySpec ;
16
- import net .i2p .crypto .eddsa .spec .EdDSAPublicKeySpec ;
17
4
import org .biscuitsec .biscuit .token .builder .Utils ;
5
+ import org .bouncycastle .crypto .AsymmetricCipherKeyPair ;
6
+ import org .bouncycastle .crypto .generators .Ed25519KeyPairGenerator ;
7
+ import org .bouncycastle .crypto .params .Ed25519KeyGenerationParameters ;
8
+ import org .bouncycastle .crypto .params .Ed25519PrivateKeyParameters ;
9
+ import org .bouncycastle .crypto .params .Ed25519PublicKeyParameters ;
10
+ import org .bouncycastle .crypto .signers .Ed25519Signer ;
18
11
19
12
final class Ed25519KeyPair extends KeyPair {
20
- private static final int BUFFER_SIZE = 32 ;
21
-
22
13
public static final int SIGNATURE_LENGTH = 64 ;
23
14
24
- private final EdDSAPrivateKey privateKey ;
25
- private final EdDSAPublicKey publicKey ;
26
-
27
- private static final EdDSANamedCurveSpec ED_25519 =
28
- EdDSANamedCurveTable .getByName (EdDSANamedCurveTable .ED_25519 );
15
+ private final Ed25519PrivateKeyParameters privateKey ;
16
+ private final Ed25519PublicKeyParameters publicKey ;
29
17
30
18
Ed25519KeyPair (byte [] bytes ) {
31
- EdDSAPrivateKeySpec privKeySpec = new EdDSAPrivateKeySpec (bytes , ED_25519 );
32
- EdDSAPrivateKey privKey = new EdDSAPrivateKey (privKeySpec );
33
-
34
- EdDSAPublicKeySpec pubKeySpec = new EdDSAPublicKeySpec (privKey .getA (), ED_25519 );
35
- EdDSAPublicKey pubKey = new EdDSAPublicKey (pubKeySpec );
19
+ Ed25519PrivateKeyParameters privateKey = new Ed25519PrivateKeyParameters (bytes );
20
+ Ed25519PublicKeyParameters publicKey = privateKey .generatePublicKey ();
36
21
37
- this .privateKey = privKey ;
38
- this .publicKey = pubKey ;
22
+ this .privateKey = privateKey ;
23
+ this .publicKey = publicKey ;
39
24
}
40
25
41
26
Ed25519KeyPair (SecureRandom rng ) {
42
- byte [] b = new byte [BUFFER_SIZE ];
43
- rng .nextBytes (b );
44
27
45
- EdDSAPrivateKeySpec privKeySpec = new EdDSAPrivateKeySpec ( b , ED_25519 );
46
- EdDSAPrivateKey privKey = new EdDSAPrivateKey ( privKeySpec );
28
+ Ed25519KeyPairGenerator kpg = new Ed25519KeyPairGenerator ( );
29
+ kpg . init ( new Ed25519KeyGenerationParameters ( rng ) );
47
30
48
- EdDSAPublicKeySpec pubKeySpec = new EdDSAPublicKeySpec (privKey .getA (), ED_25519 );
49
- EdDSAPublicKey pubKey = new EdDSAPublicKey (pubKeySpec );
50
-
51
- this .privateKey = privKey ;
52
- this .publicKey = pubKey ;
53
- }
54
-
55
- Ed25519KeyPair (String hex ) {
56
- this (Utils .hexStringToByteArray (hex ));
57
- }
58
-
59
- public static java .security .PublicKey decode (byte [] data ) {
60
- return new EdDSAPublicKey (new EdDSAPublicKeySpec (data , ED_25519 ));
61
- }
31
+ AsymmetricCipherKeyPair kp = kpg .generateKeyPair ();
32
+ Ed25519PrivateKeyParameters privateKey = (Ed25519PrivateKeyParameters ) kp .getPrivate ();
33
+ Ed25519PublicKeyParameters publicKey = (Ed25519PublicKeyParameters ) kp .getPublic ();
62
34
63
- public static Signature getSignature () throws NoSuchAlgorithmException {
64
- return new EdDSAEngine ( MessageDigest . getInstance ( ED_25519 . getHashAlgorithm ())) ;
35
+ this . privateKey = privateKey ;
36
+ this . publicKey = publicKey ;
65
37
}
66
38
67
39
@ Override
68
- public byte [] sign (byte [] data )
69
- throws NoSuchAlgorithmException , InvalidKeyException , SignatureException {
70
- Signature sgr = KeyPair .generateSignature (Schema .PublicKey .Algorithm .Ed25519 );
71
- sgr .initSign (privateKey );
72
- sgr .update (data );
73
- return sgr .sign ();
40
+ public byte [] sign (byte [] data ) {
41
+ var sgr = new Ed25519Signer ();
42
+ sgr .init (true , this .privateKey );
43
+ sgr .update (data , 0 , data .length );
44
+ return sgr .generateSignature ();
74
45
}
75
46
76
47
@ Override
77
48
public byte [] toBytes () {
78
- return privateKey .getSeed ();
49
+ return privateKey .getEncoded ();
79
50
}
80
51
81
52
@ Override
@@ -85,6 +56,6 @@ public String toHex() {
85
56
86
57
@ Override
87
58
public PublicKey getPublicKey () {
88
- return new PublicKey ( Schema . PublicKey . Algorithm . Ed25519 , this .publicKey );
59
+ return new Ed25519PublicKey ( this .publicKey );
89
60
}
90
61
}
0 commit comments