Skip to content

Commit 4f70621

Browse files
committed
Add support for RS384 and RS512
1 parent b682288 commit 4f70621

File tree

9 files changed

+197
-5
lines changed

9 files changed

+197
-5
lines changed

NEWS

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
1-
== Version 2.3.1 (unreleased) ==
1+
== Version 2.4.0 (unreleased) ==
22

33
`webauthn-server-core`:
44

5+
New features:
6+
7+
* Added support for RS384 and RS512 signature algorithms.
8+
** Thanks to GitHub user JohnnyJayJay for the contribution, see
9+
https://github.com/Yubico/java-webauthn-server/pull/235
10+
511
Fixes:
612

713
* During `RelyingParty.finishRegistration()` if an `attestationTrustSource` is

webauthn-server-core/src/main/java/com/yubico/webauthn/RelyingParty.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,8 @@ public class RelyingParty {
218218
* <li>{@link com.yubico.webauthn.data.PublicKeyCredentialParameters#ES256 ES384}
219219
* <li>{@link com.yubico.webauthn.data.PublicKeyCredentialParameters#ES256 ES512}
220220
* <li>{@link com.yubico.webauthn.data.PublicKeyCredentialParameters#RS256 RS256}
221+
* <li>{@link com.yubico.webauthn.data.PublicKeyCredentialParameters#RS384 RS384}
222+
* <li>{@link com.yubico.webauthn.data.PublicKeyCredentialParameters#RS512 RS512}
221223
* </ol>
222224
*
223225
* @see PublicKeyCredentialCreationOptions#getAttestation()
@@ -232,7 +234,9 @@ public class RelyingParty {
232234
PublicKeyCredentialParameters.EdDSA,
233235
PublicKeyCredentialParameters.ES384,
234236
PublicKeyCredentialParameters.ES512,
235-
PublicKeyCredentialParameters.RS256));
237+
PublicKeyCredentialParameters.RS256,
238+
PublicKeyCredentialParameters.RS384,
239+
PublicKeyCredentialParameters.RS512));
236240

237241
/**
238242
* If <code>true</code>, the origin matching rule is relaxed to allow any port number.
@@ -427,6 +431,8 @@ private static List<PublicKeyCredentialParameters> filterAvailableAlgorithms(
427431
break;
428432

429433
case RS256:
434+
case RS384:
435+
case RS512:
430436
case RS1:
431437
KeyFactory.getInstance("RSA");
432438
break;

webauthn-server-core/src/main/java/com/yubico/webauthn/TpmAttestationStatementVerifier.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,10 +217,12 @@ private void validateCertInfo(
217217
break;
218218

219219
case ES384:
220+
case RS384:
220221
expectedExtraData = Crypto.sha384(attToBeSigned);
221222
break;
222223

223224
case ES512:
225+
case RS512:
224226
expectedExtraData = Crypto.sha512(attToBeSigned);
225227
break;
226228

webauthn-server-core/src/main/java/com/yubico/webauthn/data/PublicKeyCredentialCreationOptions.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,8 @@ private static List<PublicKeyCredentialParameters> filterAvailableAlgorithms(
382382
break;
383383

384384
case RS256:
385+
case RS384:
386+
case RS512:
385387
case RS1:
386388
KeyFactory.getInstance("RSA");
387389
break;
@@ -419,6 +421,14 @@ private static List<PublicKeyCredentialParameters> filterAvailableAlgorithms(
419421
Signature.getInstance("SHA256withRSA");
420422
break;
421423

424+
case RS384:
425+
Signature.getInstance("SHA384withRSA");
426+
break;
427+
428+
case RS512:
429+
Signature.getInstance("SHA512withRSA");
430+
break;
431+
422432
case RS1:
423433
Signature.getInstance("SHA1withRSA");
424434
break;

webauthn-server-core/src/main/java/com/yubico/webauthn/data/PublicKeyCredentialParameters.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,20 @@ private PublicKeyCredentialParameters(
100100
public static final PublicKeyCredentialParameters RS256 =
101101
builder().alg(COSEAlgorithmIdentifier.RS256).build();
102102

103+
/**
104+
* Algorithm {@link COSEAlgorithmIdentifier#RS384} and type {@link
105+
* PublicKeyCredentialType#PUBLIC_KEY}.
106+
*/
107+
public static final PublicKeyCredentialParameters RS384 =
108+
builder().alg(COSEAlgorithmIdentifier.RS384).build();
109+
110+
/**
111+
* Algorithm {@link COSEAlgorithmIdentifier#RS512} and type {@link
112+
* PublicKeyCredentialType#PUBLIC_KEY}.
113+
*/
114+
public static final PublicKeyCredentialParameters RS512 =
115+
builder().alg(COSEAlgorithmIdentifier.RS512).build();
116+
103117
public static PublicKeyCredentialParametersBuilder.MandatoryStages builder() {
104118
return new PublicKeyCredentialParametersBuilder.MandatoryStages();
105119
}

webauthn-server-core/src/test/scala/com/yubico/webauthn/RegistrationTestData.scala

Lines changed: 128 additions & 0 deletions
Large diffs are not rendered by default.

webauthn-server-core/src/test/scala/com/yubico/webauthn/RelyingPartyRegistrationSpec.scala

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4182,6 +4182,24 @@ class RelyingPartyRegistrationSpec
41824182
COSEAlgorithmIdentifier.RS256
41834183
)
41844184
}
4185+
4186+
it("RS384.") {
4187+
pubKeyCredParams should contain(
4188+
PublicKeyCredentialParameters.RS384
4189+
)
4190+
pubKeyCredParams map (_.getAlg) should contain(
4191+
COSEAlgorithmIdentifier.RS384
4192+
)
4193+
}
4194+
4195+
it("RS512.") {
4196+
pubKeyCredParams should contain(
4197+
PublicKeyCredentialParameters.RS512
4198+
)
4199+
pubKeyCredParams map (_.getAlg) should contain(
4200+
COSEAlgorithmIdentifier.RS512
4201+
)
4202+
}
41854203
}
41864204

41874205
describe("do not include") {

webauthn-server-core/src/test/scala/com/yubico/webauthn/TestAuthenticator.scala

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -909,6 +909,10 @@ object TestAuthenticator {
909909
(TpmAlgHash.SHA512, TpmAlgAsym.ECC)
910910
case COSEAlgorithmIdentifier.RS256 =>
911911
(TpmAlgHash.SHA256, TpmAlgAsym.RSA)
912+
case COSEAlgorithmIdentifier.RS384 =>
913+
(TpmAlgHash.SHA384, TpmAlgAsym.RSA)
914+
case COSEAlgorithmIdentifier.RS512 =>
915+
(TpmAlgHash.SHA512, TpmAlgAsym.RSA)
912916
case COSEAlgorithmIdentifier.RS1 => (TpmAlgHash.SHA1, TpmAlgAsym.RSA)
913917
case COSEAlgorithmIdentifier.EdDSA => ???
914918
}
@@ -964,6 +968,8 @@ object TestAuthenticator {
964968
case COSEAlgorithmIdentifier.ES512 => 0x0005
965969
case COSEAlgorithmIdentifier.RS1 |
966970
COSEAlgorithmIdentifier.RS256 |
971+
COSEAlgorithmIdentifier.RS384 |
972+
COSEAlgorithmIdentifier.RS512 |
967973
COSEAlgorithmIdentifier.EdDSA =>
968974
???
969975
}))
@@ -1115,8 +1121,9 @@ object TestAuthenticator {
11151121
case COSEAlgorithmIdentifier.ES256 => generateEcKeypair("secp256r1")
11161122
case COSEAlgorithmIdentifier.ES384 => generateEcKeypair("secp384r1")
11171123
case COSEAlgorithmIdentifier.ES512 => generateEcKeypair("secp521r1")
1118-
case COSEAlgorithmIdentifier.RS256 => generateRsaKeypair()
1119-
case COSEAlgorithmIdentifier.RS1 => generateRsaKeypair()
1124+
case COSEAlgorithmIdentifier.RS256 | COSEAlgorithmIdentifier.RS384 |
1125+
COSEAlgorithmIdentifier.RS512 | COSEAlgorithmIdentifier.RS1 =>
1126+
generateRsaKeypair()
11201127
}
11211128

11221129
def generateEcKeypair(curve: String = "secp256r1"): KeyPair = {

webauthn-server-core/src/test/scala/com/yubico/webauthn/WebAuthnTestCodecs.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,8 @@ object WebAuthnTestCodecs {
5151
val spec = new PKCS8EncodedKeySpec(encodedKey.getBytes)
5252
keyFactory.generatePrivate(spec)
5353

54-
case COSEAlgorithmIdentifier.RS256 | COSEAlgorithmIdentifier.RS1 =>
54+
case COSEAlgorithmIdentifier.RS256 | COSEAlgorithmIdentifier.RS384 |
55+
COSEAlgorithmIdentifier.RS512 | COSEAlgorithmIdentifier.RS1 =>
5556
val keyFactory: KeyFactory = KeyFactory.getInstance("RSA")
5657
val spec = new PKCS8EncodedKeySpec(encodedKey.getBytes)
5758
keyFactory.generatePrivate(spec)

0 commit comments

Comments
 (0)