3131import java .io .IOException ;
3232import java .io .Reader ;
3333import java .io .StringReader ;
34+ import java .io .StringWriter ;
3435import java .security .InvalidAlgorithmParameterException ;
3536import java .security .KeyPair ;
3637import java .security .KeyPairGenerator ;
4041import java .security .SignatureException ;
4142import java .security .spec .ECGenParameterSpec ;
4243import java .util .stream .Stream ;
44+ import org .bouncycastle .asn1 .ASN1Object ;
45+ import org .bouncycastle .asn1 .ASN1Sequence ;
46+ import org .bouncycastle .asn1 .pkcs .PrivateKeyInfo ;
4347import org .bouncycastle .jce .provider .BouncyCastleProvider ;
4448import org .bouncycastle .openssl .PEMParser ;
4549import org .bouncycastle .openssl .jcajce .JcaPEMKeyConverter ;
50+ import org .bouncycastle .util .io .pem .PemObject ;
51+ import org .bouncycastle .util .io .pem .PemWriter ;
4652import org .junit .jupiter .api .Assertions ;
4753import org .junit .jupiter .api .Test ;
4854import org .junit .jupiter .params .ParameterizedTest ;
@@ -65,6 +71,17 @@ public static KeyPair readEC(String pem) throws IOException {
6571 return new JcaPEMKeyConverter ().getKeyPair ((org .bouncycastle .openssl .PEMKeyPair ) parsed );
6672 }
6773
74+ public static String writeToPEM (java .security .PrivateKey privateKey ) throws IOException {
75+ var writer = new StringWriter ();
76+ try (var pemWriter = new PemWriter (writer )) {
77+ var pki = PrivateKeyInfo .getInstance (ASN1Sequence .getInstance (privateKey .getEncoded ()));
78+ ASN1Object asn = (ASN1Object ) pki .parsePrivateKey ();
79+ pemWriter .writeObject (new PemObject ("EC PRIVATE KEY" , asn .getEncoded ("DER" )));
80+ pemWriter .flush ();
81+ return writer .toString ();
82+ }
83+ }
84+
6885 @ ParameterizedTest
6986 @ MethodSource ("testVectors" )
7087 void signTestVectors (
@@ -111,8 +128,22 @@ void normalUsage()
111128 generator .initialize (spec );
112129 var expectedPayload = "test message" ;
113130 var keyPair = generator .generateKeyPair ();
131+
114132 var signedMessage = Paseto .sign (new PrivateKey (keyPair .getPrivate (), V3 ), expectedPayload );
133+ var payload =
134+ Paseto .parse (new org .paseto4j .commons .PublicKey (keyPair .getPublic (), V3 ), signedMessage );
115135
136+ Assertions .assertEquals (expectedPayload , payload );
137+ }
138+
139+ @ Test
140+ void signingWhereASNPartsShouldBePadded () throws IOException , SignatureException {
141+ var pem =
142+ "-----BEGIN EC PRIVATE KEY-----\n MIGkAgEBBDBKvAg41dsJ64e+CY5Ona1PdhkHtDXZawacdj4fcUQVqR2hy19NML7S\n WpHchEsBzCegBwYFK4EEACKhZANiAARnuVQrWJkAJ7tBA9HkSvgpyn6haQQHZ4a2\n KqJwZ6LwVujOpP4gOPaIrL0fGDR2zQSZMaggHfYemqordD9nq9oPzBwVI+KZ8Rnq\n l35zsijbS3D6g5tN1cfcxtmB9c/2KVs=\n -----END EC PRIVATE KEY-----" ;
143+ var keyPair = readEC (pem );
144+ var expectedPayload = "test message" ;
145+
146+ var signedMessage = Paseto .sign (new PrivateKey (keyPair .getPrivate (), V3 ), expectedPayload );
116147 var payload =
117148 Paseto .parse (new org .paseto4j .commons .PublicKey (keyPair .getPublic (), V3 ), signedMessage );
118149
0 commit comments