
Zig हार्डवेयर सुरक्षा मॉड्यूल लाइब्रेरी PIV, CAC, और YubiKey टोकन के लिए PC/SC के माध्यम से। प्रमाणपत्र, PIN प्रबंधन, हस्ताक्षर, और डिक्रिप्शन का समर्थन करता है।
ज़िग के लिए एक हार्डवेयर सुरक्षा मॉड्यूल (HSM) लाइब्रेरी जो PIV, CAC, और YubiKey टोकन तक PC/SC पहुँच प्रदान करती है।
| पहलू | जानकारी |
|---|---|
| API स्थिरता | विकास |
| Zig संस्करण | 0.16.0 |
| प्लेटफ़ॉर्म | Linux, macOS, Windows |
| लाइसेंस | MIT |
PIV समर्थन (NIST SP 800-73-4)
CAC समर्थन (सामान्य ऍक्सेस कार्ड)
YubiKey समर्थन
सुरक्षा
anyerror नहीं)समांतर संचालन (thread_pool के माध्यम से)
-Denable_tp=true); -Denable_tp=false से अक्षम करेंlibpcsclite-dev (Debian/Ubuntu) या pcsc-lite-devel (Fedora)# Debian/Ubuntu
sudo apt-get install libpcsclite-dev pcscd
# Fedora/RHEL
sudo dnf install pcsc-lite-devel pcsc-lite
# Start the PC/SC daemon
sudo systemctl start pcscd
sudo systemctl enable pcscd
# Build and run unit tests
make
# Or using zig directly
zig build test
# Run simulator integration tests
zig build test -Dintegration_sim=true
# Build examples (requires PC/SC library installed)
zig build examples -Dlink_pcsc=true
-Dfips=true के साथ, हर सुरक्षा-प्रासंगिक क्रिप्टोग्राफ़िक प्रिमिटिव
crypto_backend सीम के माध्यम से एक लिंक किए गए मान्य OpenSSL 3.x FIPS प्रदाता
के माध्यम से रूट होता है, और सिम्युलेटर पोस्ट-क्वांटम PIV टोकन
संचालन (ML-DSA-65 हस्ताक्षर, ML-KEM-768 एनकैप/डिकैप) प्राप्त करता है जो
केवल FIPS मोड में उपलब्ध हैं। फ़्लैग डिफ़ॉल्ट रूप से बंद होने पर शून्य
ओवरहेड रखता है; fips निर्भरता केवल -Dfips=true के तहत हल की जाती है।
# Default build — std.crypto backend, no OpenSSL link
zig build test
# FIPS build — OpenSSL FIPS provider (run `make deps` from fips first)
OPENSSL_CONF=/usr/local/ssl/ssl/openssl.cnf \
zig build test -Dfips=true -Dopenssl_path=/usr/local/ssl
# Both modes in one shot
make test-dual
सीम डिज़ाइन, fips-छूट नीति और PQC टोकन संचालन के लिए
docs/FIPS.md देखें।
सुरक्षा नोट: दुर्भावनापूर्ण लाइब्रेरी इंजेक्शन हमलों (CWE-427) को रोकने के लिए
allow_pcsc_env_override विकल्प डिफ़ॉल्ट रूप से अक्षम है। इसे केवल डेवलपमेंट/परीक्षण के लिए सक्षम करें:
# Production build (secure, env var ignored)
zig build
# Development build (allows HSM_PCSC_LIB_PATH)
zig build -Dallow_pcsc_env_override=true
जब सक्षम हो, तो लोड करने से पहले लाइब्रेरीज़ मान्य की जाती हैं:
const std = @import("std");
const hsm = @import("hsm");
pub fn main() !void {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer _ = gpa.deinit();
const allocator = gpa.allocator();
// List available tokens
const tokens = try hsm.listTokens(allocator, false);
defer {
for (tokens) |*t| t.deinit();
allocator.free(tokens);
}
if (tokens.len == 0) {
std.debug.print("No tokens found\n", .{});
return;
}
// Open the first token
var token = try hsm.openToken(allocator, tokens[0].id, .{});
defer token.close();
// Verify PIN
try token.verifyPin("123456");
// Read certificate
const cert = try token.getCertificate(.authentication);
defer allocator.free(cert);
std.debug.print("Certificate: {} bytes\n", .{cert.len});
// Sign a digest
var digest: [32]u8 = undefined;
std.crypto.hash.sha2.Sha256.hash("Hello, PIV!", &digest, .{});
const signature = try token.sign(.authentication, .ecdsa_p256, &digest);
defer allocator.free(signature);
std.debug.print("Signature: {} bytes\n", .{signature.len});
}
सभी संचालन HsmError से त्रुटियाँ लौटाते हैं:
PcscUnavailable, ReaderGone, CardRemoved, TimeoutPinIncorrect, PinLocked, PinLengthInvalidNotSupported, SlotNotFound, AlgorithmNotSupportedInvalidTlv, CertificateNotFound, InvalidDigestLengthSecurityConditionNotSatisfied, parallel मॉड्यूल thread_pool लाइब्रेरी का उपयोग करके बैच HSM संचालन प्रदान करता है। यह एक अलग Zig मॉड्यूल के रूप में बनाया गया है और -Denable_tp=true (डिफ़ॉल्ट) होने पर उपलब्ध है। सीम को पूरी तरह से संकलन से बाहर करने के लिए -Denable_tp=false सेट करें; सार्वजनिक फ़ंक्शन अभी भी मौजूद हैं और अनुक्रमिक कार्यान्वयन पर वापस आते हैं।
थ्रेशोल्ड के नीचे, संचालन थ्रेड पूल ओवरहेड के बिना अनुक्रमिक रूप से निष्पादित होते हैं। अंतर्निहित PKCS#11 कॉल स्कैफोल्डिंग हैं; src/parallel.zig में signData, decryptData, discoverToken, और retrieveCert फ़ंक्शन लागू करके अपना PKCS#11 बैकएंड एकीकृत करें।
# Run all unit tests
zig build test
लाइब्रेरी में हार्डवेयर के बिना परीक्षण के लिए एक PIV कार्ड सिम्युलेटर शामिल है:
# Run simulator tests
zig build test -Dintegration_sim=true
सिम्युलेटर एम्बेडेड परीक्षण कुंजियों का उपयोग करता है (src/sim/key_material.zig देखें)। किसी बाहरी कुंजी फ़ाइल या पर्यावरण चर की आवश्यकता नहीं है।
वास्तविक हार्डवेयर के साथ परीक्षण के लिए:
# Read-only tests (certificate reading)
HSM_HIL=1 zig build test -Dhsm_hil=true
# Tests requiring PIN
HSM_HIL=1 HSM_PIN=123456 zig build test -Dhsm_hil=true
# Dangerous tests (write operations) - USE WITH CAUTION
HSM_HIL=1 HSM_PIN=123456 HSM_DANGEROUS=1 zig build test -Dhsm_hil=true
# Continuous fuzzing (stop manually)
zig build test --fuzz -- --test-filter fuzz
# Build examples (requires PC/SC library installed)
zig build examples -Dlink_pcsc=true
# List tokens
./zig-out/bin/list_tokens
./zig-out/bin/list_tokens --sim # Use simulator
# Sign with PIV (PIN entered via interactive TTY prompt)
./zig-out/bin/piv_sign
./zig-out/bin/piv_sign --sim
# Or supply PIN via environment variable (less secure)
HSM_PIN=123456 ./zig-out/bin/piv_sign --sim
PIN प्रबंधन: PIN को कभी भी टोकन संरचनाओं में संग्रहीत नहीं किया जाता है और उपयोग के बाद शून्य कर दिया जाता है।
TLV पार्सिंग: सभी TLV पार्सिंग में संसाधन थकावट को रोकने के लिए गहराई (10) और लंबाई (64KB) की सीमाएँ होती हैं।
त्रुटि प्रबंधन: अज्ञात स्थिति शब्दों के परिणामस्वरूप स्पष्ट त्रुटियाँ होती हैं, मौन विफलताएँ नहीं।
लॉगिंग: डीबग लॉगिंग में कभी भी संवेदनशील डेटा (PIN, कुंजियाँ, आदि) शामिल नहीं होता।
मेमोरी: संवेदनशील बफ़र को hsm.zeroize() का उपयोग करके शून्य किया जाता है जो कंपाइलर ऑप्टिमाइज़ेशन को रोकता है।
PC/SC लाइब्रेरी लोडिंग: लाइब्रेरी PC/SC को विश्वसनीय पूर्ण पथों से लोड करती है। HSM_PCSC_LIB_PATH के माध्यम से एक स्पष्ट ओवरराइड उपलब्ध है (पूर्ण पथ होना चाहिए)।
hsm HSM संचालनों के स्पैन ट्रेसिंग के लिए एक ऑप्ट-इन OpenTelemetry सीम शिप करता है। सीम डिफ़ॉल्ट रूप से बंद है और बंद होने पर शून्य ओवरहेड उत्पन्न करता है — बिल्ड कभी भी otel निर्भरता को हल नहीं करता, हर हेल्पर एक comptime-ज्ञात नो-ऑप में संकलित होता है, और उत्पादित आर्टिफैक्ट में कोई otel या observability लिंक किए गए प्रतीक नहीं होते।
zig build test # default: -Dwith_otel=false (no-op)
zig build test -Dwith_otel=true # opt in: spans emitted
जब सक्षम हो, तो हर सार्वजनिक Token.sign / Token.decrypt कॉल दो विशेषताओं के साथ एक hsm.{operation} स्पैन (जैसे hsm.sign, hsm.decrypt) उत्सर्जित करता है:
crypto.algorithm — एल्गोरिदम टैग (जैसे ecdsa_p256, rsa2048_pkcs1v15)।crypto.key.id — स्लॉट पहचानकर्ता (जैसे authentication, signature, key_management, card_auth)।सीम एक नियम के आसपास इंजीनियर किया गया है: क्रिप्टोग्राफ़िक सामग्री कभी निर्यात न करें। स्पैन विशेषताएँ ऑफ-होस्ट निर्यात की जाती हैं (आमतौर पर OTLP कलेक्टर को) और ट्रेस/लॉग में समाप्त होती हैं जिनमें HSM संचालन की तुलना में कमज़ोर एक्सेस नियंत्रण हो सकते हैं।
hsm.observability.startHsmOperationSpan में पास करने से पहले उन्हें रिडैक्ट या हैश करें।const hsm = @import("hsm");
pub fn main() !void {
// Park the Otel value on a stable address — either a `var` in
// main()'s stack frame for the process lifetime, or a heap
// allocation. The init helper is only present when
// `-Dwith_otel=true`; under the disabled build,
// hsm.observability_init resolves to an empty struct and this
// block compiles to a no-op.
if (comptime hsm.observability.enabled) {
var otel = try hsm.observability_init.Otel.init(allocator, "my-service");
defer otel.deinit();
otel.installGlobals();
}
// ... rest of main, including any hsm.Token.sign calls — each one
// now emits an `hsm.sign` span attached to your service.
}
सीम OpenTelemetry पर्यावरण-चर विनिर्देश के अनुसार OTEL_* पर्यावरण चर (सैंपलर, एक्सपोर्टर एंडपॉइंट, service.name, आदि) पढ़ता है। डिफ़ॉल्ट: 5% पर parentbased_traceidratio सैंपलर, http://localhost:4318 पर OTLP/HTTP-protobuf एक्सपोर्टर।
पूर्ण एकीकरण रेसिपी (बिल्ड वायरिंग, टेस्ट हार्नेस, नो-ऑप वेरिफायर) otel रोलआउट रेपो में प्रलेखित है:
otel/docs/integration/RECIPE.md।
सीम को छूने वाले परिवर्तनों को मर्ज करने से पहले तीन गेट पास होने चाहिए:
zig build test # default flag = false
zig build test -Dwith_otel=true # flag on
scripts/verify-consumer-noop.sh # symbol-leak check
verify-consumer-noop.sh गेट -Dwith_otel=false के साथ लाइब्रेरी बनाता है और nm --defined-only के साथ zig-out/ को स्कैन करता है, यदि कोई otel/observability प्रतीक आर्टिफैक्ट में बच गया तो विफल हो जाता है। यह क्रॉस-रेपो otel/scripts/verify-consumer-noop.sh (जो केवल सहोदर-रेपो लेआउट <root>/otel//<root>/hsm/ में चलता है) को मिरर करता है ताकि उस लेआउट के बिना योगदानकर्ता भी स्थानीय रूप से सीम को गेट कर सकें।
src/
├── hsm.zig # Main API and types
├── root.zig # Module entry point
├── apdu.zig # APDU encoding/decoding
├── tlv.zig # BER-TLV parsing
├── parallel.zig # Parallel operations (thread_pool)
├── pcsc/
│ └── pcsc.zig # PC/SC transport layer (Linux/macOS/Windows)
├── piv/
│ └── piv.zig # PIV implementation
├── cac/
│ └── cac.zig # CAC implementation
├── yubikey/
│ └── yubikey.zig # YubiKey detection
└── sim/
├── sim.zig # Simulator entry point
├── transport.zig # Simulated transport
├── piv_card.zig # Simulated PIV card
└── key_material.zig # Embedded test keys
tests/
├── integration.zig # Basic integration tests
├── sim_integration.zig # Simulator integration tests
└── hil_tests.zig # Hardware-in-loop tests
examples/
├── list_tokens.zig # Token discovery example
└── piv_sign.zig # Signing example
दिशानिर्देशों के लिए CONTRIBUTING.md देखें।
MIT लाइसेंस - विवरण के लिए LICENSE देखें।
Zig 0.16.0 के साथ बनाया गया | PIV | CAC | YubiKey | PC/SC
| विकल्प | डिफ़ॉल्ट | विवरण | सुरक्षा प्रभाव |
|---|
integration_sim | false | सिम्युलेटर एकीकरण परीक्षण चलाएँ | कोई नहीं |
hsm_hil | false | हार्डवेयर-इन-लूप परीक्षण चलाएँ (वास्तविक टोकन की आवश्यकता है) | कोई नहीं |
link_pcsc | false | उदाहरणों के लिए PC/SC लाइब्रेरी लिंक करें | कोई नहीं |
include_simulator | डीबग: trueरिलीज़: false | परीक्षण कुंजियों के साथ PIV सिम्युलेटर शामिल करें | CWE-321: उत्पादन में परीक्षण कुंजियाँ |
allow_pcsc_env_override | false | सुरक्षा जोखिम: HSM_PCSC_LIB_PATH पर्यावरण चर की अनुमति दें | CWE-427: अविश्वसनीय लाइब्रेरी लोडिंग |
fips | false | लिंक किए गए FIPS-140-3 प्रदाता के माध्यम से सुरक्षा क्रिप्टो रूट करें (बंद होने पर शून्य ओवरहेड) | बंद होने पर कोई नहीं |
openssl_path | (सेट नहीं) | गैर-मानक इंस्टॉल के लिए OpenSSL इंस्टॉल प्रीफ़िक्स (जैसे /usr/local/ssl) | कोई नहीं |
| प्रकार | विवरण |
|---|
TokenKind | टोकन प्रकार: .piv, .cac, .yubikey, .unknown |
TokenInfo | खोज की गई टोकन मेटाडेटा |
Token | संचालन के लिए खुला टोकन हैंडल |
Slot | कुंजी स्लॉट: .authentication (9A), .signature (9C), .key_management (9D), .card_auth (9E) |
Algorithm | क्रिप्टो एल्गोरिदम: .ecdsa_p256, .ecdsa_p384, .rsa2048_pkcs1v15, आदि। |
Capabilities | टोकन क्षमता फ़्लैग |
PcscScope | PC/SC संदर्भ का दायरा: .user (डिफ़ॉल्ट), .system |
| फ़ंक्शन | विवरण |
|---|
listTokens(allocator, use_sim) | उपलब्ध टोकन सूचीबद्ध करें |
openToken(allocator, id, opts) | एक टोकन को ID द्वारा खोलें |
token.reconnect() | टोकन से पुनः कनेक्ट करें और प्रमाणीकरण स्थिति रीसेट करें |
token.verifyPin(pin) | PIN सत्यापित करें |
token.changePin(old, new) | PIN बदलें |
token.unblockPin(puk, new_pin) | PUK के साथ PIN अनब्लॉक करें |
token.getCertificate(slot) | DER-एन्कोडेड प्रमाणपत्र प्राप्त करें |
token.sign(slot, alg, digest) | डाइजेस्ट पर हस्ताक्षर करें |
token.decrypt(slot, alg, ciphertext) | डेटा डिक्रिप्ट करें |
token.capabilities() | टोकन क्षमताएँ प्राप्त करें |
token.close() | टोकन कनेक्शन बंद करें |
AuthenticationFailed| फ़ंक्शन | विवरण | थ्रेशोल्ड |
|---|
parallelSign(allocator, inputs, results) | स्लॉट में बैच हस्ताक्षर | 2+ आइटम |
parallelDecrypt(allocator, inputs, results) | कुंजियों में बैच डिक्रिप्शन | 2+ आइटम |
parallelTokenDiscover(readers, results) | रीडर में टोकन खोज | 2+ रीडर |
parallelCertRetrieve(allocator, requests, results) | स्लॉट में प्रमाणपत्र पुनर्प्राप्ति | 2+ अनुरोध |