History

My first initial commit with all of mine experimental changes.

Dmitry Kabak (userdima committed 13 years ago

Commit d37b88d1 parent 3f5b46618352 files · +2598093 −-8690Browse files

Showing the changes to java/pkg/sun/security/pkcs11/Secmod.java (1 of 18352 files). Show all

Unified · Split

java/pkg/sun/security/pkcs11/Secmod.java+760−0
@@ -0,0 +1,760 @@
1/*
2 * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package sun.security.pkcs11;
27
28import java.io.*;
29import java.util.*;
30
31import java.security.*;
32import java.security.KeyStore.*;
33import java.security.cert.X509Certificate;
34
35import sun.security.pkcs11.wrapper.*;
36import static sun.security.pkcs11.wrapper.PKCS11Constants.*;
37
38/**
39 * The Secmod class defines the interface to the native NSS
40 * library and the configuration information it stores in its
41 * secmod.db file.
42 *
43 * <p>Example code:
44 * <pre>
45 * Secmod secmod = Secmod.getInstance();
46 * if (secmod.isInitialized() == false) {
47 * secmod.initialize("/home/myself/.mozilla", "/usr/sfw/lib/mozilla");
48 * }
49 *
50 * Provider p = secmod.getModule(ModuleType.KEYSTORE).getProvider();
51 * KeyStore ks = KeyStore.getInstance("PKCS11", p);
52 * ks.load(null, password);
53 * </pre>
54 *
55 * @since 1.6
56 * @author Andreas Sterbenz
57 */
58public final class Secmod {
59
60 private final static boolean DEBUG = false;
61
62 private final static Secmod INSTANCE;
63
64 static {
65 sun.security.pkcs11.wrapper.PKCS11.loadNative();
66 INSTANCE = new Secmod();
67 }
68
69 private final static String NSS_LIB_NAME = "nss3";
70
71 private final static String SOFTTOKEN_LIB_NAME = "softokn3";
72
73 private final static String TRUST_LIB_NAME = "nssckbi";
74
75 // handle to be passed to the native code, 0 means not initialized
76 private long nssHandle;
77
78 // whether this is a supported version of NSS
79 private boolean supported;
80
81 // list of the modules
82 private List<Module> modules;
83
84 private String configDir;
85
86 private String nssLibDir;
87
88 private Secmod() {
89 // empty
90 }
91
92 /**
93 * Return the singleton Secmod instance.
94 */
95 public static Secmod getInstance() {
96 return INSTANCE;
97 }
98
99 private boolean isLoaded() {
100 if (nssHandle == 0) {
101 nssHandle = nssGetLibraryHandle(System.mapLibraryName(NSS_LIB_NAME));
102 if (nssHandle != 0) {
103 fetchVersions();
104 }
105 }
106 return (nssHandle != 0);
107 }
108
109 private void fetchVersions() {
110 supported = nssVersionCheck(nssHandle, "3.7");
111 }
112
113 /**
114 * Test whether this Secmod has been initialized. Returns true
115 * if NSS has been initialized using either the initialize() method
116 * or by directly calling the native NSS APIs. The latter may be
117 * the case if the current process contains components that use
118 * NSS directly.
119 *
120 * @throws IOException if an incompatible version of NSS
121 * has been loaded
122 */
123 public synchronized boolean isInitialized() throws IOException {
124 // NSS does not allow us to check if it is initialized already
125 // assume that if it is loaded it is also initialized
126 if (isLoaded() == false) {
127 return false;
128 }
129 if (supported == false) {
130 throw new IOException
131 ("An incompatible version of NSS is already loaded, "
132 + "3.7 or later required");
133 }
134 return true;
135 }
136
137 String getConfigDir() {
138 return configDir;
139 }
140
141 String getLibDir() {
142 return nssLibDir;
143 }
144
145 /**
146 * Initialize this Secmod.
147 *
148 * @param configDir the directory containing the NSS configuration
149 * files such as secmod.db
150 * @param nssLibDir the directory containing the NSS libraries
151 * (libnss3.so or nss3.dll) or null if the library is on
152 * the system default shared library path
153 *
154 * @throws IOException if NSS has already been initialized,
155 * the specified directories are invalid, or initialization
156 * fails for any other reason
157 */
158 public void initialize(String configDir, String nssLibDir)
159 throws IOException {
160 initialize(DbMode.READ_WRITE, configDir, nssLibDir);
161 }
162
163 public synchronized void initialize(DbMode dbMode, String configDir, String nssLibDir)
164 throws IOException {
165 if (isInitialized()) {
166 throw new IOException("NSS is already initialized");
167 }
168
169 if (dbMode == null) {
170 throw new NullPointerException();
171 }
172 if ((dbMode != DbMode.NO_DB) && (configDir == null)) {
173 throw new NullPointerException();
174 }
175 String platformLibName = System.mapLibraryName("nss3");
176 String platformPath;
177 if (nssLibDir == null) {
178 platformPath = platformLibName;
179 } else {
180 File base = new File(nssLibDir);
181 if (base.isDirectory() == false) {
182 throw new IOException("nssLibDir must be a directory:" + nssLibDir);
183 }
184 File platformFile = new File(base, platformLibName);
185 if (platformFile.isFile() == false) {
186 throw new FileNotFoundException(platformFile.getPath());
187 }
188 platformPath = platformFile.getPath();
189 }
190
191 if (configDir != null) {
192 File configBase = new File(configDir);
193 if (configBase.isDirectory() == false ) {
194 throw new IOException("configDir must be a directory: " + configDir);
195 }
196 File secmodFile = new File(configBase, "secmod.db");
197 if (secmodFile.isFile() == false) {
198 throw new FileNotFoundException(secmodFile.getPath());
199 }
200 }
201
202 if (DEBUG) System.out.println("lib: " + platformPath);
203 nssHandle = nssLoadLibrary(platformPath);
204 if (DEBUG) System.out.println("handle: " + nssHandle);
205 fetchVersions();
206 if (supported == false) {
207 throw new IOException
208 ("The specified version of NSS is incompatible, "
209 + "3.7 or later required");
210 }
211
212 if (DEBUG) System.out.println("dir: " + configDir);
213 boolean initok = nssInit(dbMode.functionName, nssHandle, configDir);
214 if (DEBUG) System.out.println("init: " + initok);
215 if (initok == false) {
216 throw new IOException("NSS initialization failed");
217 }
218
219 this.configDir = configDir;
220 this.nssLibDir = nssLibDir;
221 }
222
223 /**
224 * Return an immutable list of all available modules.
225 *
226 * @throws IllegalStateException if this Secmod is misconfigured
227 * or not initialized
228 */
229 public synchronized List<Module> getModules() {
230 try {
231 if (isInitialized() == false) {
232 throw new IllegalStateException("NSS not initialized");
233 }
234 } catch (IOException e) {
235 // IOException if misconfigured
236 throw new IllegalStateException(e);
237 }
238 if (modules == null) {
239 List<Module> modules = (List<Module>)nssGetModuleList(nssHandle,
240 nssLibDir);
241 this.modules = Collections.unmodifiableList(modules);
242 }
243 return modules;
244 }
245
246 private static byte[] getDigest(X509Certificate cert, String algorithm) {
247 try {
248 MessageDigest md = MessageDigest.getInstance(algorithm);
249 return md.digest(cert.getEncoded());
250 } catch (GeneralSecurityException e) {
251 throw new ProviderException(e);
252 }
253 }
254
255 boolean isTrusted(X509Certificate cert, TrustType trustType) {
256 Bytes bytes = new Bytes(getDigest(cert, "SHA-1"));
257 TrustAttributes attr = getModuleTrust(ModuleType.KEYSTORE, bytes);
258 if (attr == null) {
259 attr = getModuleTrust(ModuleType.FIPS, bytes);
260 if (attr == null) {
261 attr = getModuleTrust(ModuleType.TRUSTANCHOR, bytes);
262 }
263 }
264 return (attr == null) ? false : attr.isTrusted(trustType);
265 }
266
267 private TrustAttributes getModuleTrust(ModuleType type, Bytes bytes) {
268 Module module = getModule(type);
269 TrustAttributes t = (module == null) ? null : module.getTrust(bytes);
270 return t;
271 }
272
273 /**
274 * Constants describing the different types of NSS modules.
275 * For this API, NSS modules are classified as either one
276 * of the internal modules delivered as part of NSS or
277 * as an external module provided by a 3rd party.
278 */
279 public static enum ModuleType {
280 /**
281 * The NSS Softtoken crypto module. This is the first
282 * slot of the softtoken object.
283 * This module provides
284 * implementations for cryptographic algorithms but no KeyStore.
285 */
286 CRYPTO,
287 /**
288 * The NSS Softtoken KeyStore module. This is the second
289 * slot of the softtoken object.
290 * This module provides
291 * implementations for cryptographic algorithms (after login)
292 * and the KeyStore.
293 */
294 KEYSTORE,
295 /**
296 * The NSS Softtoken module in FIPS mode. Note that in FIPS mode the
297 * softtoken presents only one slot, not separate CRYPTO and KEYSTORE
298 * slots as in non-FIPS mode.
299 */
300 FIPS,
301 /**
302 * The NSS builtin trust anchor module. This is the
303 * NSSCKBI object. It provides no crypto functions.
304 */
305 TRUSTANCHOR,
306 /**
307 * An external module.
308 */
309 EXTERNAL,
310 }
311
312 /**
313 * Returns the first module of the specified type. If no such
314 * module exists, this method returns null.
315 *
316 * @throws IllegalStateException if this Secmod is misconfigured
317 * or not initialized
318 */
319 public Module getModule(ModuleType type) {
320 for (Module module : getModules()) {
321 if (module.getType() == type) {
322 return module;
323 }
324 }
325 return null;
326 }
327
328 static final String TEMPLATE_EXTERNAL =
329 "library = %s\n"
330 + "name = \"%s\"\n"
331 + "slotListIndex = %d\n";
332
333 static final String TEMPLATE_TRUSTANCHOR =
334 "library = %s\n"
335 + "name = \"NSS Trust Anchors\"\n"
336 + "slotListIndex = 0\n"
337 + "enabledMechanisms = { KeyStore }\n"
338 + "nssUseSecmodTrust = true\n";
339
340 static final String TEMPLATE_CRYPTO =
341 "library = %s\n"
342 + "name = \"NSS SoftToken Crypto\"\n"
343 + "slotListIndex = 0\n"
344 + "disabledMechanisms = { KeyStore }\n";
345
346 static final String TEMPLATE_KEYSTORE =
347 "library = %s\n"
348 + "name = \"NSS SoftToken KeyStore\"\n"
349 + "slotListIndex = 1\n"
350 + "nssUseSecmodTrust = true\n";
351
352 static final String TEMPLATE_FIPS =
353 "library = %s\n"
354 + "name = \"NSS FIPS SoftToken\"\n"
355 + "slotListIndex = 0\n"
356 + "nssUseSecmodTrust = true\n";
357
358 /**
359 * A representation of one PKCS#11 slot in a PKCS#11 module.
360 */
361 public static final class Module {
362 // path of the native library
363 final String libraryName;
364 // descriptive name used by NSS
365 final String commonName;
366 final int slot;
367 final ModuleType type;
368
369 private String config;
370 private SunPKCS11 provider;
371
372 // trust attributes. Used for the KEYSTORE and TRUSTANCHOR modules only
373 private Map<Bytes,TrustAttributes> trust;
374
375 Module(String libraryDir, String libraryName, String commonName,
376 boolean fips, int slot) {
377 ModuleType type;
378
379 if ((libraryName == null) || (libraryName.length() == 0)) {
380 // must be softtoken
381 libraryName = System.mapLibraryName(SOFTTOKEN_LIB_NAME);
382 if (fips == false) {
383 type = (slot == 0) ? ModuleType.CRYPTO : ModuleType.KEYSTORE;
384 } else {
385 type = ModuleType.FIPS;
386 if (slot != 0) {
387 throw new RuntimeException
388 ("Slot index should be 0 for FIPS slot");
389 }
390 }
391 } else {
392 if (libraryName.endsWith(System.mapLibraryName(TRUST_LIB_NAME))
393 || commonName.equals("Builtin Roots Module")) {
394 type = ModuleType.TRUSTANCHOR;
395 } else {
396 type = ModuleType.EXTERNAL;
397 }
398 if (fips) {
399 throw new RuntimeException("FIPS flag set for non-internal "
400 + "module: " + libraryName + ", " + commonName);
401 }
402 }
403 this.libraryName = (new File(libraryDir, libraryName)).getPath();
404 this.commonName = commonName;
405 this.slot = slot;
406 this.type = type;
407 initConfiguration();
408 }
409
410 private void initConfiguration() {
411 switch (type) {
412 case EXTERNAL:
413 config = String.format(TEMPLATE_EXTERNAL, libraryName,
414 commonName + " " + slot, slot);
415 break;
416 case CRYPTO:
417 config = String.format(TEMPLATE_CRYPTO, libraryName);
418 break;
419 case KEYSTORE:
420 config = String.format(TEMPLATE_KEYSTORE, libraryName);
421 break;
422 case FIPS:
423 config = String.format(TEMPLATE_FIPS, libraryName);
424 break;
425 case TRUSTANCHOR:
426 config = String.format(TEMPLATE_TRUSTANCHOR, libraryName);
427 break;
428 default:
429 throw new RuntimeException("Unknown module type: " + type);
430 }
431 }
432
433 /**
434 * Get the configuration for this module. This is a string
435 * in the SunPKCS11 configuration format. It can be
436 * customized with additional options and then made
437 * current using the setConfiguration() method.
438 */
439 @Deprecated
440 public synchronized String getConfiguration() {
441 return config;
442 }
443
444 /**
445 * Set the configuration for this module.
446 *
447 * @throws IllegalStateException if the associated provider
448 * instance has already been created.
449 */
450 @Deprecated
451 public synchronized void setConfiguration(String config) {
452 if (provider != null) {
453 throw new IllegalStateException("Provider instance already created");
454 }
455 this.config = config;
456 }
457
458 /**
459 * Return the pathname of the native library that implements
460 * this module. For example, /usr/lib/libpkcs11.so.
461 */
462 public String getLibraryName() {
463 return libraryName;
464 }
465
466 /**
467 * Returns the type of this module.
468 */
469 public ModuleType getType() {
470 return type;
471 }
472
473 /**
474 * Returns the provider instance that is associated with this
475 * module. The first call to this method creates the provider
476 * instance.
477 */
478 @Deprecated
479 public synchronized Provider getProvider() {
480 if (provider == null) {
481 provider = newProvider();
482 }
483 return provider;
484 }
485
486 synchronized boolean hasInitializedProvider() {
487 return provider != null;
488 }
489
490 void setProvider(SunPKCS11 p) {
491 if (provider != null) {
492 throw new ProviderException("Secmod provider already initialized");
493 }
494 provider = p;
495 }
496
497 private SunPKCS11 newProvider() {
498 try {
499 InputStream in = new ByteArrayInputStream(config.getBytes("UTF8"));
500 return new SunPKCS11(in);
501 } catch (Exception e) {
502 // XXX
503 throw new ProviderException(e);
504 }
505 }
506
507 synchronized void setTrust(Token token, X509Certificate cert) {
508 Bytes bytes = new Bytes(getDigest(cert, "SHA-1"));
509 TrustAttributes attr = getTrust(bytes);
510 if (attr == null) {
511 attr = new TrustAttributes(token, cert, bytes, CKT_NETSCAPE_TRUSTED_DELEGATOR);
512 trust.put(bytes, attr);
513 } else {
514 // does it already have the correct trust settings?
515 if (attr.isTrusted(TrustType.ALL) == false) {
516 // XXX not yet implemented
517 throw new ProviderException("Cannot change existing trust attributes");
518 }
519 }
520 }
521
522 TrustAttributes getTrust(Bytes hash) {
523 if (trust == null) {
524 // If provider is not set, create a temporary provider to
525 // retrieve the trust information. This can happen if we need
526 // to get the trust information for the trustanchor module
527 // because we need to look for user customized settings in the
528 // keystore module (which may not have a provider created yet).
529 // Creating a temporary provider and then dropping it on the
530 // floor immediately is flawed, but it's the best we can do
531 // for now.
532 synchronized (this) {
533 SunPKCS11 p = provider;
534 if (p == null) {
535 p = newProvider();
536 }
537 try {
538 trust = Secmod.getTrust(p);
539 } catch (PKCS11Exception e) {
540 throw new RuntimeException(e);
541 }
542 }
543 }
544 return trust.get(hash);
545 }
546
547 public String toString() {
548 return
549 commonName + " (" + type + ", " + libraryName + ", slot " + slot + ")";
550 }
551
552 }
553
554 /**
555 * Constants representing NSS trust categories.
556 */
557 public static enum TrustType {
558 /** Trusted for all purposes */
559 ALL,
560 /** Trusted for SSL client authentication */
561 CLIENT_AUTH,
562 /** Trusted for SSL server authentication */
563 SERVER_AUTH,
564 /** Trusted for code signing */
565 CODE_SIGNING,
566 /** Trusted for email protection */
567 EMAIL_PROTECTION,
568 }
569
570 public static enum DbMode {
571 READ_WRITE("NSS_InitReadWrite"),
572 READ_ONLY ("NSS_Init"),
573 NO_DB ("NSS_NoDB_Init");
574
575 final String functionName;
576 DbMode(String functionName) {
577 this.functionName = functionName;
578 }
579 }
580
581 /**
582 * A LoadStoreParameter for use with the NSS Softtoken or
583 * NSS TrustAnchor KeyStores.
584 * <p>
585 * It allows the set of trusted certificates that are returned by
586 * the KeyStore to be specified.
587 */
588 public static final class KeyStoreLoadParameter implements LoadStoreParameter {
589 final TrustType trustType;
590 final ProtectionParameter protection;
591 public KeyStoreLoadParameter(TrustType trustType, char[] password) {
592 this(trustType, new PasswordProtection(password));
593
594 }
595 public KeyStoreLoadParameter(TrustType trustType, ProtectionParameter prot) {
596 if (trustType == null) {
597 throw new NullPointerException("trustType must not be null");
598 }
599 this.trustType = trustType;
600 this.protection = prot;
601 }
602 public ProtectionParameter getProtectionParameter() {
603 return protection;
604 }
605 public TrustType getTrustType() {
606 return trustType;
607 }
608 }
609
610 static class TrustAttributes {
611 final long handle;
612 final long clientAuth, serverAuth, codeSigning, emailProtection;
613 final byte[] shaHash;
614 TrustAttributes(Token token, X509Certificate cert, Bytes bytes, long trustValue) {
615 Session session = null;
616 try {
617 session = token.getOpSession();
618 // XXX use KeyStore TrustType settings to determine which
619 // attributes to set
620 CK_ATTRIBUTE[] attrs = new CK_ATTRIBUTE[] {
621 new CK_ATTRIBUTE(CKA_TOKEN, true),
622 new CK_ATTRIBUTE(CKA_CLASS, CKO_NETSCAPE_TRUST),
623 new CK_ATTRIBUTE(CKA_NETSCAPE_TRUST_SERVER_AUTH, trustValue),
624 new CK_ATTRIBUTE(CKA_NETSCAPE_TRUST_CODE_SIGNING, trustValue),
625 new CK_ATTRIBUTE(CKA_NETSCAPE_TRUST_EMAIL_PROTECTION, trustValue),
626 new CK_ATTRIBUTE(CKA_NETSCAPE_TRUST_CLIENT_AUTH, trustValue),
627 new CK_ATTRIBUTE(CKA_NETSCAPE_CERT_SHA1_HASH, bytes.b),
628 new CK_ATTRIBUTE(CKA_NETSCAPE_CERT_MD5_HASH, getDigest(cert, "MD5")),
629 new CK_ATTRIBUTE(CKA_ISSUER, cert.getIssuerX500Principal().getEncoded()),
630 new CK_ATTRIBUTE(CKA_SERIAL_NUMBER, cert.getSerialNumber().toByteArray()),
631 // XXX per PKCS#11 spec, the serial number should be in ASN.1
632 };
633 handle = token.p11.C_CreateObject(session.id(), attrs);
634 shaHash = bytes.b;
635 clientAuth = trustValue;
636 serverAuth = trustValue;
637 codeSigning = trustValue;
638 emailProtection = trustValue;
639 } catch (PKCS11Exception e) {
640 throw new ProviderException("Could not create trust object", e);
641 } finally {
642 token.releaseSession(session);
643 }
644 }
645 TrustAttributes(Token token, Session session, long handle)
646 throws PKCS11Exception {
647 this.handle = handle;
648 CK_ATTRIBUTE[] attrs = new CK_ATTRIBUTE[] {
649 new CK_ATTRIBUTE(CKA_NETSCAPE_TRUST_SERVER_AUTH),
650 new CK_ATTRIBUTE(CKA_NETSCAPE_TRUST_CODE_SIGNING),
651 new CK_ATTRIBUTE(CKA_NETSCAPE_TRUST_EMAIL_PROTECTION),
652 new CK_ATTRIBUTE(CKA_NETSCAPE_CERT_SHA1_HASH),
653 };
654
655 token.p11.C_GetAttributeValue(session.id(), handle, attrs);
656 serverAuth = attrs[0].getLong();
657 codeSigning = attrs[1].getLong();
658 emailProtection = attrs[2].getLong();
659 shaHash = attrs[3].getByteArray();
660
661 attrs = new CK_ATTRIBUTE[] {
662 new CK_ATTRIBUTE(CKA_NETSCAPE_TRUST_CLIENT_AUTH),
663 };
664 long c;
665 try {
666 token.p11.C_GetAttributeValue(session.id(), handle, attrs);
667 c = attrs[0].getLong();
668 } catch (PKCS11Exception e) {
669 // trust anchor module does not support this attribute
670 c = serverAuth;
671 }
672 clientAuth = c;
673 }
674 Bytes getHash() {
675 return new Bytes(shaHash);
676 }
677 boolean isTrusted(TrustType type) {
678 switch (type) {
679 case CLIENT_AUTH:
680 return isTrusted(clientAuth);
681 case SERVER_AUTH:
682 return isTrusted(serverAuth);
683 case CODE_SIGNING:
684 return isTrusted(codeSigning);
685 case EMAIL_PROTECTION:
686 return isTrusted(emailProtection);
687 case ALL:
688 return isTrusted(TrustType.CLIENT_AUTH)
689 && isTrusted(TrustType.SERVER_AUTH)
690 && isTrusted(TrustType.CODE_SIGNING)
691 && isTrusted(TrustType.EMAIL_PROTECTION);
692 default:
693 return false;
694 }
695 }
696
697 private boolean isTrusted(long l) {
698 // XXX CKT_TRUSTED?
699 return (l == CKT_NETSCAPE_TRUSTED_DELEGATOR);
700 }
701
702 }
703
704 private static class Bytes {
705 final byte[] b;
706 Bytes(byte[] b) {
707 this.b = b;
708 }
709 public int hashCode() {
710 return Arrays.hashCode(b);
711 }
712 public boolean equals(Object o) {
713 if (this == o) {
714 return true;
715 }
716 if (o instanceof Bytes == false) {
717 return false;
718 }
719 Bytes other = (Bytes)o;
720 return Arrays.equals(this.b, other.b);
721 }
722 }
723
724 private static Map<Bytes,TrustAttributes> getTrust(SunPKCS11 provider)
725 throws PKCS11Exception {
726 Map<Bytes,TrustAttributes> trustMap = new HashMap<Bytes,TrustAttributes>();
727 Token token = provider.getToken();
728 Session session = null;
729 try {
730 session = token.getOpSession();
731 int MAX_NUM = 8192;
732 CK_ATTRIBUTE[] attrs = new CK_ATTRIBUTE[] {
733 new CK_ATTRIBUTE(CKA_CLASS, CKO_NETSCAPE_TRUST),
734 };
735 token.p11.C_FindObjectsInit(session.id(), attrs);
736 long[] handles = token.p11.C_FindObjects(session.id(), MAX_NUM);
737 token.p11.C_FindObjectsFinal(session.id());
738 if (DEBUG) System.out.println("handles: " + handles.length);
739
740 for (long handle : handles) {
741 TrustAttributes trust = new TrustAttributes(token, session, handle);
742 trustMap.put(trust.getHash(), trust);
743 }
744 } finally {
745 token.releaseSession(session);
746 }
747 return trustMap;
748 }
749
750 private static native long nssGetLibraryHandle(String libraryName);
751
752 private static native long nssLoadLibrary(String name) throws IOException;
753
754 private static native boolean nssVersionCheck(long handle, String minVersion);
755
756 private static native boolean nssInit(String functionName, long handle, String configDir);
757
758 private static native Object nssGetModuleList(long handle, String libDir);
759
760}

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t