Skip to content

Commit 962a1cb

Browse files
committed
feat: Support for BLS keys.
1 parent 651f67d commit 962a1cb

File tree

5 files changed

+143
-3
lines changed

5 files changed

+143
-3
lines changed

src/main/java/com/danubetech/keyformats/JWK_to_PrivateKey.java

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.security.interfaces.RSAPrivateKey;
44

5+
import com.danubetech.keyformats.curves.Curves;
56
import org.bitcoinj.core.ECKey;
67

78
import com.danubetech.keyformats.keytypes.KeyType_for_JWK;
@@ -22,6 +23,10 @@ public static Object JWK_to_anyPrivateKey(JWK jsonWebKey) throws JOSEException {
2223
return JWK_to_RSAPrivateKey(jsonWebKey);
2324
else if (Curve.SECP256K1.getName().equals(keyType))
2425
return JWK_to_secp256k1PrivateKey(jsonWebKey);
26+
else if (Curves.BLS12381_G1.equals(keyType))
27+
return JWK_to_BLS12381_G1PrivateKey(jsonWebKey);
28+
else if (Curves.BLS12381_G2.equals(keyType))
29+
return JWK_to_BLS12381_G2PrivateKey(jsonWebKey);
2530
else if (Curve.Ed25519.getName().equals(keyType))
2631
return JWK_to_Ed25519PrivateKeyBytes(jsonWebKey);
2732
else if (Curve.X25519.getName().equals(keyType))
@@ -54,6 +59,40 @@ public static byte[] JWK_to_secp256k1PrivateKeyBytes(JWK jsonWebKey) throws JOSE
5459
return ecKey.getD().decode();
5560
}
5661

62+
public static ECKey JWK_to_BLS12381_G1PrivateKey(JWK jsonWebKey) throws JOSEException {
63+
64+
byte[] privateKeyBytes = JWK_to_BLS12381_G1PrivateKeyBytes(jsonWebKey);
65+
66+
return ECKey.fromPrivate(privateKeyBytes);
67+
}
68+
69+
public static byte[] JWK_to_BLS12381_G1PrivateKeyBytes(JWK jsonWebKey) throws JOSEException {
70+
71+
if (! KeyType.EC.equals(jsonWebKey.getKeyType())) throw new IllegalArgumentException("Incorrect key type: " + jsonWebKey.getKeyType());
72+
73+
com.nimbusds.jose.jwk.ECKey ecKey = (com.nimbusds.jose.jwk.ECKey) jsonWebKey;
74+
if (! Curves.BLS12381_G1.equals(ecKey.getCurve())) throw new IllegalArgumentException("Incorrect curve: " + ecKey.getCurve());
75+
76+
return ecKey.getD().decode();
77+
}
78+
79+
public static ECKey JWK_to_BLS12381_G2PrivateKey(JWK jsonWebKey) throws JOSEException {
80+
81+
byte[] privateKeyBytes = JWK_to_BLS12381_G2PrivateKeyBytes(jsonWebKey);
82+
83+
return ECKey.fromPrivate(privateKeyBytes);
84+
}
85+
86+
public static byte[] JWK_to_BLS12381_G2PrivateKeyBytes(JWK jsonWebKey) throws JOSEException {
87+
88+
if (! KeyType.EC.equals(jsonWebKey.getKeyType())) throw new IllegalArgumentException("Incorrect key type: " + jsonWebKey.getKeyType());
89+
90+
com.nimbusds.jose.jwk.ECKey ecKey = (com.nimbusds.jose.jwk.ECKey) jsonWebKey;
91+
if (! Curves.BLS12381_G2.equals(ecKey.getCurve())) throw new IllegalArgumentException("Incorrect curve: " + ecKey.getCurve());
92+
93+
return ecKey.getD().decode();
94+
}
95+
5796
public static byte[] JWK_to_Ed25519PrivateKeyBytes(JWK jsonWebKey) {
5897

5998
if (! KeyType.OKP.equals(jsonWebKey.getKeyType())) throw new IllegalArgumentException("Incorrect key type: " + jsonWebKey.getKeyType());

src/main/java/com/danubetech/keyformats/PrivateKey_to_JWK.java

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import java.security.interfaces.RSAPublicKey;
55
import java.util.Arrays;
66

7+
import com.danubetech.keyformats.curves.Curves;
78
import org.bitcoinj.core.ECKey;
89
import org.bouncycastle.math.ec.ECPoint;
910

@@ -48,6 +49,54 @@ public static com.nimbusds.jose.jwk.ECKey secp256k1PrivateKeyBytes_to_JWK(byte[]
4849
return secp256k1PrivateKey_to_JWK(privateKey, kid, use);
4950
}
5051

52+
public static com.nimbusds.jose.jwk.ECKey BLS12381_G1PrivateKey_to_JWK(ECKey privateKey, String kid, String use) {
53+
54+
ECPoint publicKeyPoint = privateKey.getPubKeyPoint();
55+
byte[] privateKeyBytes = privateKey.getPrivKeyBytes();
56+
Base64URL xParameter = Base64URL.encode(publicKeyPoint.getAffineXCoord().getEncoded());
57+
Base64URL yParameter = Base64URL.encode(publicKeyPoint.getAffineYCoord().getEncoded());
58+
Base64URL dParameter = Base64URL.encode(privateKeyBytes);
59+
60+
com.nimbusds.jose.jwk.ECKey jsonWebKey = new com.nimbusds.jose.jwk.ECKey.Builder(Curves.BLS12381_G1, xParameter, yParameter)
61+
.d(dParameter)
62+
.keyID(kid)
63+
.keyUse(use == null ? null : new KeyUse(use))
64+
.build();
65+
66+
return jsonWebKey;
67+
}
68+
69+
public static com.nimbusds.jose.jwk.ECKey BLS12381_G1PrivateKeyBytes_to_JWK(byte[] privateKeyBytes, String kid, String use) {
70+
71+
ECKey privateKey = ECKey.fromPrivate(privateKeyBytes);
72+
73+
return secp256k1PrivateKey_to_JWK(privateKey, kid, use);
74+
}
75+
76+
public static com.nimbusds.jose.jwk.ECKey BLS12381_G2PrivateKey_to_JWK(ECKey privateKey, String kid, String use) {
77+
78+
ECPoint publicKeyPoint = privateKey.getPubKeyPoint();
79+
byte[] privateKeyBytes = privateKey.getPrivKeyBytes();
80+
Base64URL xParameter = Base64URL.encode(publicKeyPoint.getAffineXCoord().getEncoded());
81+
Base64URL yParameter = Base64URL.encode(publicKeyPoint.getAffineYCoord().getEncoded());
82+
Base64URL dParameter = Base64URL.encode(privateKeyBytes);
83+
84+
com.nimbusds.jose.jwk.ECKey jsonWebKey = new com.nimbusds.jose.jwk.ECKey.Builder(Curves.BLS12381_G2, xParameter, yParameter)
85+
.d(dParameter)
86+
.keyID(kid)
87+
.keyUse(use == null ? null : new KeyUse(use))
88+
.build();
89+
90+
return jsonWebKey;
91+
}
92+
93+
public static com.nimbusds.jose.jwk.ECKey BLS12381_G2PrivateKeyBytes_to_JWK(byte[] privateKeyBytes, String kid, String use) {
94+
95+
ECKey privateKey = ECKey.fromPrivate(privateKeyBytes);
96+
97+
return secp256k1PrivateKey_to_JWK(privateKey, kid, use);
98+
}
99+
51100
public static com.nimbusds.jose.jwk.OctetKeyPair Ed25519PrivateKeyBytes_to_JWK(byte[] privateKeyBytes, byte[] publicKeyBytes, String kid, String use) {
52101

53102
byte[] onlyPrivateKeyBytes = Arrays.copyOf(privateKeyBytes, 32);

src/main/java/com/danubetech/keyformats/PublicKey_to_JWK.java

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.security.interfaces.RSAPublicKey;
44

5+
import com.danubetech.keyformats.curves.Curves;
56
import org.bitcoinj.core.ECKey;
67
import org.bouncycastle.math.ec.ECPoint;
78

@@ -43,6 +44,48 @@ public static JWK secp256k1PublicKeyBytes_to_JWK(byte[] publicKeyBytes, String k
4344
return secp256k1PublicKey_to_JWK(publicKey, kid, use);
4445
}
4546

47+
public static JWK BLS12381_G1PublicKey_to_JWK(ECKey publicKey, String kid, String use) {
48+
49+
ECPoint publicKeyPoint = publicKey.getPubKeyPoint();
50+
Base64URL xParameter = Base64URL.encode(publicKeyPoint.getAffineXCoord().getEncoded());
51+
Base64URL yParameter = Base64URL.encode(publicKeyPoint.getAffineYCoord().getEncoded());
52+
53+
JWK jsonWebKey = new com.nimbusds.jose.jwk.ECKey.Builder(Curves.BLS12381_G1, xParameter, yParameter)
54+
.keyID(kid)
55+
.keyUse(use == null ? null : new KeyUse(use))
56+
.build();
57+
58+
return jsonWebKey;
59+
}
60+
61+
public static JWK BLS12381_G1PublicKeyBytes_to_JWK(byte[] publicKeyBytes, String kid, String use) {
62+
63+
ECKey publicKey = ECKey.fromPublicOnly(publicKeyBytes);
64+
65+
return BLS12381_G1PublicKey_to_JWK(publicKey, kid, use);
66+
}
67+
68+
public static JWK BLS12381_G2PublicKey_to_JWK(ECKey publicKey, String kid, String use) {
69+
70+
ECPoint publicKeyPoint = publicKey.getPubKeyPoint();
71+
Base64URL xParameter = Base64URL.encode(publicKeyPoint.getAffineXCoord().getEncoded());
72+
Base64URL yParameter = Base64URL.encode(publicKeyPoint.getAffineYCoord().getEncoded());
73+
74+
JWK jsonWebKey = new com.nimbusds.jose.jwk.ECKey.Builder(Curves.BLS12381_G2, xParameter, yParameter)
75+
.keyID(kid)
76+
.keyUse(use == null ? null : new KeyUse(use))
77+
.build();
78+
79+
return jsonWebKey;
80+
}
81+
82+
public static JWK BLS12381_G2PublicKeyBytes_to_JWK(byte[] publicKeyBytes, String kid, String use) {
83+
84+
ECKey publicKey = ECKey.fromPublicOnly(publicKeyBytes);
85+
86+
return BLS12381_G2PublicKey_to_JWK(publicKey, kid, use);
87+
}
88+
4689
public static JWK Ed25519PublicKeyBytes_to_JWK(byte[] publicKeyBytes, String kid, String use) {
4790

4891
Base64URL xParameter = Base64URL.encode(publicKeyBytes);
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.danubetech.keyformats.curves;
2+
3+
import com.nimbusds.jose.jwk.Curve;
4+
5+
public class Curves {
6+
7+
public static final Curve BLS12381_G1 = new Curve("BLS12381_G1", "BLS12381_G1", null);
8+
public static final Curve BLS12381_G2 = new Curve("BLS12381_G2", "BLS12381_G2", null);
9+
}

src/main/java/com/danubetech/keyformats/keytypes/KeyType_for_JWK.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@ public class KeyType_for_JWK {
1010
public static String keyType_for_JWK(JWK jsonWebKey) {
1111

1212
if (KeyType.RSA.equals(jsonWebKey.getKeyType()))
13-
return jsonWebKey.getKeyType().getValue();
13+
return jsonWebKey.getKeyType().getValue(); // "RSA"
1414
else if (KeyType.EC.equals(jsonWebKey.getKeyType()))
15-
return ((ECKey) jsonWebKey).getCurve().getName();
15+
return ((ECKey) jsonWebKey).getCurve().getName(); // "secp256k1", "BLS12381_G1", "BLS12381_G2"
1616
else if (KeyType.OKP.equals(jsonWebKey.getKeyType()))
17-
return ((OctetKeyPair) jsonWebKey).getCurve().getName();
17+
return ((OctetKeyPair) jsonWebKey).getCurve().getName(); // "Ed25519", "X25519"
1818
else
1919
throw new IllegalArgumentException("Unsupported key type " + jsonWebKey.getKeyType());
2020
}

0 commit comments

Comments
 (0)