Skip to content

Commit 73a9f94

Browse files
committed
update bouncycastle from deprecated bcprov-jdk16 to bcprov-jdk18on
add a basic test for the CertificateManager
1 parent 7dda791 commit 73a9f94

File tree

4 files changed

+187
-50
lines changed

4 files changed

+187
-50
lines changed

pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@
2525
</dependency>
2626
<dependency>
2727
<groupId>org.bouncycastle</groupId>
28-
<artifactId>bcprov-jdk16</artifactId>
29-
<version>1.46</version>
28+
<artifactId>bcprov-jdk18on</artifactId>
29+
<version>1.82</version>
3030
</dependency>
3131
<dependency>
3232
<groupId>org.slf4j</groupId>

src/main/java/org/kopi/ebics/certificate/CertificateManager.java

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -55,15 +55,13 @@ public CertificateManager(EbicsUser user) {
5555
* @throws IOException
5656
*/
5757
public void create() throws GeneralSecurityException, IOException {
58-
Calendar calendar;
58+
Calendar calendar = Calendar.getInstance();
59+
calendar.add(Calendar.DAY_OF_YEAR, X509Constants.DEFAULT_DURATION);
5960

60-
calendar = Calendar.getInstance();
61-
calendar.add(Calendar.DAY_OF_YEAR, X509Constants.DEFAULT_DURATION);
62-
63-
createA005Certificate(new Date(calendar.getTimeInMillis()));
64-
createX002Certificate(new Date(calendar.getTimeInMillis()));
65-
createE002Certificate(new Date(calendar.getTimeInMillis()));
66-
setUserCertificates();
61+
createA005Certificate(new Date(calendar.getTimeInMillis()));
62+
createX002Certificate(new Date(calendar.getTimeInMillis()));
63+
createE002Certificate(new Date(calendar.getTimeInMillis()));
64+
setUserCertificates();
6765
}
6866

6967
/**
@@ -86,19 +84,18 @@ private void setUserCertificates() {
8684
* @throws IOException
8785
*/
8886
public void createA005Certificate(Date end) throws GeneralSecurityException, IOException {
89-
KeyPair keypair;
87+
KeyPair keypair = KeyUtil.makeKeyPair(X509Constants.EBICS_KEY_SIZE);
88+
a005Certificate = generator.generateA005Certificate(keypair, user.getDN(), new Date(), end);
89+
a005PrivateKey = keypair.getPrivate();
90+
}
9091

91-
keypair = KeyUtil.makeKeyPair(X509Constants.EBICS_KEY_SIZE);
92-
a005Certificate = generator.generateA005Certificate(keypair,
93-
user.getDN(),
94-
new Date(),
95-
end);
96-
a005PrivateKey = keypair.getPrivate();
92+
X509Certificate getA005Certificate() {
93+
return a005Certificate;
9794
}
9895

9996
/**
10097
* Creates the authentication certificate.
101-
* @param end the expiration date of a the certificate.
98+
* @param end the expiration date of a certificate.
10299
* @throws GeneralSecurityException
103100
* @throws IOException
104101
*/

src/main/java/org/kopi/ebics/certificate/X509Generator.java

Lines changed: 15 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.bouncycastle.asn1.ASN1InputStream;
3636
import org.bouncycastle.asn1.ASN1Sequence;
3737
import org.bouncycastle.asn1.DERSequence;
38+
import org.bouncycastle.asn1.x500.X500Name;
3839
import org.bouncycastle.asn1.x509.AuthorityKeyIdentifier;
3940
import org.bouncycastle.asn1.x509.BasicConstraints;
4041
import org.bouncycastle.asn1.x509.ExtendedKeyUsage;
@@ -151,7 +152,6 @@ public X509Certificate generate(KeyPair keypair,
151152
X509V3CertificateGenerator generator;
152153
BigInteger serial;
153154
X509Certificate certificate;
154-
ASN1EncodableVector vector;
155155

156156
serial = BigInteger.valueOf(generateSerial());
157157
generator = new X509V3CertificateGenerator();
@@ -174,10 +174,10 @@ public X509Certificate generate(KeyPair keypair,
174174
getPublic(),
175175
issuer,
176176
serial));
177-
vector = new ASN1EncodableVector();
178-
vector.add(KeyPurposeId.id_kp_emailProtection);
179177

180-
generator.addExtension(X509Extensions.ExtendedKeyUsage, false, new ExtendedKeyUsage(new DERSequence(vector)));
178+
var purposeIds = new KeyPurposeId[] { KeyPurposeId.id_kp_emailProtection };
179+
180+
generator.addExtension(X509Extensions.ExtendedKeyUsage, false, new ExtendedKeyUsage(purposeIds));
181181

182182
switch (keyusage) {
183183
case X509Constants.SIGNATURE_KEY_USAGE:
@@ -208,23 +208,14 @@ public X509Certificate generate(KeyPair keypair,
208208
* @param issuer the certificate issuer
209209
* @param serial the certificate serial number
210210
* @return the authority key identifier of the public key
211-
* @throws IOException
212211
*/
213212
private AuthorityKeyIdentifier getAuthorityKeyIdentifier(PublicKey publicKey,
214213
String issuer,
215-
BigInteger serial)
216-
throws IOException
217-
{
218-
InputStream input;
219-
SubjectPublicKeyInfo keyInfo;
220-
ASN1EncodableVector vector;
221-
222-
input = new ByteArrayInputStream(publicKey.getEncoded());
223-
keyInfo = new SubjectPublicKeyInfo((ASN1Sequence)new ASN1InputStream(input).readObject());
224-
vector = new ASN1EncodableVector();
225-
vector.add(new GeneralName(new X509Name(issuer)));
226-
227-
return new AuthorityKeyIdentifier(keyInfo, new GeneralNames(new DERSequence(vector)), serial);
214+
BigInteger serial) {
215+
SubjectPublicKeyInfo keyInfo = SubjectPublicKeyInfo.getInstance(publicKey.getEncoded());
216+
X500Name issuerName = new X500Name(issuer);
217+
GeneralNames generalNames = new GeneralNames(new GeneralName(issuerName));
218+
return new AuthorityKeyIdentifier(keyInfo, generalNames, serial);
228219
}
229220

230221
/**
@@ -237,27 +228,19 @@ private AuthorityKeyIdentifier getAuthorityKeyIdentifier(PublicKey publicKey,
237228
private SubjectKeyIdentifier getSubjectKeyIdentifier(PublicKey publicKey)
238229
throws IOException
239230
{
240-
InputStream input;
241-
SubjectPublicKeyInfo keyInfo;
242-
243-
input = new ByteArrayInputStream(publicKey.getEncoded());
244-
keyInfo = new SubjectPublicKeyInfo((ASN1Sequence)new ASN1InputStream(input).readObject());
245-
246-
return new SubjectKeyIdentifier(keyInfo);
231+
SubjectPublicKeyInfo keyInfo = SubjectPublicKeyInfo.getInstance(publicKey.getEncoded());
232+
return new SubjectKeyIdentifier(keyInfo.getEncoded());
247233
}
248234

249235
/**
250-
* Generates a random serial number
236+
* Generates a serial number from current timestamp
251237
*
252238
* @return the serial number
253239
*/
254240
private long generateSerial() {
255-
Date now;
256-
257-
now = new Date();
258-
String sNow = sdfSerial.format(now);
259-
260-
return Long.valueOf(sNow).longValue();
241+
Date now = new Date();
242+
String sNow = sdfSerial.format(now);
243+
return Long.parseLong(sNow);
261244
}
262245

263246
// --------------------------------------------------------------------
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
package org.kopi.ebics.certificate;
2+
3+
import static org.junit.jupiter.api.Assertions.*;
4+
5+
import java.io.IOException;
6+
import java.security.GeneralSecurityException;
7+
import java.security.PrivateKey;
8+
import java.security.cert.X509Certificate;
9+
import java.security.interfaces.RSAPublicKey;
10+
import java.util.Calendar;
11+
import java.util.Date;
12+
13+
import javax.security.auth.x500.X500Principal;
14+
15+
import org.bouncycastle.jce.provider.BouncyCastleProvider;
16+
import org.junit.jupiter.api.Test;
17+
import org.kopi.ebics.client.User;
18+
import org.kopi.ebics.exception.EbicsException;
19+
import org.kopi.ebics.interfaces.EbicsPartner;
20+
import org.kopi.ebics.interfaces.EbicsUser;
21+
import org.kopi.ebics.interfaces.PasswordCallback;
22+
23+
class CertificateManagerTest {
24+
static {
25+
org.apache.xml.security.Init.init();
26+
java.security.Security.addProvider(new BouncyCastleProvider());
27+
}
28+
29+
@Test
30+
void createA005Certificate() throws GeneralSecurityException, IOException {
31+
var user = new EbicsUser() {
32+
@Override
33+
public RSAPublicKey getA005PublicKey() {
34+
return null;
35+
}
36+
37+
@Override
38+
public RSAPublicKey getE002PublicKey() {
39+
return null;
40+
}
41+
42+
@Override
43+
public RSAPublicKey getX002PublicKey() {
44+
return null;
45+
}
46+
47+
@Override
48+
public byte[] getA005Certificate() throws EbicsException {
49+
return new byte[0];
50+
}
51+
52+
@Override
53+
public byte[] getX002Certificate() throws EbicsException {
54+
return new byte[0];
55+
}
56+
57+
@Override
58+
public byte[] getE002Certificate() throws EbicsException {
59+
return new byte[0];
60+
}
61+
62+
@Override
63+
public void setA005Certificate(X509Certificate a005certificate) {
64+
65+
}
66+
67+
@Override
68+
public void setX002Certificate(X509Certificate x002certificate) {
69+
70+
}
71+
72+
@Override
73+
public void setE002Certificate(X509Certificate e002certificate) {
74+
75+
}
76+
77+
@Override
78+
public void setA005PrivateKey(PrivateKey a005Key) {
79+
80+
}
81+
82+
@Override
83+
public void setX002PrivateKey(PrivateKey x002Key) {
84+
85+
}
86+
87+
@Override
88+
public void setE002PrivateKey(PrivateKey e002Key) {
89+
90+
}
91+
92+
@Override
93+
public String getSecurityMedium() {
94+
return "";
95+
}
96+
97+
@Override
98+
public EbicsPartner getPartner() {
99+
return null;
100+
}
101+
102+
@Override
103+
public String getUserId() {
104+
return "";
105+
}
106+
107+
@Override
108+
public String getName() {
109+
return "test-name";
110+
}
111+
112+
@Override
113+
public String getDN() {
114+
return "CN=test-dn";
115+
}
116+
117+
@Override
118+
public PasswordCallback getPasswordCallback() {
119+
return null;
120+
}
121+
122+
@Override
123+
public byte[] authenticate(byte[] digest) throws GeneralSecurityException {
124+
return new byte[0];
125+
}
126+
127+
@Override
128+
public byte[] sign(byte[] digest) throws IOException, GeneralSecurityException {
129+
return new byte[0];
130+
}
131+
132+
@Override
133+
public byte[] decrypt(byte[] encryptedKey, byte[] transactionKey)
134+
throws GeneralSecurityException, IOException, EbicsException {
135+
return new byte[0];
136+
}
137+
138+
};
139+
var manager = new CertificateManager(user);
140+
Calendar calendar = Calendar.getInstance();
141+
calendar.add(Calendar.DAY_OF_YEAR, X509Constants.DEFAULT_DURATION);
142+
143+
manager.createA005Certificate(new Date(calendar.getTimeInMillis()));
144+
145+
var cert = manager.getA005Certificate();
146+
147+
assertNotNull(cert);
148+
149+
System.out.println(cert);
150+
151+
assertEquals(3, cert.getVersion(), "Certificate version must be 3 (V3).");
152+
String expectedDN = "CN=test-dn";
153+
assertEquals(expectedDN, cert.getIssuerX500Principal().getName(X500Principal.RFC2253));
154+
assertEquals(expectedDN, cert.getSubjectX500Principal().getName(X500Principal.RFC2253));
155+
assertEquals("SHA256WITHRSA", cert.getSigAlgName());
156+
}
157+
}

0 commit comments

Comments
 (0)