Skip to content

Commit 97273a0

Browse files
committed
parse ed25519 raw keys
Signed-off-by: Appu Goundan <[email protected]>
1 parent cfefd91 commit 97273a0

File tree

2 files changed

+40
-1
lines changed

2 files changed

+40
-1
lines changed

sigstore-java/src/main/java/dev/sigstore/encryption/Keys.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434
import java.util.List;
3535
import org.bouncycastle.asn1.ASN1Integer;
3636
import org.bouncycastle.asn1.ASN1Sequence;
37+
import org.bouncycastle.asn1.edec.EdECObjectIdentifiers;
38+
import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
3739
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
3840
import org.bouncycastle.jce.ECNamedCurveTable;
3941
import org.bouncycastle.jce.provider.BouncyCastleProvider;
@@ -137,9 +139,24 @@ public static PublicKey constructTufPublicKey(byte[] contents, String scheme)
137139
case "ed25519":
138140
{
139141
final KeyFactory kf = KeyFactory.getInstance("Ed25519");
140-
final X509EncodedKeySpec keySpec = new X509EncodedKeySpec(contents);
142+
X509EncodedKeySpec keySpec;
143+
// tuf allows raw keys only for ed25519 (non PEM):
144+
// https://github.com/theupdateframework/specification/blob/c51875f445d8a57efca9dadfbd5dbdece06d87e6/tuf-spec.md#key-objects--file-formats-keys
145+
if (contents.length == 32) {
146+
var params =
147+
new SubjectPublicKeyInfo(
148+
new AlgorithmIdentifier(EdECObjectIdentifiers.id_Ed25519), contents);
149+
try {
150+
keySpec = new X509EncodedKeySpec(params.getEncoded());
151+
} catch (IOException e) {
152+
throw new RuntimeException(e);
153+
}
154+
} else {
155+
keySpec = new X509EncodedKeySpec(contents);
156+
}
141157
return kf.generatePublic(keySpec);
142158
}
159+
case "ecdsa":
143160
case "ecdsa-sha2-nistp256":
144161
{
145162
// spec for P-256 curve

sigstore-java/src/test/java/dev/sigstore/encryption/KeysTest.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,28 @@ void parseTufPublicKey_ed25519_lteJava14()
163163
assertEquals("Ed25519", key.getAlgorithm());
164164
}
165165

166+
@Test
167+
@EnabledForJreRange(min = JRE.JAVA_15)
168+
void parseTufPublicKey_ed25519_rawBytes_java15plus() throws Exception {
169+
PublicKey key =
170+
Keys.constructTufPublicKey(
171+
Hex.decode("2d7218ce609f85de4b0d29d9e679cfd73e96756652f7069a0cf00acb752e5d3c"),
172+
"ed25519");
173+
assertNotNull(key);
174+
assertEquals("EdDSA", key.getAlgorithm());
175+
}
176+
177+
@Test
178+
@EnabledForJreRange(max = JRE.JAVA_14)
179+
void parseTufPublicKey_ed25519_rawBytes_lteJava14() throws Exception {
180+
PublicKey key =
181+
Keys.constructTufPublicKey(
182+
Hex.decode("2d7218ce609f85de4b0d29d9e679cfd73e96756652f7069a0cf00acb752e5d3c"),
183+
"ed25519");
184+
assertNotNull(key);
185+
assertEquals("Ed25519", key.getAlgorithm());
186+
}
187+
166188
@Test
167189
void parseTufPublicKey_ed25519Bad() {
168190
Assertions.assertThrows(

0 commit comments

Comments
 (0)