34
34
import java .io .FileNotFoundException ;
35
35
import java .security .cert .X509Certificate ;
36
36
import java .util .ArrayList ;
37
+ import java .util .Arrays ;
37
38
import java .util .List ;
38
39
39
40
import javax .net .ssl .X509TrustManager ;
@@ -113,8 +114,8 @@ public int call(StoreContext context) {
113
114
114
115
@ Deprecated int cache = 1 ; // not-used
115
116
116
- private final List < X509Object > objects ;
117
- private final List < Lookup > certificateMethods ;
117
+ private X509Object [] objects = new X509Object [ 0 ] ;
118
+ private Lookup [] certificateMethods = new Lookup [ 0 ] ;
118
119
119
120
public final VerifyParameter verifyParameter ;
120
121
@@ -135,9 +136,6 @@ public int call(StoreContext context) {
135
136
* c: X509_STORE_new
136
137
*/
137
138
public Store () {
138
- objects = new ArrayList <X509Object >();
139
- certificateMethods = new ArrayList <Lookup >();
140
-
141
139
verifyParameter = new VerifyParameter ();
142
140
143
141
extraData = new ArrayList <Object >(10 );
@@ -147,15 +145,11 @@ public Store() {
147
145
}
148
146
149
147
public List <X509Object > getObjects () {
150
- synchronized (objects ) {
151
- return new ArrayList <X509Object >(objects );
152
- }
148
+ return Arrays .asList (objects );
153
149
}
154
150
155
151
public List <Lookup > getCertificateMethods () {
156
- synchronized (certificateMethods ) {
157
- return new ArrayList <Lookup >(certificateMethods );
158
- }
152
+ return Arrays .asList (certificateMethods );
159
153
}
160
154
161
155
public VerifyParameter getVerifyParameter () {
@@ -188,11 +182,9 @@ public void setVerifyCallbackFunction(VerifyCallbackFunction func) {
188
182
* c: X509_STORE_free
189
183
*/
190
184
public void free () throws Exception {
191
- synchronized (certificateMethods ) {
192
- for (Lookup lu : certificateMethods ) {
193
- lu .shutdown ();
194
- lu .free ();
195
- }
185
+ for (Lookup lu : certificateMethods ) {
186
+ lu .shutdown ();
187
+ lu .free ();
196
188
}
197
189
if (verifyParameter != null ) {
198
190
verifyParameter .free ();
@@ -258,56 +250,60 @@ public int setParam(VerifyParameter pm) {
258
250
* c: X509_STORE_add_lookup
259
251
*/
260
252
public Lookup addLookup (Ruby runtime , final LookupMethod method ) throws Exception {
261
- synchronized (certificateMethods ) {
262
- for ( Lookup lookup : certificateMethods ) {
263
- if ( lookup .equals (method ) ) return lookup ;
264
- }
265
- Lookup lookup = new Lookup (runtime , method );
266
- lookup .store = this ;
267
- certificateMethods .add (lookup );
268
- return lookup ;
253
+ for ( Lookup lookup : certificateMethods ) {
254
+ if ( lookup .equals (method ) ) return lookup ;
269
255
}
256
+ return doAddLookup (runtime , method );
257
+ }
258
+
259
+ private synchronized Lookup doAddLookup (Ruby runtime , final LookupMethod method ) throws Exception {
260
+ Lookup lookup = new Lookup (runtime , method );
261
+ lookup .store = this ;
262
+ Lookup [] newCertificateMethods = Arrays .copyOf (certificateMethods , certificateMethods .length + 1 );
263
+ newCertificateMethods [certificateMethods .length ] = lookup ;
264
+ certificateMethods = newCertificateMethods ;
265
+ return lookup ;
270
266
}
271
267
272
268
/**
273
269
* c: X509_STORE_add_cert
274
270
*/
275
- public int addCertificate (final X509Certificate cert ) {
271
+ public synchronized int addCertificate (final X509Certificate cert ) {
276
272
if ( cert == null ) return 0 ;
277
273
278
274
final Certificate certObj = new Certificate ();
279
275
certObj .x509 = StoreContext .ensureAux (cert );
280
276
281
277
int ret = 1 ;
282
- synchronized ( objects ) {
283
- if ( X509Object . retrieveMatch ( objects , certObj ) != null ) {
284
- X509Error . addError ( X509_R_CERT_ALREADY_IN_HASH_TABLE ) ;
285
- ret = 0 ;
286
- }
287
- else {
288
- objects .add ( certObj ) ;
289
- }
278
+ if ( X509Object . retrieveMatch ( getObjects (), certObj ) != null ) {
279
+ X509Error . addError ( X509_R_CERT_ALREADY_IN_HASH_TABLE );
280
+ ret = 0 ;
281
+ }
282
+ else {
283
+ X509Object [] newObjects = Arrays . copyOf ( objects , objects . length + 1 );
284
+ newObjects [ objects .length ] = certObj ;
285
+ objects = newObjects ;
290
286
}
291
287
return ret ;
292
288
}
293
289
294
290
/**
295
291
* c: X509_STORE_add_crl
296
292
*/
297
- public int addCRL (final java .security .cert .CRL crl ) {
293
+ public synchronized int addCRL (final java .security .cert .CRL crl ) {
298
294
if ( crl == null ) return 0 ;
299
295
300
296
final CRL crlObj = new CRL (); crlObj .crl = crl ;
301
297
302
298
int ret = 1 ;
303
- synchronized ( objects ) {
304
- if ( X509Object . retrieveMatch ( objects , crlObj ) != null ) {
305
- X509Error . addError ( X509_R_CERT_ALREADY_IN_HASH_TABLE ) ;
306
- ret = 0 ;
307
- }
308
- else {
309
- objects .add ( crlObj ) ;
310
- }
299
+ if ( X509Object . retrieveMatch ( getObjects (), crlObj ) != null ) {
300
+ X509Error . addError ( X509_R_CERT_ALREADY_IN_HASH_TABLE );
301
+ ret = 0 ;
302
+ }
303
+ else {
304
+ X509Object [] newObjects = Arrays . copyOf ( objects , objects . length + 1 );
305
+ newObjects [ objects .length ] = crlObj ;
306
+ objects = newObjects ;
311
307
}
312
308
return ret ;
313
309
}
@@ -379,16 +375,14 @@ public void checkServerTrusted(X509Certificate[] chain, String authType) {
379
375
}
380
376
381
377
@ Override
382
- public X509Certificate [] getAcceptedIssuers () {
383
- synchronized (objects ) {
384
- ArrayList <X509Certificate > issuers = new ArrayList <X509Certificate >(objects .size ());
385
- for ( X509Object object : objects ) {
386
- if ( object instanceof Certificate ) {
387
- issuers .add ( ( (Certificate ) object ).x509 );
388
- }
378
+ public synchronized X509Certificate [] getAcceptedIssuers () {
379
+ ArrayList <X509Certificate > issuers = new ArrayList <X509Certificate >(objects .length );
380
+ for ( X509Object object : objects ) {
381
+ if ( object instanceof Certificate ) {
382
+ issuers .add ( ( (Certificate ) object ).x509 );
389
383
}
390
- return issuers .toArray ( new X509Certificate [ issuers .size () ] );
391
384
}
385
+ return issuers .toArray ( new X509Certificate [ issuers .size () ] );
392
386
}
393
387
394
388
}// X509_STORE
0 commit comments