Skip to content

Commit 3c6283b

Browse files
authored
Update README.md
1 parent 0c942d4 commit 3c6283b

File tree

1 file changed

+91
-7
lines changed

1 file changed

+91
-7
lines changed

README.md

+91-7
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ Welcome to the PKCS11 Java Wrapper! This comprehensive Java library provides a r
3535
- 🔐 Data encryption and decryption
3636
- 🧰 Utility functions for common PKCS#11 operations
3737
- 🛡️ Comprehensive exception handling for robust error management
38+
- 📱 Multi-device support with hot-plug capabilities
39+
- 🔄 Automatic device state monitoring
40+
- 🎯 Device filtering by capabilities and state
3841
- 🧪 Extensive test coverage ensuring reliability
3942

4043
## 📂 Project Structure
@@ -54,6 +57,7 @@ Root:.
5457
│ │ │ └───pkcs11
5558
│ │ │ │ PKCS11Crypto.java
5659
│ │ │ │ PKCS11Initializer.java
60+
│ │ │ │ PKCS11DeviceManager.java
5761
│ │ │ │ PKCS11Manager.java
5862
│ │ │ │ PKCS11Session.java
5963
│ │ │ │ PKCS11Signer.java
@@ -62,7 +66,11 @@ Root:.
6266
│ │ │ │ // Various exception classes
6367
│ │ │ └───model
6468
│ │ │ CertificateInfo.java
69+
│ │ │ DeviceCapability.java
70+
│ │ │ DeviceChangeListener.java
71+
│ │ │ DeviceState.java
6572
│ │ │ KeyCertificatePair.java
73+
│ │ │ PKCS11Device.java
6674
│ │ │ SupportedAlgorithm.java
6775
│ └───test
6876
│ └───java
@@ -77,7 +85,7 @@ Root:.
7785

7886
### Prerequisites
7987

80-
- Java Development Kit (JDK) 17 or higher
88+
- Java Development Kit (JDK) 21 or higher
8189
- Maven 4.0.0 or higher
8290
- A PKCS#11 compatible hardware security module or smart card
8391
- The appropriate PKCS#11 library for your device (e.g., opensc-pkcs11.dll)
@@ -111,12 +119,46 @@ import java.nio.file.Paths;
111119

112120
public class PKCS11Example {
113121
public static void main(String[] args) {
114-
String userDir = System.getProperty("user.dir");
115-
PKCS11 example = new PKCS11(
116-
Paths.get(userDir, "lib", "opensc-pkcs11.dll"),
117-
"your_pin_here"
118-
);
119-
example.run();
122+
try (PKCS11Manager manager = new PKCS11Manager(Paths.get("path/to/pkcs11/library"))) {
123+
// Register device change listener
124+
manager.registerDeviceChangeListener(new DeviceChangeListener() {
125+
@Override
126+
public void onDeviceConnected(PKCS11Device device) {
127+
System.out.println("Device connected: " + device.getLabel());
128+
}
129+
130+
@Override
131+
public void onDeviceDisconnected(PKCS11Device device) {
132+
System.out.println("Device disconnected: " + device.getLabel());
133+
}
134+
135+
@Override
136+
public void onDeviceStateChanged(PKCS11Device device, DeviceState oldState) {
137+
System.out.println("Device state changed: " + device.getLabel() +
138+
" from " + oldState + " to " + device.getState());
139+
}
140+
141+
@Override
142+
public void onDeviceError(PKCS11Device device, Exception error) {
143+
System.err.println("Device error: " + device.getLabel() +
144+
" - " + error.getMessage());
145+
}
146+
});
147+
148+
// List available devices
149+
List<PKCS11Device> devices = manager.listDevices();
150+
System.out.println("Available devices: " + devices.size());
151+
152+
// Select device and perform operations
153+
if (!devices.isEmpty()) {
154+
PKCS11Device selectedDevice = devices.get(0);
155+
String pin = "your_pin_here";
156+
157+
try (PKCS11Session session = manager.openSession(selectedDevice, pin)) {
158+
// Perform operations with session...
159+
}
160+
}
161+
}
120162
}
121163
}
122164
```
@@ -361,7 +403,43 @@ classDiagram
361403
-AlgorithmType type
362404
+enum AlgorithmType
363405
}
406+
class PKCS11DeviceManager {
407+
-Pkcs11 pkcs11
408+
-Map<NativeLong, PKCS11Device> devices
409+
-Set<DeviceChangeListener> listeners
410+
-ScheduledExecutorService deviceMonitor
411+
+listDevices(): List<PKCS11Device>
412+
+listDevicesByState(DeviceState): List<PKCS11Device>
413+
+listDevicesByCapability(DeviceCapability): List<PKCS11Device>
414+
+getDevice(NativeLong): Optional<PKCS11Device>
415+
+registerDeviceChangeListener(DeviceChangeListener)
416+
+unregisterDeviceChangeListener(DeviceChangeListener)
417+
}
418+
419+
class PKCS11Device {
420+
-NativeLong slotId
421+
-String label
422+
-String manufacturer
423+
-String model
424+
-String serialNumber
425+
-Set<DeviceCapability> capabilities
426+
-DeviceState state
427+
+getDetailedInfo(): Map<String, String>
428+
+updateState(): boolean
429+
+isReady(): boolean
430+
}
431+
432+
class DeviceChangeListener {
433+
<<interface>>
434+
+onDeviceConnected(PKCS11Device)
435+
+onDeviceDisconnected(PKCS11Device)
436+
+onDeviceStateChanged(PKCS11Device, DeviceState)
437+
+onDeviceError(PKCS11Device, Exception)
438+
}
364439
440+
PKCS11Manager --> PKCS11DeviceManager : uses
441+
PKCS11DeviceManager --> PKCS11Device : manages
442+
PKCS11DeviceManager --> DeviceChangeListener : notifies
365443
PKCS11Manager --> PKCS11Initializer : uses
366444
PKCS11Manager --> PKCS11Session : creates
367445
PKCS11Manager --> Pkcs11 : manages
@@ -606,6 +684,12 @@ Our test suite covers various scenarios, including:
606684
- Encryption and decryption
607685
- Digital signature creation and verification
608686
- Error handling and exception scenarios
687+
- Device detection and management
688+
- Device state monitoring
689+
- Hot-plug capability testing
690+
- Device capability filtering
691+
- Device change event handling
692+
- Multi-device operations
609693

610694
## 🤝 Contributing
611695

0 commit comments

Comments
 (0)