Verify digital signatures in PDFs with an 8-point verification model. Browser and Node.js, React and vanilla JS. Zero external crypto dependencies.
npm install @trexolab/verifykit-reactFrom a single signature check to a full-featured PDF viewer with verification built in.
Integrity, signature, certificate chain, expiry, timestamp, revocation, algorithm, and EKU checks.
3.7x faster than JavaScript. All crypto runs in WASM with zero npm runtime dependencies.
Detects B-B, B-T, B-LT, and B-LTA conformance levels per ETSI standards.
24 composable viewer plugins. Disable what you don't need, extend with custom plugins.
Full React component library, or drop in a single UMD script for vanilla JS.
Client-side verification in the browser, or headless verification in Node.js.
Light, dark, and system modes with 100+ CSS variables for customization.
Complete type definitions for every API surface, hook, plugin, and config option.
Use independently or together. All packages share the same Rust/WASM verification core.
@trexolab/verifykit-coreRust/WASM signature verification engine
npm install @trexolab/verifykit-core@trexolab/verifykit-reactReact PDF viewer with plugin-based architecture
npm install @trexolab/verifykit-react@trexolab/verifykit-vanillaZero-build CDN/UMD drop-in viewer
npm install @trexolab/verifykit-vanilla@trexolab/verifykit-plugin-revocationOnline CRL/OCSP revocation checking
npm install @trexolab/verifykit-plugin-revocationInstall from our registry: --registry=https://verifykit.trexolab.com/api/registry
Get up and running in under a minute with React, Node.js, or vanilla JS.
import { VeriPdfProvider, Viewer, WelcomeScreen,
useVerification, defaultLayoutPlugin } from '@trexolab/verifykit-react'
import '@trexolab/verifykit-react/styles.css'
function App() {
return (
<VeriPdfProvider config={{ theme: { mode: 'system' } }}>
<PdfViewer />
</VeriPdfProvider>
)
}
function PdfViewer() {
const verification = useVerification()
const [layout] = useState(() => defaultLayoutPlugin())
if (!verification.fileBuffer) {
return <WelcomeScreen onOpenFile={(f) => verification.load(f)} />
}
return (
<Viewer
fileBuffer={verification.fileBuffer}
fileName={verification.fileName}
plugins={[layout.plugin]}
onOpenFile={(f) => verification.load(f)}
initialState={{
signatures: verification.signatures,
verificationStatus: verification.status ?? undefined,
}}
/>
)
}Every PDF signature is validated with 8 independent checks, each producing a pass/fail/warning status.
Document bytes match the signed range (tampering detection)
Cryptographic signature is mathematically valid
Certificate chains to a trusted root CA (119 AATL roots)
Certificates were valid at signing time
RFC 3161 timestamp is present and valid
Certificate not revoked (CRL/OCSP, opt-in online check)
Algorithms meet minimum strength (no SHA-1, RSA >= 2048)
Extended Key Usage permits document signing