Skip to content

fix: install custom crypto engine before pkijs parseInternalValues#44

Merged
Mythie merged 1 commit intomainfrom
fix/p12-engine-init
Mar 5, 2026
Merged

fix: install custom crypto engine before pkijs parseInternalValues#44
Mythie merged 1 commit intomainfrom
fix/p12-engine-init

Conversation

@Mythie
Copy link
Contributor

@Mythie Mythie commented Mar 5, 2026

When a P12 file uses legacy encryption (3DES, RC2) for its safe contents,
pkijs needs our custom CryptoEngine during parseInternalValues(). Previously,
the engine was only installed lazily on first getCrypto() call in
extractPrivateKey(), which runs after parseInternalValues().

This caused 'Unknown contentEncryptionAlgorithm: 1.2.840.113549.1.12.1.3'
when a legacy P12 was the first one opened in a process. Our tests masked
this because AES tests always ran first, installing the engine as a side
effect.

When a P12 file uses legacy encryption (3DES, RC2) for its safe contents,
pkijs needs our custom CryptoEngine during parseInternalValues(). Previously,
the engine was only installed lazily on first getCrypto() call in
extractPrivateKey(), which runs after parseInternalValues().

This caused 'Unknown contentEncryptionAlgorithm: 1.2.840.113549.1.12.1.3'
when a legacy P12 was the first one opened in a process. Our tests masked
this because AES tests always ran first, installing the engine as a side
effect.
@vercel
Copy link
Contributor

vercel bot commented Mar 5, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
core Ready Ready Preview, Comment Mar 5, 2026 11:22am

@Mythie Mythie merged commit 7430903 into main Mar 5, 2026
5 of 6 checks passed
@github-actions
Copy link
Contributor

github-actions bot commented Mar 5, 2026

Benchmark Results

Comparison

Load PDF

Benchmark Mean p99 RME Samples
libpdf 2.39ms 3.48ms ±1.4% 210
pdf-lib 40.35ms 52.77ms ±7.0% 13

Create blank PDF

Benchmark Mean p99 RME Samples
libpdf 67μs 132μs ±1.4% 7432
pdf-lib 429μs 1.48ms ±2.6% 1166

Add 10 pages

Benchmark Mean p99 RME Samples
libpdf 104μs 187μs ±1.0% 4828
pdf-lib 543μs 1.87ms ±2.8% 921

Draw 50 rectangles

Benchmark Mean p99 RME Samples
libpdf 309μs 793μs ±1.4% 1620
pdf-lib 1.62ms 5.64ms ±5.9% 308

Load and save PDF

Benchmark Mean p99 RME Samples
libpdf 2.36ms 2.86ms ±0.8% 212
pdf-lib 89.26ms 99.62ms ±5.3% 10

Load, modify, and save PDF

Benchmark Mean p99 RME Samples
libpdf 43.29ms 57.53ms ±8.7% 12
pdf-lib 87.12ms 97.88ms ±3.6% 10

Extract single page from 100-page PDF

Benchmark Mean p99 RME Samples
libpdf 3.64ms 5.85ms ±1.8% 138
pdf-lib 9.02ms 11.58ms ±1.6% 56

Split 100-page PDF into single-page PDFs

Benchmark Mean p99 RME Samples
libpdf 33.09ms 36.62ms ±2.4% 16
pdf-lib 104.41ms 128.81ms ±20.8% 5

Split 2000-page PDF into single-page PDFs (0.9MB)

Benchmark Mean p99 RME Samples
libpdf 614.77ms 614.77ms ±0.0% 1
pdf-lib 1.64s 1.64s ±0.0% 1

Copy 10 pages between documents

Benchmark Mean p99 RME Samples
libpdf 4.58ms 5.51ms ±1.2% 110
pdf-lib 12.01ms 14.60ms ±1.7% 42

Merge 2 x 100-page PDFs

Benchmark Mean p99 RME Samples
libpdf 14.11ms 23.23ms ±4.1% 36
pdf-lib 53.31ms 54.52ms ±1.0% 10
Copying

Copy pages between documents

Benchmark Mean p99 RME Samples
copy 1 page 995μs 2.00ms ±2.7% 503
copy 10 pages from 100-page PDF 4.52ms 8.23ms ±2.3% 111
copy all 100 pages 7.22ms 7.95ms ±0.8% 70

Duplicate pages within same document

Benchmark Mean p99 RME Samples
duplicate page 0 868μs 1.23ms ±0.8% 577
duplicate all pages (double the document) 875μs 1.62ms ±1.2% 572

Merge PDFs

Benchmark Mean p99 RME Samples
merge 2 small PDFs 1.49ms 2.48ms ±1.9% 336
merge 10 small PDFs 7.36ms 9.77ms ±1.2% 68
merge 2 x 100-page PDFs 13.44ms 13.98ms ±0.6% 38
Drawing

benchmarks/drawing.bench.ts

Benchmark Mean p99 RME Samples
draw 100 rectangles 581μs 1.46ms ±3.4% 862
draw 100 circles 1.28ms 2.84ms ±2.8% 390
draw 100 lines 498μs 1.09ms ±1.4% 1004
draw 100 text lines (standard font) 1.57ms 2.28ms ±1.2% 320
create 10 pages with mixed content 1.31ms 2.16ms ±1.4% 383
Forms

benchmarks/forms.bench.ts

Benchmark Mean p99 RME Samples
get form fields 3.37ms 8.91ms ±4.6% 149
fill text fields 10.73ms 14.58ms ±3.4% 47
read field values 3.00ms 5.32ms ±1.8% 167
flatten form 8.30ms 11.49ms ±2.6% 61
Loading

benchmarks/loading.bench.ts

Benchmark Mean p99 RME Samples
load small PDF (888B) 61μs 150μs ±0.8% 8210
load medium PDF (19KB) 94μs 144μs ±0.5% 5295
load form PDF (116KB) 1.42ms 2.43ms ±1.3% 353
load heavy PDF (9.9MB) 2.41ms 2.85ms ±0.7% 208
Saving

benchmarks/saving.bench.ts

Benchmark Mean p99 RME Samples
save unmodified (19KB) 106μs 236μs ±0.8% 4711
save with modifications (19KB) 747μs 1.41ms ±1.5% 670
incremental save (19KB) 161μs 337μs ±1.0% 3105
save heavy PDF (9.9MB) 2.28ms 2.76ms ±1.1% 220
incremental save heavy PDF (9.9MB) 8.01ms 9.34ms ±2.7% 63
Splitting

Extract single page

Benchmark Mean p99 RME Samples
extractPages (1 page from small PDF) 962μs 1.92ms ±2.9% 520
extractPages (1 page from 100-page PDF) 3.56ms 6.56ms ±2.2% 141
extractPages (1 page from 2000-page PDF) 55.22ms 55.63ms ±0.3% 10

Split into single-page PDFs

Benchmark Mean p99 RME Samples
split 100-page PDF (0.1MB) 31.58ms 38.13ms ±5.0% 16
split 2000-page PDF (0.9MB) 562.97ms 562.97ms ±0.0% 1

Batch page extraction

Benchmark Mean p99 RME Samples
extract first 10 pages from 2000-page PDF 57.26ms 58.52ms ±1.1% 9
extract first 100 pages from 2000-page PDF 60.40ms 63.37ms ±1.8% 9
extract every 10th page from 2000-page PDF (200 pages) 64.36ms 65.05ms ±0.6% 8
Environment
  • Runner: Linux (X64)
  • Runtime: Bun 1.3.10

Results are machine-dependent.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant