11package org .biscuitsec .biscuit .crypto ;
22
3- import biscuit .format .schema .Schema ;
4- import java .security .InvalidKeyException ;
5- import java .security .MessageDigest ;
6- import java .security .NoSuchAlgorithmException ;
73import 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 ;
174import 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 ;
1811
1912final class Ed25519KeyPair extends KeyPair {
20- private static final int BUFFER_SIZE = 32 ;
21-
2213 public static final int SIGNATURE_LENGTH = 64 ;
2314
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 ;
2917
3018 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 ();
3621
37- this .privateKey = privKey ;
38- this .publicKey = pubKey ;
22+ this .privateKey = privateKey ;
23+ this .publicKey = publicKey ;
3924 }
4025
4126 Ed25519KeyPair (SecureRandom rng ) {
42- byte [] b = new byte [BUFFER_SIZE ];
43- rng .nextBytes (b );
4427
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 ) );
4730
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 ();
6234
63- public static Signature getSignature () throws NoSuchAlgorithmException {
64- return new EdDSAEngine ( MessageDigest . getInstance ( ED_25519 . getHashAlgorithm ())) ;
35+ this . privateKey = privateKey ;
36+ this . publicKey = publicKey ;
6537 }
6638
6739 @ 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 ();
7445 }
7546
7647 @ Override
7748 public byte [] toBytes () {
78- return privateKey .getSeed ();
49+ return privateKey .getEncoded ();
7950 }
8051
8152 @ Override
@@ -85,6 +56,6 @@ public String toHex() {
8556
8657 @ Override
8758 public PublicKey getPublicKey () {
88- return new PublicKey ( Schema . PublicKey . Algorithm . Ed25519 , this .publicKey );
59+ return new Ed25519PublicKey ( this .publicKey );
8960 }
9061}
0 commit comments