1+ package pl .mlodawski .security .example ;
2+
3+ import pl .mlodawski .security .pkcs11 .*;
4+ import pl .mlodawski .security .pkcs11 .model .SupportedAlgorithm ;
5+ import pl .mlodawski .security .pkcs11 .model .KeyCertificatePair ;
6+ import pl .mlodawski .security .pkcs11 .model .CertificateInfo ;
7+
8+ import java .nio .file .Path ;
9+ import java .nio .file .Paths ;
10+ import java .util .List ;
11+ import java .util .Base64 ;
12+ import java .util .Scanner ;
13+
14+ class PKCS11 {
15+
16+ private final Path PKCS11_WRAPPER_PATH ;
17+ private final String PIN ;
18+ PKCS11Utils utils = new PKCS11Utils ();
19+
20+ public PKCS11 (Path pkcs11WrapperPath , String pin ) {
21+ this .PKCS11_WRAPPER_PATH = pkcs11WrapperPath ;
22+ this .PIN = pin ;
23+ }
24+
25+ public void run () {
26+ PKCS11Manager manager = new PKCS11Manager (PKCS11_WRAPPER_PATH , PIN );
27+
28+ try (PKCS11Session session = manager .openSession (0 )) {
29+ while (true ) {
30+ try {
31+ displayMenu ();
32+ int choice = getUserChoice ();
33+
34+ switch (choice ) {
35+ case 1 :
36+ listCertificates (manager , session );
37+ break ;
38+ case 2 :
39+ signMessage (manager , session );
40+ break ;
41+ case 3 :
42+ encryptDecryptData (manager , session );
43+ break ;
44+ case 4 :
45+ listSupportedAlgorithms (manager , session );
46+ break ;
47+ case 5 :
48+ System .out .println ("Exiting..." );
49+ return ;
50+ default :
51+ System .out .println ("Invalid choice. Please try again." );
52+ }
53+ } catch (Exception e ) {
54+ System .out .println ("An error occurred: " + e .getMessage ());
55+ } finally {
56+ session .resetSession ();
57+ }
58+ }
59+ } catch (Exception e ) {
60+ throw new RuntimeException (e );
61+ }
62+ }
63+
64+ private void displayMenu () {
65+ System .out .println ("\n --- PKCS#11 Operations Menu ---" );
66+ System .out .println ("1. List Available Certificates" );
67+ System .out .println ("2. Sign a Message" );
68+ System .out .println ("3. Encrypt and Decrypt Data" );
69+ System .out .println ("4. List Supported Algorithms" );
70+ System .out .println ("5. Exit" );
71+ System .out .print ("Enter your choice: " );
72+ }
73+
74+ private int getUserChoice () {
75+ Scanner scanner = new Scanner (System .in );
76+ return scanner .nextInt ();
77+ }
78+
79+ private void listCertificates (PKCS11Manager manager , PKCS11Session session ) {
80+ List <KeyCertificatePair > pairs = utils .findPrivateKeysAndCertificates (manager .getPkcs11 (), session .getSession ());
81+ System .out .println ("\n Available certificate-key pairs:" );
82+ for (int i = 0 ; i < pairs .size (); i ++) {
83+ KeyCertificatePair pair = pairs .get (i );
84+ CertificateInfo certInfo = pair .getCertificateInfo ();
85+ System .out .printf ("%d: Subject: %s, Issuer: %s, Serial: %s, Not Before: %s, Not After: %s, CKA_ID: %s\n " ,
86+ i + 1 ,
87+ certInfo .getSubject (),
88+ certInfo .getIssuer (),
89+ certInfo .getSerialNumber (),
90+ certInfo .getNotBefore (),
91+ certInfo .getNotAfter (),
92+ pair .getCkaId ());
93+ }
94+ }
95+
96+ private KeyCertificatePair selectCertificateKeyPair (PKCS11Manager manager , PKCS11Session session ) {
97+ List <KeyCertificatePair > pairs = utils .findPrivateKeysAndCertificates (manager .getPkcs11 (), session .getSession ());
98+ listCertificates (manager , session );
99+ System .out .print ("Select a certificate-key pair index: " );
100+ int pairIndex = getUserChoice () - 1 ;
101+
102+ if (pairIndex < 0 || pairIndex >= pairs .size ()) {
103+ throw new IllegalArgumentException ("Invalid certificate-key pair index selected." );
104+ }
105+
106+ return pairs .get (pairIndex );
107+ }
108+
109+ private void signMessage (PKCS11Manager manager , PKCS11Session session ) throws Exception {
110+ try {
111+ KeyCertificatePair selectedPair = selectCertificateKeyPair (manager , session );
112+
113+ System .out .print ("Enter a message to sign: " );
114+ Scanner scanner = new Scanner (System .in );
115+ String messageToSign = scanner .nextLine ();
116+
117+ PKCS11Signer signer = new PKCS11Signer ();
118+ byte [] signature = signer .signMessage (manager .getPkcs11 (), session .getSession (), selectedPair .getKeyHandle (), messageToSign .getBytes ());
119+ System .out .println ("Signature: " + Base64 .getEncoder ().encodeToString (signature ));
120+
121+ boolean isSignatureValid = signer .verifySignature (messageToSign .getBytes (), signature , selectedPair .getCertificate ());
122+ System .out .println ("Signature status: " + (isSignatureValid ? "Valid" : "Invalid" ));
123+ } catch (Exception e ) {
124+ System .out .println ("Error during signing: " + e .getMessage ());
125+ throw e ;
126+ }
127+ }
128+
129+ private void encryptDecryptData (PKCS11Manager manager , PKCS11Session session ) {
130+ try {
131+ KeyCertificatePair selectedPair = selectCertificateKeyPair (manager , session );
132+
133+ System .out .print ("Enter data to encrypt: " );
134+ Scanner scanner = new Scanner (System .in );
135+ String dataToEncrypt = scanner .nextLine ();
136+
137+ PKCS11Crypto decryptor = new PKCS11Crypto ();
138+
139+ byte [] encryptedData = decryptor .encryptData (dataToEncrypt .getBytes (), selectedPair .getCertificate ());
140+ System .out .println ("Data encrypted successfully." );
141+
142+ byte [] decryptedData = decryptor .decryptData (manager .getPkcs11 (), session .getSession (), selectedPair .getKeyHandle (), encryptedData );
143+ System .out .println ("Decrypted data: " + new String (decryptedData ));
144+
145+ if (dataToEncrypt .equals (new String (decryptedData ))) {
146+ System .out .println ("Encryption and decryption successful: data integrity verified." );
147+ } else {
148+ System .out .println ("Warning: Decrypted data does not match original input." );
149+ }
150+ } catch (IllegalArgumentException e ) {
151+ System .out .println ("Invalid input: " + e .getMessage ());
152+ throw e ;
153+ } catch (Exception e ) {
154+ System .out .println ("Error during encryption/decryption: " + e .getMessage ());
155+ throw e ;
156+ }
157+ }
158+
159+ private void listSupportedAlgorithms (PKCS11Manager manager , PKCS11Session session ) {
160+ List <SupportedAlgorithm > algorithms = utils .listSupportedAlgorithms (manager .getPkcs11 (), session .getSession (), 0 );
161+ System .out .println ("\n Supported algorithms:" );
162+ for (SupportedAlgorithm algo : algorithms ) {
163+ System .out .println (algo );
164+ }
165+ }
166+ }
167+
168+ public class PKCS11Example {
169+ public static void main (String [] args ) {
170+ String userDir = System .getProperty ("user.dir" );
171+ PKCS11 example = new PKCS11 (
172+ Paths .get (userDir , "lib" , "opensc-pkcs11.dll" ),
173+ "123456"
174+ );
175+ example .run ();
176+ }
177+ }
0 commit comments