Skip to content

Commit cf7e5ef

Browse files
author
zihluwang
committed
test: tested loading ECDSA key pair from text
1 parent 5f9ea34 commit cf7e5ef

File tree

7 files changed

+105
-11
lines changed

7 files changed

+105
-11
lines changed

key-pair-loader/README.md

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
# KeyLoader
2+
3+
KeyLoader provides utility methods to load keys from pem-formatted key texts.
4+
5+
## ECDSA-based algorithm
6+
7+
### Generate key pair
8+
9+
#### Generate private key
10+
11+
Generate a private key by `genpkey` command provided by OpenSSL:
12+
13+
```shell
14+
openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out ec_private_key.pem
15+
```
16+
17+
The output of this command is a file called `ec_private_key.pem` and its content looks like the
18+
following:
19+
20+
```text
21+
-----BEGIN PRIVATE KEY-----
22+
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgs79JlARgXEf6EDV7
23+
+PHQCTHEMtqIoHOy1GZ1+ynQJ6yhRANCAARkA7GRY2i4gg8qx0XViAXUP9cPw9pn
24+
Jg1wfrQ41FaMyqVBejNYxvaLtamErF/ySimnjafMJ+VZCh34lBj6Ez8R
25+
-----END PRIVATE KEY-----
26+
```
27+
28+
#### Generate public key by private key
29+
30+
Export public key from private key with `ec` command provided by OpenSSL:
31+
32+
```shell
33+
openssl ec -in ec_private_key.pem -pubout -out ec_public_key.pem
34+
```
35+
36+
The output of this command is a file called `ec_public_key.pem` and its content looks like the
37+
following:
38+
39+
```text
40+
-----BEGIN PUBLIC KEY-----
41+
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEZAOxkWNouIIPKsdF1YgF1D/XD8Pa
42+
ZyYNcH60ONRWjMqlQXozWMb2i7WphKxf8kopp42nzCflWQod+JQY+hM/EQ==
43+
-----END PUBLIC KEY-----
44+
```
45+
46+
#### Convert private key to EC formats which could be acceptable by Java
47+
48+
Java's `PKCS8EncodedKeySpec` requires the private key to be in PKCS#8 format, while OpenSSL by
49+
default generates private keys in traditional PEM format. To convert the private key, run the
50+
following command:
51+
52+
```shell
53+
openssl pkcs8 -topk8 -inform PEM -outform PEM -in ec_private_key.pem -out ec_private_key_pkcs8.pem -nocrypt
54+
```
55+
56+
The converted private key will look like this:
57+
58+
```text
59+
-----BEGIN PRIVATE KEY-----
60+
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgs79JlARgXEf6EDV7
61+
+PHQCTHEMtqIoHOy1GZ1+ynQJ6yhRANCAARkA7GRY2i4gg8qx0XViAXUP9cPw9pn
62+
Jg1wfrQ41FaMyqVBejNYxvaLtamErF/ySimnjafMJ+VZCh34lBj6Ez8R
63+
-----END PRIVATE KEY-----
64+
```

key-pair-loader/src/main/java/com/onixbyte/security/impl/EcKeyLoader.java

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,13 @@ public class EcKeyLoader implements KeyLoader {
5555

5656
/**
5757
* Initialise a key loader for EC-based algorithms.
58-
*
59-
* @throws NoSuchAlgorithmException if no {@code Provider} supports a {@code KeyFactorySpi}
60-
* implementation for the specified algorithm
6158
*/
62-
public EcKeyLoader() throws NoSuchAlgorithmException {
63-
this.keyFactory = KeyFactory.getInstance("EC");
59+
public EcKeyLoader() {
60+
try {
61+
this.keyFactory = KeyFactory.getInstance("EC");
62+
} catch (NoSuchAlgorithmException e) {
63+
throw new KeyLoadingException(e);
64+
}
6465
}
6566

6667
/**
@@ -76,8 +77,8 @@ public ECPrivateKey loadPrivateKey(String pemKeyText) {
7677
try {
7778
// remove all unnecessary parts of the pem key text
7879
pemKeyText = pemKeyText
79-
.replaceAll("-----BEGIN EC PRIVATE KEY-----", "")
80-
.replaceAll("-----END EC PRIVATE KEY-----", "")
80+
.replaceAll("-----BEGIN (EC )?PRIVATE KEY-----", "")
81+
.replaceAll("-----END (EC )?PRIVATE KEY-----", "")
8182
.replaceAll("\n", "");
8283
var decodedKeyString = Base64.getDecoder().decode(pemKeyText);
8384
var keySpec = new PKCS8EncodedKeySpec(decodedKeyString);
@@ -106,16 +107,16 @@ public ECPublicKey loadPublicKey(String pemKeyText) {
106107
try {
107108
// remove all unnecessary parts of the pem key text
108109
pemKeyText = pemKeyText
109-
.replaceAll("-----BEGIN EC PUBLIC KEY-----", "")
110-
.replaceAll("-----END EC PUBLIC KEY-----", "")
110+
.replaceAll("-----BEGIN (EC )?PUBLIC KEY-----", "")
111+
.replaceAll("-----END (EC )?PUBLIC KEY-----", "")
111112
.replaceAll("\n", "");
112113
var keyBytes = Base64.getDecoder().decode(pemKeyText);
113114
var spec = new X509EncodedKeySpec(keyBytes);
114115
var key = keyFactory.generatePublic(spec);
115116
if (key instanceof ECPublicKey publicKey) {
116117
return publicKey;
117118
} else {
118-
throw new KeyLoadingException("Unable to load private key from pem-formatted key text.");
119+
throw new KeyLoadingException("Unable to load public key from pem-formatted key text.");
119120
}
120121
} catch (InvalidKeySpecException e) {
121122
throw new KeyLoadingException("Key spec is invalid.", e);

key-pair-loader/src/test/java/com/onixbyte/security/KeyPairLoaderTest.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,27 @@
1717

1818
package com.onixbyte.security;
1919

20+
import com.onixbyte.security.impl.EcKeyLoader;
2021
import org.junit.jupiter.api.Test;
2122

2223
public class KeyPairLoaderTest {
2324

2425
@Test
2526
public void test() {
26-
27+
var keyLoader = new EcKeyLoader();
28+
var privateKey = keyLoader.loadPrivateKey("""
29+
-----BEGIN PRIVATE KEY-----
30+
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgs79JlARgXEf6EDV7
31+
+PHQCTHEMtqIoHOy1GZ1+ynQJ6yhRANCAARkA7GRY2i4gg8qx0XViAXUP9cPw9pn
32+
Jg1wfrQ41FaMyqVBejNYxvaLtamErF/ySimnjafMJ+VZCh34lBj6Ez8R
33+
-----END PRIVATE KEY-----
34+
""");
35+
var publicKey = keyLoader.loadPublicKey("""
36+
-----BEGIN PUBLIC KEY-----
37+
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEZAOxkWNouIIPKsdF1YgF1D/XD8Pa
38+
ZyYNcH60ONRWjMqlQXozWMb2i7WphKxf8kopp42nzCflWQod+JQY+hM/EQ==
39+
-----END PUBLIC KEY-----
40+
""");
2741
}
2842

2943
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
-----BEGIN PRIVATE KEY-----
2+
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgs79JlARgXEf6EDV7
3+
+PHQCTHEMtqIoHOy1GZ1+ynQJ6yhRANCAARkA7GRY2i4gg8qx0XViAXUP9cPw9pn
4+
Jg1wfrQ41FaMyqVBejNYxvaLtamErF/ySimnjafMJ+VZCh34lBj6Ez8R
5+
-----END PRIVATE KEY-----
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
-----BEGIN PRIVATE KEY-----
2+
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgs79JlARgXEf6EDV7
3+
+PHQCTHEMtqIoHOy1GZ1+ynQJ6yhRANCAARkA7GRY2i4gg8qx0XViAXUP9cPw9pn
4+
Jg1wfrQ41FaMyqVBejNYxvaLtamErF/ySimnjafMJ+VZCh34lBj6Ez8R
5+
-----END PRIVATE KEY-----
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
-----BEGIN PUBLIC KEY-----
2+
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEZAOxkWNouIIPKsdF1YgF1D/XD8Pa
3+
ZyYNcH60ONRWjMqlQXozWMb2i7WphKxf8kopp42nzCflWQod+JQY+hM/EQ==
4+
-----END PUBLIC KEY-----

simple-jwt-authzero/src/main/java/com/onixbyte/simplejwt/authzero/AuthzeroTokenResolver.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import org.slf4j.LoggerFactory;
4444

4545
import java.lang.reflect.InvocationTargetException;
46+
import java.security.NoSuchAlgorithmException;
4647
import java.security.interfaces.ECPrivateKey;
4748
import java.security.interfaces.ECPublicKey;
4849
import java.time.Duration;

0 commit comments

Comments
 (0)