diff --git a/benchmarks/README.md b/benchmarks/README.md
index f5ffeb6..611175a 100644
--- a/benchmarks/README.md
+++ b/benchmarks/README.md
@@ -5,53 +5,104 @@ Made with [mitata](https://github.com/evanwashere/mitata) library
## Signing
+
+ HS256
+
+## HS256
+```
+clk: ~3.18 GHz
+cpu: Apple M2 Pro
+runtime: node 22.11.0 (arm64-darwin)
+
+benchmark avg (min … max) p75 / p99 (min … top 1%)
+---------------------------------------------------- -------------------------------
+HS256 - jose (sync) 2.99 µs/iter 2.79 µs █
+ (2.50 µs … 756.75 µs) 6.46 µs █
+ (176.00 b … 975.45 kb) 2.93 kb ▁█▄▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
+
+HS256 - jsonwebtoken (sync) 2.95 µs/iter 2.83 µs █
+ (2.58 µs … 534.75 µs) 6.00 µs █
+ (352.00 b … 791.84 kb) 3.72 kb ▆█▅▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
+
+HS256 - jsonwebtoken (async) 3.60 µs/iter 3.65 µs ▃█▃ ▃
+ (3.52 µs … 3.70 µs) 3.69 µs ▂▂▂ ███▇ ▂ ▂█▇
+ (864.48 b … 3.09 kb) 2.85 kb ███▆▆████▆█▆▁▆▆▆███▆▆
+
+HS256 - fast-jwt (sync) 2.09 µs/iter 2.18 µs █▃
+ (1.97 µs … 2.26 µs) 2.24 µs ▂█ ██ ▂ ▂▂
+ ( 1.48 kb … 1.50 kb) 1.49 kb ███▆██▅▃▁▁▁▁▁▅█▆▅████
+
+HS256 - fast-jwt (async) 3.55 µs/iter 3.56 µs █
+ (3.29 µs … 3.86 µs) 3.79 µs ▆█
+ ( 3.44 kb … 3.55 kb) 3.52 kb ▂▁▁▁▁▁▁▁██▇█▄▁▅▁▁▁▁▄▂
+
+HS256 - @node-rs/jsonwebtoken (sync) 2.65 µs/iter 2.66 µs ▆█
+ (2.62 µs … 2.79 µs) 2.73 µs ▅██▂██▅▂
+ ( 1.27 kb … 1.27 kb) 1.27 kb ▃▆████████▆▃▁▁▃▁▁▃▁▁▃
+
+HS256 - @node-rs/jsonwebtoken (async) 9.63 µs/iter 9.79 µs █
+ (7.67 µs … 217.17 µs) 15.25 µs ▂█▄▃
+ ( 1.79 kb … 193.80 kb) 2.21 kb ▁▁▂████▂▁▁▁▁▁▁▁▁▁▁▁▁▁
+
+summary
+ HS256 - fast-jwt (sync)
+ 1.27x faster than HS256 - @node-rs/jsonwebtoken (sync)
+ 1.41x faster than HS256 - jsonwebtoken (sync)
+ 1.43x faster than HS256 - jose (sync)
+ 1.7x faster than HS256 - fast-jwt (async)
+ 1.72x faster than HS256 - jsonwebtoken (async)
+ 4.61x faster than HS256 - @node-rs/jsonwebtoken (async)
+```
+
+
+
HS512
## HS512
```
-clk: ~3.82 GHz
-cpu: Apple M3 Pro
-runtime: node 22.13.1 (arm64-darwin)
+clk: ~3.28 GHz
+cpu: Apple M2 Pro
+runtime: node 22.11.0 (arm64-darwin)
benchmark avg (min … max) p75 / p99 (min … top 1%)
---------------------------------------------------- -------------------------------
-HS512 - jose (sync) 3.29 µs/iter 2.75 µs █
- (2.54 µs … 2.61 ms) 6.08 µs █
- (512.00 b … 1.03 mb) 2.97 kb ▅█▃▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
+HS512 - jose (sync) 2.93 µs/iter 2.96 µs █
+ (2.81 µs … 3.21 µs) 3.20 µs ▇ ▇█ ▄
+ (801.16 b … 2.74 kb) 2.53 kb █▃▃▁▆████▅▁▃▅▃▃▁▃▁▁▁▃
-HS512 - jsonwebtoken (sync) 215.65 µs/iter 217.63 µs ▂█
- (206.17 µs … 493.79 µs) 250.21 µs ▄██▃█▃
- ( 5.55 kb … 788.38 kb) 8.87 kb ▁██████▆▃▂▂▂▁▁▁▁▁▁▁▁▁
+HS512 - jsonwebtoken (sync) 3.00 µs/iter 3.01 µs ██▃
+ (2.91 µs … 3.15 µs) 3.14 µs ▇ ███▅
+ ( 3.56 kb … 3.56 kb) 3.56 kb ▃▆█▆▃▃█████▁▁▁▃▁▁▃▁▁▆
-HS512 - jsonwebtoken (async) 212.88 µs/iter 212.75 µs █
- (204.54 µs … 338.88 µs) 245.46 µs █
- ( 5.73 kb … 574.96 kb) 6.23 kb ▂▃██▆▄▂▂▁▂▂▂▁▁▁▁▁▁▁▁▁
+HS512 - jsonwebtoken (async) 3.89 µs/iter 3.90 µs ▂ ▂█
+ (3.82 µs … 4.07 µs) 4.03 µs █▇██
+ ( 3.02 kb … 3.13 kb) 3.09 kb ▇▁▇▇████▄▇▇▁▁▁▄▁▁▄▁▁▄
-HS512 - fast-jwt (sync) 2.31 µs/iter 2.45 µs █
- (2.19 µs … 2.47 µs) 2.47 µs █▇ ▇▂
- ( 1.57 kb … 1.57 kb) 1.57 kb ▃███▁▁▁▁▁▁▁▁▁▁▁▁▁▂███
+HS512 - fast-jwt (sync) 2.49 µs/iter 2.56 µs ▅█ ▅ ▂
+ (2.38 µs … 2.63 µs) 2.62 µs ██▅ ▇█ █▇▅ ▂▇
+ ( 1.60 kb … 1.60 kb) 1.60 kb ███▇▇██▄▁▁▁▄▁███▄▇██▄
-HS512 - fast-jwt (async) 3.93 µs/iter 3.93 µs █
- (3.78 µs … 4.53 µs) 4.35 µs ▃█▃▃
- (700.39 b … 3.52 kb) 1.36 kb ████▅▃▃▁▁▅▁▃▁▃▁▃▃▁▁▃▃
+HS512 - fast-jwt (async) 3.95 µs/iter 3.99 µs ▂█▅ ▂
+ (3.69 µs … 4.17 µs) 4.06 µs ███▂█▅
+ ( 3.50 kb … 3.60 kb) 3.57 kb ▄▁▁▄▁▁▁▁▁▁▁▁██████▄▄▄
-HS512 - @node-rs/jsonwebtoken (sync) 2.80 µs/iter 2.79 µs █
- (2.62 µs … 123.29 µs) 3.29 µs ▃ █▃
- ( 1.33 kb … 97.41 kb) 1.38 kb ▁▃█▆██▄▃▁▅▅▂▁▁▁▁▁▁▁▁▁
+HS512 - @node-rs/jsonwebtoken (sync) 3.34 µs/iter 3.35 µs █▂
+ (3.31 µs … 3.42 µs) 3.40 µs ▅▅▇▂▂ ██▂▂
+ ( 1.30 kb … 1.31 kb) 1.31 kb █████▄████▇▄▁▄▄▄▁▁▁▁▄
-HS512 - @node-rs/jsonwebtoken (async) 12.04 µs/iter 12.88 µs █
- (8.13 µs … 127.04 µs) 14.46 µs ▄▂ ▇█▂
- ( 1.84 kb … 129.84 kb) 2.26 kb ▁▁▂▁▃▃▄▄▃██▄▇▆███▃▁▁▁
+HS512 - @node-rs/jsonwebtoken (async) 12.64 µs/iter 13.00 µs █▆▂
+ (8.67 µs … 115.13 µs) 17.42 µs ████
+ ( 1.83 kb … 193.84 kb) 2.25 kb ▁▁▁▁▁▄▆█████▃▃▂▁▁▁▁▁▁
summary
HS512 - fast-jwt (sync)
- 1.21x faster than HS512 - @node-rs/jsonwebtoken (sync)
- 1.42x faster than HS512 - jose (sync)
- 1.7x faster than HS512 - fast-jwt (async)
- 5.21x faster than HS512 - @node-rs/jsonwebtoken (async)
- 92.19x faster than HS512 - jsonwebtoken (async)
- 93.39x faster than HS512 - jsonwebtoken (sync)
+ 1.18x faster than HS512 - jose (sync)
+ 1.21x faster than HS512 - jsonwebtoken (sync)
+ 1.34x faster than HS512 - @node-rs/jsonwebtoken (sync)
+ 1.57x faster than HS512 - jsonwebtoken (async)
+ 1.59x faster than HS512 - fast-jwt (async)
+ 5.08x faster than HS512 - @node-rs/jsonwebtoken (async)
```
@@ -61,48 +112,48 @@ summary
## ES512
```
-clk: ~3.77 GHz
-cpu: Apple M3 Pro
-runtime: node 22.13.1 (arm64-darwin)
+clk: ~3.29 GHz
+cpu: Apple M2 Pro
+runtime: node 22.11.0 (arm64-darwin)
benchmark avg (min … max) p75 / p99 (min … top 1%)
---------------------------------------------------- -------------------------------
-ES512 - jose (sync) 1.09 ms/iter 1.11 ms █ ▂
- (1.03 ms … 1.20 ms) 1.17 ms ▃█▄▂▃▅█
- ( 3.27 kb … 1.29 mb) 8.53 kb ▃▆█▇▇████████▄▄▂▂▃▁▂▁
+ES512 - jose (sync) 1.37 ms/iter 1.38 ms █
+ (1.33 ms … 1.53 ms) 1.45 ms █ █▅
+ ( 3.66 kb … 1.44 mb) 9.53 kb ▅█▇▄▄▄▃██▇▇▅▃▃▃▂▂▂▁▁▁
-ES512 - jsonwebtoken (sync) 1.37 ms/iter 1.39 ms █▄ ▂▇
- (1.34 ms … 1.55 ms) 1.41 ms ▇███▇ ██▇
- ( 6.05 kb … 55.27 kb) 7.75 kb ▁▁▅██████▆▄▄▆████▇▅▁▁
+ES512 - jsonwebtoken (sync) 1.38 ms/iter 1.39 ms ▂ ▄█
+ (1.34 ms … 1.56 ms) 1.45 ms █▄ ███▃
+ ( 6.02 kb … 24.08 kb) 7.12 kb ▅████▅▆█████▄▅▃▂▂▂▁▂▂
-ES512 - jsonwebtoken (async) 1.38 ms/iter 1.39 ms ▅ █▄
- (1.30 ms … 1.48 ms) 1.46 ms █▅ ██
- ( 6.52 kb … 2.25 mb) 16.67 kb ▂▂▂▁▂▁▄██▅▃██▆▃▂▂▁▂▂▂
+ES512 - jsonwebtoken (async) 1.37 ms/iter 1.36 ms █
+ (1.34 ms … 2.51 ms) 1.54 ms ██▆
+ ( 9.45 kb … 763.13 kb) 14.00 kb ███▆▃▂▂▂▂▂▃▁▁▂▁▁▁▁▁▁▁
-ES512 - fast-jwt (sync) 1.08 ms/iter 1.10 ms █
- (1.03 ms … 1.19 ms) 1.15 ms ▂▅▂█▃▆█▆█▄▇█▂
- ( 2.13 kb … 964.52 kb) 5.15 kb ▆█████████████▅▃▅▃▃▂▃
+ES512 - fast-jwt (sync) 1.38 ms/iter 1.39 ms █
+ (1.33 ms … 2.12 ms) 1.58 ms ▄█▄
+ ( 2.57 kb … 99.04 kb) 3.57 kb ███▆▃▂▃▃▂▄▄▂▂▂▂▁▂▁▁▁▁
-ES512 - fast-jwt (async) 1.32 ms/iter 1.34 ms ▆▇▅█ ▃▃
- (1.27 ms … 1.46 ms) 1.41 ms ▃ ███████▆
- ( 5.08 kb … 1.66 mb) 11.63 kb ▄▅██████████▄▂▆█▆▃▁▁▁
+ES512 - fast-jwt (async) 1.64 ms/iter 1.64 ms ▂█
+ (1.57 ms … 1.96 ms) 1.94 ms ██▄
+ ( 5.05 kb … 1.48 mb) 10.42 kb ███▄▃▂▂▃▃▃▂▂▁▂▁▂▂▂▃▂▂
-ES512 - @node-rs/jsonwebtoken (sync) 2.39 µs/iter 2.39 µs ▂█
- (2.37 µs … 2.50 µs) 2.50 µs ▃███
- ( 1.27 kb … 1.27 kb) 1.27 kb ████▆▇▅▁▁▂▁▂▁▁▂▁▁▁▁▁▂
+ES512 - @node-rs/jsonwebtoken (sync) 2.96 µs/iter 2.97 µs █ ▅▅▅▅
+ (2.90 µs … 3.03 µs) 3.01 µs ███████
+ ( 1.27 kb … 1.27 kb) 1.27 kb ▄▄▄█▁▁▄████████▄█▁▁▁▄
-ES512 - @node-rs/jsonwebtoken (async) 9.32 µs/iter 9.28 µs ▂ █
- (9.09 µs … 10.31 µs) 9.85 µs █ █▅
- ( 1.71 kb … 1.84 kb) 1.74 kb █▇██▁▇▇▁▁▁▇▁▁▁▁▁▁▁▁▁▇
+ES512 - @node-rs/jsonwebtoken (async) 11.10 µs/iter 12.71 µs █
+ (8.29 µs … 168.33 µs) 17.29 µs ▄█▃
+ ( 1.80 kb … 193.80 kb) 2.24 kb ▁▂▂███▂▁▁▁▄▇▄▂▂▁▁▁▁▁▁
summary
ES512 - @node-rs/jsonwebtoken (sync)
- 3.9x faster than ES512 - @node-rs/jsonwebtoken (async)
- 451.18x faster than ES512 - fast-jwt (sync)
- 454.82x faster than ES512 - jose (sync)
- 554.33x faster than ES512 - fast-jwt (async)
- 574.96x faster than ES512 - jsonwebtoken (sync)
- 576.72x faster than ES512 - jsonwebtoken (async)
+ 3.75x faster than ES512 - @node-rs/jsonwebtoken (async)
+ 462.07x faster than ES512 - jsonwebtoken (async)
+ 463.55x faster than ES512 - jose (sync)
+ 464.51x faster than ES512 - jsonwebtoken (sync)
+ 466.29x faster than ES512 - fast-jwt (sync)
+ 552.88x faster than ES512 - fast-jwt (async)
```
@@ -112,48 +163,48 @@ summary
## RS512
```
-clk: ~3.80 GHz
-cpu: Apple M3 Pro
-runtime: node 22.13.1 (arm64-darwin)
+clk: ~3.29 GHz
+cpu: Apple M2 Pro
+runtime: node 22.11.0 (arm64-darwin)
benchmark avg (min … max) p75 / p99 (min … top 1%)
---------------------------------------------------- -------------------------------
-RS512 - jose (sync) 2.54 ms/iter 2.53 ms █
- (2.51 ms … 3.14 ms) 3.11 ms █▂
- ( 4.80 kb … 14.85 kb) 4.93 kb ██▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▂
+RS512 - jose (sync) 3.31 ms/iter 3.31 ms ▅█
+ (3.26 ms … 4.06 ms) 4.02 ms ██
+ ( 4.87 kb … 5.09 kb) 4.88 kb ██▇▃▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▂
-RS512 - jsonwebtoken (sync) 3.40 ms/iter 3.40 ms █▆▂
- (3.36 ms … 3.59 ms) 3.54 ms ███▄
- ( 8.89 kb … 57.29 kb) 9.37 kb ▆████▆▃▂▂▂▁▁▁▁▁▁▁▁▁▁▂
+RS512 - jsonwebtoken (sync) 3.31 ms/iter 3.31 ms ▇█
+ (3.26 ms … 4.06 ms) 4.01 ms ██
+ ( 7.91 kb … 9.31 kb) 8.29 kb ██▅▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▂
-RS512 - jsonwebtoken (async) 3.39 ms/iter 3.40 ms ▆▆█
- (3.37 ms … 3.54 ms) 3.46 ms ▅███▇ ▂
- ( 9.28 kb … 57.28 kb) 9.53 kb ▄████████▆▅▄▃▁▂▁▂▁▁▁▂
+RS512 - jsonwebtoken (async) 3.33 ms/iter 3.32 ms ▆█
+ (3.26 ms … 4.13 ms) 4.03 ms ██▃
+ ( 11.70 kb … 21.41 kb) 12.06 kb ███▂▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▂
-RS512 - fast-jwt (sync) 2.54 ms/iter 2.53 ms █
- (2.51 ms … 3.15 ms) 3.12 ms █▂
- ( 4.41 kb … 7.91 kb) 4.45 kb ██▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
+RS512 - fast-jwt (sync) 3.30 ms/iter 3.30 ms █▃
+ (3.26 ms … 4.04 ms) 4.01 ms ██
+ ( 4.41 kb … 7.91 kb) 4.48 kb ██▅▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
-RS512 - fast-jwt (async) 3.52 ms/iter 3.55 ms ▅█
- (3.37 ms … 3.68 ms) 3.60 ms ▅██▅
- ( 9.85 kb … 291.22 kb) 11.55 kb ▁▄▂▄▂▁▁▂▁▂▁▂▇████▆▁▁▂
+RS512 - fast-jwt (async) 4.34 ms/iter 4.34 ms ▂▅█
+ (4.27 ms … 4.74 ms) 4.66 ms ███
+ ( 9.95 kb … 13.37 kb) 10.01 kb ▄████▇▂▄▂▁▁▃▂▂▂▁▁▁▂▁▃
-RS512 - @node-rs/jsonwebtoken (sync) 2.54 ms/iter 2.54 ms █
- (2.49 ms … 2.68 ms) 2.68 ms █▆
- ( 2.01 kb … 2.28 kb) 2.03 kb ▁▃▃▃██▆▃▂▂▁▁▁▁▁▁▂▁▁▂▁
+RS512 - @node-rs/jsonwebtoken (sync) 3.16 ms/iter 3.18 ms █▇█ ▅▃
+ (3.13 ms … 3.31 ms) 3.25 ms ██████▆▆
+ ( 2.02 kb … 2.27 kb) 2.02 kb █████████▇▆▇▅▄▃▄▁▂▃▁▂
-RS512 - @node-rs/jsonwebtoken (async) 2.48 ms/iter 2.54 ms █
- (2.44 ms … 2.59 ms) 2.58 ms █
- ( 2.63 kb … 2.95 kb) 2.63 kb ███▇▄▂▂▁▂▁▂▂▂▂▂▆▇▄▃▃▂
+RS512 - @node-rs/jsonwebtoken (async) 3.18 ms/iter 3.20 ms █
+ (3.15 ms … 3.31 ms) 3.26 ms ▄██▆███▃▄▃▂
+ ( 2.63 kb … 2.87 kb) 2.63 kb ███████████▄▇▃▇▂▂▃▃▃▂
summary
- RS512 - @node-rs/jsonwebtoken (async)
- 1.02x faster than RS512 - fast-jwt (sync)
- 1.02x faster than RS512 - jose (sync)
- 1.02x faster than RS512 - @node-rs/jsonwebtoken (sync)
- 1.37x faster than RS512 - jsonwebtoken (async)
- 1.37x faster than RS512 - jsonwebtoken (sync)
- 1.42x faster than RS512 - fast-jwt (async)
+ RS512 - @node-rs/jsonwebtoken (sync)
+ 1.01x faster than RS512 - @node-rs/jsonwebtoken (async)
+ 1.04x faster than RS512 - fast-jwt (sync)
+ 1.05x faster than RS512 - jsonwebtoken (sync)
+ 1.05x faster than RS512 - jose (sync)
+ 1.05x faster than RS512 - jsonwebtoken (async)
+ 1.37x faster than RS512 - fast-jwt (async)
```
@@ -163,48 +214,48 @@ summary
## PS512
```
-clk: ~3.81 GHz
-cpu: Apple M3 Pro
-runtime: node 22.13.1 (arm64-darwin)
+clk: ~3.28 GHz
+cpu: Apple M2 Pro
+runtime: node 22.11.0 (arm64-darwin)
benchmark avg (min … max) p75 / p99 (min … top 1%)
---------------------------------------------------- -------------------------------
-PS512 - jose (sync) 2.62 ms/iter 2.68 ms █
- (2.52 ms … 3.33 ms) 3.14 ms █
- ( 4.91 kb … 6.01 kb) 4.95 kb ██▂▁▇█▅▄▂▁▁▃▁▂▁▁▁▁▁▁▂
+PS512 - jose (sync) 3.39 ms/iter 3.40 ms █
+ (3.27 ms … 4.65 ms) 4.17 ms █▆
+ ( 4.91 kb … 5.52 kb) 4.95 kb ███▇▆▄▂▂▂▂▁▁▁▁▁▁▁▁▁▁▂
-PS512 - jsonwebtoken (sync) 3.38 ms/iter 3.39 ms ▅█
- (3.35 ms … 3.54 ms) 3.43 ms ▂█▇███▅▂
- ( 7.88 kb … 56.47 kb) 9.16 kb ▅▇█████████▇▂▆▃▃▂▁▁▁▃
+PS512 - jsonwebtoken (sync) 3.41 ms/iter 3.40 ms █
+ (3.26 ms … 5.73 ms) 4.63 ms █
+ ( 6.97 kb … 9.31 kb) 8.16 kb ██▇▆▂▁▁▁▁▁▁▁▂▁▁▁▁▁▁▁▁
-PS512 - jsonwebtoken (async) 3.53 ms/iter 3.55 ms █▅
- (3.38 ms … 3.61 ms) 3.58 ms ▂▆██
- ( 8.13 kb … 20.29 kb) 9.14 kb ▂▃▂▂▂▁▁▂▁▁▂▂▃▄█████▄▂
+PS512 - jsonwebtoken (async) 3.35 ms/iter 3.34 ms █
+ (3.26 ms … 4.15 ms) 4.04 ms ▇█
+ ( 10.45 kb … 59.93 kb) 12.68 kb ███▅▃▂▂▂▂▁▁▁▁▁▁▁▁▁▁▁▂
-PS512 - fast-jwt (sync) 2.56 ms/iter 2.54 ms █
- (2.52 ms … 3.13 ms) 3.11 ms █▂
- ( 3.75 kb … 38.49 kb) 4.56 kb ██▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▂
+PS512 - fast-jwt (sync) 3.33 ms/iter 3.33 ms █
+ (3.26 ms … 4.07 ms) 4.02 ms ▄█▃
+ ( 3.89 kb … 53.63 kb) 4.72 kb ███▃▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
-PS512 - fast-jwt (async) 3.37 ms/iter 3.38 ms ▅█▂
- (3.35 ms … 3.50 ms) 3.46 ms ▄▇███▂
- ( 9.13 kb … 1.16 mb) 15.69 kb ▃██████▇▅▃▃▄▁▁▁▃▂▁▁▁▂
+PS512 - fast-jwt (async) 4.32 ms/iter 4.34 ms ▄█
+ (4.26 ms … 4.72 ms) 4.60 ms ███▄▂
+ ( 9.15 kb … 41.28 kb) 10.15 kb ▅█████▇█▃▂▂▂▂▁▁▂▁▁▁▁▂
-PS512 - @node-rs/jsonwebtoken (sync) 2.44 ms/iter 2.44 ms █
- (2.43 ms … 2.72 ms) 2.59 ms █▃
- ( 2.02 kb … 2.28 kb) 2.03 kb ███▅▄▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
+PS512 - @node-rs/jsonwebtoken (sync) 3.17 ms/iter 3.18 ms █ ▄
+ (3.14 ms … 3.32 ms) 3.31 ms ███▆▂
+ ( 2.02 kb … 2.09 kb) 2.02 kb ▆██████▇▃▁▁▂▁▁▂▁▁▁▁▁▂
-PS512 - @node-rs/jsonwebtoken (async) 2.59 ms/iter 2.61 ms █▄
- (2.45 ms … 2.84 ms) 2.79 ms ██▅ ▅
- ( 2.63 kb … 2.95 kb) 2.64 kb ▃▄▂▂▂▁█████▅▂▁▁▁▁▂▂▂▁
+PS512 - @node-rs/jsonwebtoken (async) 3.19 ms/iter 3.20 ms █▂ ▄
+ (3.16 ms … 3.33 ms) 3.26 ms ██▇█▆ ▆▆
+ ( 2.63 kb … 2.87 kb) 2.63 kb ███████████▇▇▃▆▃▅▁▁▁▃
summary
PS512 - @node-rs/jsonwebtoken (sync)
+ 1.01x faster than PS512 - @node-rs/jsonwebtoken (async)
1.05x faster than PS512 - fast-jwt (sync)
- 1.06x faster than PS512 - @node-rs/jsonwebtoken (async)
+ 1.05x faster than PS512 - jsonwebtoken (async)
1.07x faster than PS512 - jose (sync)
- 1.38x faster than PS512 - fast-jwt (async)
- 1.38x faster than PS512 - jsonwebtoken (sync)
- 1.44x faster than PS512 - jsonwebtoken (async)
+ 1.07x faster than PS512 - jsonwebtoken (sync)
+ 1.36x faster than PS512 - fast-jwt (async)
```
@@ -214,38 +265,38 @@ summary
## EdDSA
```
-clk: ~3.82 GHz
-cpu: Apple M3 Pro
-runtime: node 22.13.1 (arm64-darwin)
+clk: ~3.29 GHz
+cpu: Apple M2 Pro
+runtime: node 22.11.0 (arm64-darwin)
benchmark avg (min … max) p75 / p99 (min … top 1%)
---------------------------------------------------- -------------------------------
-EdDSA - jose (sync) 25.57 µs/iter 25.59 µs █
- (24.87 µs … 27.14 µs) 25.78 µs ██ █
- ( 3.18 kb … 3.18 kb) 3.18 kb █▁▁▁▁█▁▁▁▁▁▁███▁█▁▁▁█
+EdDSA - jose (sync) 30.39 µs/iter 29.89 µs █
+ (29.35 µs … 37.81 µs) 30.10 µs ▅ ▅ ▅ █ ▅ ▅ ▅▅ ▅ ▅
+ ( 3.23 kb … 3.23 kb) 3.23 kb █▁█▁▁█▁█▁▁█▁█▁██▁▁█▁█
-EdDSA - fast-jwt (sync) 25.15 µs/iter 25.42 µs █ █
- (24.43 µs … 25.91 µs) 25.87 µs █ █ █
- ( 1.89 kb … 1.89 kb) 1.89 kb █▁▁█▁▁▁█▁▁▁▁█▁█▁▁▁▁▁█
+EdDSA - fast-jwt (sync) 29.24 µs/iter 29.21 µs █
+ (28.88 µs … 30.95 µs) 29.32 µs █ ▅ ▅▅▅▅▅ ▅▅ ▅
+ ( 1.89 kb … 1.90 kb) 1.89 kb █▁▁█▁▁▁▁█████▁▁██▁▁▁█
-EdDSA - fast-jwt (async) 265.45 µs/iter 273.42 µs ▅█▆
- (251.46 µs … 335.13 µs) 289.17 µs ███▆ ▂
- ( 3.93 kb … 900.73 kb) 7.22 kb ▁▃█████▇▆▃▄▄▅██▇▅▂▂▂▁
+EdDSA - fast-jwt (async) 267.19 µs/iter 269.42 µs █ ▂
+ (259.33 µs … 781.96 µs) 308.71 µs ███
+ ( 4.05 kb … 661.27 kb) 6.61 kb ████▇▇▅▃▃▂▂▂▁▁▁▁▁▁▁▁▁
-EdDSA - @node-rs/jsonwebtoken (sync) 2.46 µs/iter 2.46 µs █ ▃█
- (2.44 µs … 2.51 µs) 2.51 µs ██▆████▆
- ( 1.27 kb … 1.27 kb) 1.27 kb █████████▄█▄▁▄▁▁▁▆▁▁▄
+EdDSA - @node-rs/jsonwebtoken (sync) 3.00 µs/iter 3.02 µs ██
+ (2.93 µs … 3.06 µs) 3.05 µs ▅▂ ▂ ▂██▅▇ ▂
+ ( 1.27 kb … 1.27 kb) 1.27 kb ▄██▄▇▄▄█▄▄▁▄█████▇▁█▄
-EdDSA - @node-rs/jsonwebtoken (async) 9.03 µs/iter 9.07 µs █ █ █
- (8.80 µs … 9.41 µs) 9.35 µs ▅ ▅▅█▅▅ █▅█ ▅ ▅
- ( 1.71 kb … 1.84 kb) 1.74 kb █▁█████▁███▁▁▁▁▁█▁▁▁█
+EdDSA - @node-rs/jsonwebtoken (async) 10.88 µs/iter 10.58 µs ▇█
+ (8.33 µs … 130.92 µs) 17.63 µs ██
+ ( 1.80 kb … 129.80 kb) 2.20 kb ▁▁▅██▇▂▂▁▁▃▄▄▃▂▂▁▁▁▁▁
summary
EdDSA - @node-rs/jsonwebtoken (sync)
- 3.68x faster than EdDSA - @node-rs/jsonwebtoken (async)
- 10.24x faster than EdDSA - fast-jwt (sync)
- 10.41x faster than EdDSA - jose (sync)
- 108.07x faster than EdDSA - fast-jwt (async)
+ 3.63x faster than EdDSA - @node-rs/jsonwebtoken (async)
+ 9.76x faster than EdDSA - fast-jwt (sync)
+ 10.14x faster than EdDSA - jose (sync)
+ 89.14x faster than EdDSA - fast-jwt (async)
```
@@ -258,43 +309,43 @@ summary
## RS512
```
-clk: ~3.77 GHz
-cpu: Apple M3 Pro
-runtime: node 22.13.1 (arm64-darwin)
+clk: ~3.26 GHz
+cpu: Apple M2 Pro
+runtime: node 22.11.0 (arm64-darwin)
benchmark avg (min … max) p75 / p99 (min … top 1%)
---------------------------------------------- -------------------------------
-RS512 - fast-jwt 954.83 ns/iter 915.65 ns █
- (875.42 ns … 3.81 µs) 2.16 µs █▅
- (181.47 b … 458.22 b) 456.27 b ██▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
+RS512 - fast-jwt 1.10 µs/iter 1.11 µs █▃
+ (1.06 µs … 1.17 µs) 1.15 µs ▂██▅
+ (336.29 b … 458.22 b) 457.16 b ▃████▃▄████▆▄▃▃▃▂▃▃▂▃
-RS512 - fast-jwt (complete) 906.17 ns/iter 912.27 ns █ ▃
- (887.33 ns … 967.28 ns) 942.81 ns ▅███▃
- (366.35 b … 578.23 b) 576.75 b ▃▆█████▇███▆▆▃▃▁▂▃▃▃▃
+RS512 - fast-jwt (complete) 1.09 µs/iter 1.10 µs ▄█
+ (1.06 µs … 1.18 µs) 1.16 µs ▇██▇▂
+ (461.23 b … 578.24 b) 577.20 b ▇██████▆▇▆▅▅▇▄▅▃▂▂▁▁▂
-RS512 - jsonwebtoken 1.60 µs/iter 1.62 µs ▂█▃
- (1.50 µs … 1.64 µs) 1.64 µs ███ ▃
- (857.28 b … 867.15 b) 866.94 b ▂▁█▆▆▄▁▃▂▃▁▁▁▄█████▆▇
+RS512 - jsonwebtoken 1.86 µs/iter 1.86 µs ▄█
+ (1.81 µs … 1.89 µs) 1.89 µs ▂███▄
+ (857.28 b … 867.14 b) 866.93 b ▂▂▁▁▁▄▂▄▆█████▅▅▅▅█▄▂
-RS512 - jsonwebtoken (complete) 1.54 µs/iter 1.54 µs █ ▂
- (1.50 µs … 1.62 µs) 1.61 µs █▅██
- (858.64 b … 891.16 b) 874.72 b ▅▄▅████▇▇▇▃▂▂▂▁▁▁▁▂▁▂
+RS512 - jsonwebtoken (complete) 1.86 µs/iter 1.87 µs ███ █
+ (1.81 µs … 1.90 µs) 1.90 µs ▅██████▅ ▅
+ (858.54 b … 891.17 b) 871.30 b ▆▃▁▆▃▁█▃▆████████▃██▆
-RS512 - jose 729.27 ns/iter 739.02 ns ▅█
- (697.98 ns … 802.89 ns) 794.22 ns ▄██▄ ▃
- (426.12 b … 440.21 b) 435.68 b ▂██████▇█▆▄▄▇▃▆▅▃▂▂▂▂
+RS512 - jose 849.59 ns/iter 856.30 ns ▄█▅
+ (820.44 ns … 891.41 ns) 889.56 ns ▇███▅
+ (276.84 b … 426.25 b) 425.28 b ▂▃▂▃██████▅▅▇▇█▅▂▄▂▂▂
-RS512 - jose (complete) 755.40 ns/iter 761.68 ns ▆█
- (692.05 ns … 803.89 ns) 792.38 ns ▅▅██▂
- (414.52 b … 446.12 b) 439.48 b ▂▁▁▁▁▁▁▁▁▄██████▅▂▅▃▂
+RS512 - jose (complete) 880.87 ns/iter 887.38 ns ▄█▅
+ (835.35 ns … 930.96 ns) 919.86 ns ▂▆███
+ (414.49 b … 446.12 b) 438.27 b ▂▂▁▃▅▄▂▇█████▇▇▄▄▅▂▃▃
summary
RS512 - jose
1.04x faster than RS512 - jose (complete)
- 1.24x faster than RS512 - fast-jwt (complete)
- 1.31x faster than RS512 - fast-jwt
- 2.11x faster than RS512 - jsonwebtoken (complete)
- 2.19x faster than RS512 - jsonwebtoken
+ 1.28x faster than RS512 - fast-jwt (complete)
+ 1.29x faster than RS512 - fast-jwt
+ 2.18x faster than RS512 - jsonwebtoken
+ 2.19x faster than RS512 - jsonwebtoken (complete)
```
@@ -304,53 +355,104 @@ Note that for decoding the algorithm is irrelevant, so only one was measured.
## Verifying
+
+ HS256
+
+## HS256
+```
+clk: ~3.28 GHz
+cpu: Apple M2 Pro
+runtime: node 22.11.0 (arm64-darwin)
+
+benchmark avg (min … max) p75 / p99 (min … top 1%)
+-------------------------------------------------- -------------------------------
+HS256 - fast-jwt (sync) 2.58 µs/iter 2.70 µs ▃█▆
+ (2.48 µs … 2.86 µs) 2.81 µs ███ ▆
+ ( 1.28 kb … 1.28 kb) 1.28 kb ███▃▁▁▁▁▁▃▃▁▁███▄▁▃▁▃
+
+HS256 - fast-jwt (async) 4.76 µs/iter 4.76 µs █▅ ▅
+ (4.40 µs … 5.40 µs) 5.35 µs ██▃█
+ ( 3.48 kb … 3.59 kb) 3.55 kb ▄▁▁▁████▄▁▄█▁▄▁▁▄▄▁▁▄
+
+HS256 - fast-jwt (sync with cache) 1.04 µs/iter 1.19 µs █
+ (886.48 ns … 1.55 µs) 1.44 µs █
+ (272.52 b … 1.87 kb) 1.00 kb ▇██▁▁▂▁▁▁▁▁▁▁▁▁▁▁▂█▅▂
+
+HS256 - fast-jwt (async with cache) 1.15 µs/iter 1.29 µs █ ▅
+ (987.19 ns … 1.51 µs) 1.43 µs █▄ ▃█
+ ( 1.67 kb … 2.15 kb) 1.79 kb ▇██▃▂▂▂▁▁▁▁▁▆██▂▂▂▁▁▂
+
+HS256 - jose (sync) 3.50 µs/iter 3.33 µs █
+ (3.00 µs … 914.79 µs) 7.21 µs █
+ (656.00 b … 467.17 kb) 2.34 kb ▁█▆▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
+
+HS256 - jsonwebtoken (sync) 3.82 µs/iter 3.81 µs █
+ (3.72 µs … 4.02 µs) 4.00 µs ▅▂█▂
+ ( 3.50 kb … 3.50 kb) 3.50 kb ▃▅▁▁████▃▁▅▃▃▁▁▁▁▁▃▁▃
+
+HS256 - jsonwebtoken (async) 3.87 µs/iter 3.92 µs ▅ █
+ (3.76 µs … 4.08 µs) 4.00 µs ▆ ▆█ █ █
+ ( 97.51 b … 216.72 b) 185.62 b ▄▄▄▄█▁█████▄▁██▄▁▁▁▁█
+
+summary
+ HS256 - fast-jwt (sync with cache)
+ 1.1x faster than HS256 - fast-jwt (async with cache)
+ 2.48x faster than HS256 - fast-jwt (sync)
+ 3.36x faster than HS256 - jose (sync)
+ 3.67x faster than HS256 - jsonwebtoken (sync)
+ 3.72x faster than HS256 - jsonwebtoken (async)
+ 4.57x faster than HS256 - fast-jwt (async)
+```
+
+
+
HS512
## HS512
```
-clk: ~3.77 GHz
-cpu: Apple M3 Pro
-runtime: node 22.13.1 (arm64-darwin)
+clk: ~3.29 GHz
+cpu: Apple M2 Pro
+runtime: node 22.11.0 (arm64-darwin)
benchmark avg (min … max) p75 / p99 (min … top 1%)
-------------------------------------------------- -------------------------------
-HS512 - fast-jwt (sync) 3.03 µs/iter 3.85 µs █
- (2.59 µs … 4.02 µs) 4.02 µs █ ▃
- ( 1.26 kb … 1.26 kb) 1.26 kb █▇▃▁▁▁▁▁▁▂▂▁▁▁▁▁▁▂█▃▂
+HS512 - fast-jwt (sync) 2.84 µs/iter 2.94 µs ▄▄ ▄ ▄ █
+ (2.70 µs … 3.05 µs) 3.02 µs ████▅██ ▅█▅█
+ ( 1.54 kb … 1.54 kb) 1.54 kb ███████▅▁▁▅▅▁██████▅▅
-HS512 - fast-jwt (async) 5.39 µs/iter 5.36 µs █
- (5.08 µs … 6.45 µs) 6.30 µs ▆█▃▃▃
- (823.31 b … 1.64 kb) 1.45 kb ██████▁▄▁▄▁▁▁▁▁▄▁▄▁▁▄
+HS512 - fast-jwt (async) 4.98 µs/iter 5.02 µs █
+ (4.75 µs … 5.07 µs) 5.05 µs ▃█▆▃ ▆
+ ( 3.36 kb … 3.47 kb) 3.43 kb ▄▁▄▁▁▁▁▁▁▁▁█▄█▁██████
-HS512 - fast-jwt (sync with cache) 1.13 µs/iter 953.03 ns █
- (887.26 ns … 1.97 µs) 1.95 µs █
- (723.44 b … 1.16 kb) 890.60 b █▇▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▆▃
+HS512 - fast-jwt (sync with cache) 1.21 µs/iter 1.15 µs ▂█
+ (1.02 µs … 2.65 µs) 1.87 µs ██
+ (666.24 b … 1.25 kb) 915.04 b ██▃▁▁▁▁▁▁▁▁▁▁▁▄█▃▁▁▁▁
-HS512 - fast-jwt (async with cache) 1.24 µs/iter 1.47 µs █ ▂
- (1.01 µs … 1.73 µs) 1.62 µs █▃ █
- ( 1.56 kb … 2.07 kb) 1.66 kb ██▇▃▁▃▂▁▁▁▁▂▁▁▂█▆▃▄▃▃
+HS512 - fast-jwt (async with cache) 1.30 µs/iter 1.47 µs █
+ (1.14 µs … 1.54 µs) 1.53 µs ▃██ ▄▇
+ ( 1.58 kb … 1.69 kb) 1.67 kb ████▁▃▁▁▁▁▁▁▁▁▁▃██▇▆▄
-HS512 - jose (sync) 3.34 µs/iter 3.04 µs █
- (2.79 µs … 2.89 ms) 4.46 µs ▂█▄
- (600.00 b … 621.12 kb) 2.32 kb ▁███▆▃▃▂▁▁▁▁▁▁▁▁▁▁▁▁▁
+HS512 - jose (sync) 3.34 µs/iter 3.41 µs █
+ (3.16 µs … 3.50 µs) 3.49 µs ▇▂ ▂█▅
+ ( 2.14 kb … 2.14 kb) 2.14 kb ▃▁▃▆▁███▆▆▃▃▃▃███▃▃▁▃
-HS512 - jsonwebtoken (sync) 233.62 µs/iter 238.08 µs ▅█▇
- (214.42 µs … 467.25 µs) 250.33 µs ███▆
- ( 5.53 kb … 438.59 kb) 6.89 kb ▂▃▅▇█▇▆▃▄▅▅█████▅▃▂▂▁
+HS512 - jsonwebtoken (sync) 4.04 µs/iter 4.05 µs █
+ (3.95 µs … 4.07 µs) 4.06 µs ▅▂▇█▅▅
+ ( 3.69 kb … 3.69 kb) 3.69 kb ▄▁▄▁▁▁▁▄▁▁▁▄▇▇██████▇
-HS512 - jsonwebtoken (async) 220.80 µs/iter 223.33 µs ▃█
- (210.38 µs … 353.29 µs) 256.63 µs ███▂█▇
- ( 5.80 kb … 947.22 kb) 6.58 kb ▃██████▅▃▂▂▂▃▂▂▂▂▁▁▁▁
+HS512 - jsonwebtoken (async) 4.15 µs/iter 4.19 µs █
+ (4.05 µs … 4.27 µs) 4.21 µs ██ ▇
+ (302.09 b … 410.58 b) 377.66 b ▃▃▃▁▁▁▁▃▁▆██▃▁▁▁▃▆▆█▆
summary
HS512 - fast-jwt (sync with cache)
- 1.1x faster than HS512 - fast-jwt (async with cache)
- 2.69x faster than HS512 - fast-jwt (sync)
- 2.96x faster than HS512 - jose (sync)
- 4.78x faster than HS512 - fast-jwt (async)
- 195.52x faster than HS512 - jsonwebtoken (async)
- 206.87x faster than HS512 - jsonwebtoken (sync)
+ 1.08x faster than HS512 - fast-jwt (async with cache)
+ 2.35x faster than HS512 - fast-jwt (sync)
+ 2.77x faster than HS512 - jose (sync)
+ 3.35x faster than HS512 - jsonwebtoken (sync)
+ 3.44x faster than HS512 - jsonwebtoken (async)
+ 4.13x faster than HS512 - fast-jwt (async)
```
@@ -360,48 +462,48 @@ summary
## ES512
```
-clk: ~3.82 GHz
-cpu: Apple M3 Pro
-runtime: node 22.13.1 (arm64-darwin)
+clk: ~3.29 GHz
+cpu: Apple M2 Pro
+runtime: node 22.11.0 (arm64-darwin)
benchmark avg (min … max) p75 / p99 (min … top 1%)
-------------------------------------------------- -------------------------------
-ES512 - fast-jwt (sync) 840.34 µs/iter 842.92 µs █
- (782.50 µs … 911.83 µs) 874.63 µs █▄
- ( 2.09 kb … 555.84 kb) 3.63 kb ▁▁▁▁▁▁▁▁▁▁▁▄██▆▃▂▂▁▁▁
+ES512 - fast-jwt (sync) 1.03 ms/iter 1.05 ms ▃█▄
+ (998.71 µs … 1.19 ms) 1.17 ms ███▇▄▂
+ ( 2.16 kb … 451.07 kb) 3.08 kb ██████▇▇▇▄▅▃▃▁▂▃▂▂▁▁▁
-ES512 - fast-jwt (async) 914.88 µs/iter 919.63 µs █▃
- (858.54 µs … 978.96 µs) 944.63 µs ██
- ( 4.27 kb … 836.84 kb) 7.44 kb ▁▁▁▁▁▃▃▂▂▁▁▁▃███▄▂▂▁▁
+ES512 - fast-jwt (async) 1.11 ms/iter 1.13 ms █▄▃█
+ (1.07 ms … 1.25 ms) 1.22 ms ▃████▄▆▂
+ ( 4.30 kb … 920.47 kb) 9.34 kb █████████▇▇▅▄▄▃▄▄▂▃▂▂
-ES512 - fast-jwt (sync with cache) 1.24 µs/iter 1.04 µs █▇
- (916.00 ns … 2.85 ms) 1.58 µs ██
- (912.00 b … 97.09 kb) 976.75 b ▁▃▁██▇▂▁▁▂▁▁▁▁▁▂▁▁▁▁▁
+ES512 - fast-jwt (sync with cache) 1.56 µs/iter 1.29 µs █
+ (1.04 µs … 2.47 ms) 5.50 µs ▃█
+ (952.00 b … 129.09 kb) 0.99 kb ██▃▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
-ES512 - fast-jwt (async with cache) 1.27 µs/iter 1.17 µs █
- (1.00 µs … 1.37 ms) 1.62 µs ▂█▅
- ( 1.66 kb … 129.66 kb) 1.99 kb ▁▁▁███▁▄▂▂▁▁▁▁▁▁▁▁▁▁▁
+ES512 - fast-jwt (async with cache) 1.60 µs/iter 1.42 µs █
+ (1.17 µs … 1.65 ms) 4.79 µs ▄█
+ ( 1.66 kb … 97.68 kb) 2.01 kb ██▆▄▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
-ES512 - jose (sync) 843.36 µs/iter 845.21 µs █
- (786.50 µs … 935.50 µs) 893.42 µs █
- ( 2.40 kb … 851.24 kb) 3.66 kb ▁▁▁▁▁▁▁▁▁▂██▄▃▂▂▁▁▁▁▁
+ES512 - jose (sync) 1.12 ms/iter 1.06 ms █
+ (1.00 ms … 5.01 ms) 3.78 ms █
+ ( 2.46 kb … 835.04 kb) 4.66 kb █▅▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
-ES512 - jsonwebtoken (sync) 934.94 µs/iter 938.50 µs █
- (870.75 µs … 1.12 ms) 994.54 µs █▇
- ( 4.48 kb … 707.00 kb) 5.93 kb ▁▁▁▂▁▂▂▁▁▂██▆▂▁▁▁▁▁▁▁
+ES512 - jsonwebtoken (sync) 1.04 ms/iter 1.05 ms █▃▄
+ (1.00 ms … 1.18 ms) 1.15 ms ▅████▃▃
+ ( 3.81 kb … 966.41 kb) 7.36 kb █████████▆▅▅▃▃▂▂▃▃▁▂▁
-ES512 - jsonwebtoken (async) 936.22 µs/iter 937.96 µs ▃█
- (926.92 µs … 1.01 ms) 966.63 µs ▃███▅
- ( 4.67 kb … 1.58 mb) 10.68 kb ▂██████▆▄▄▃▁▂▂▁▁▁▂▁▁▁
+ES512 - jsonwebtoken (async) 1.04 ms/iter 1.05 ms █▄
+ (999.92 µs … 1.18 ms) 1.15 ms ▇████▅
+ ( 4.34 kb … 524.85 kb) 5.13 kb █████████▅▅▅▃▂▃▃▃▃▂▂▂
summary
ES512 - fast-jwt (sync with cache)
1.02x faster than ES512 - fast-jwt (async with cache)
- 679.86x faster than ES512 - fast-jwt (sync)
- 682.3x faster than ES512 - jose (sync)
- 740.16x faster than ES512 - fast-jwt (async)
- 756.4x faster than ES512 - jsonwebtoken (sync)
- 757.43x faster than ES512 - jsonwebtoken (async)
+ 661.22x faster than ES512 - fast-jwt (sync)
+ 662.49x faster than ES512 - jsonwebtoken (async)
+ 663.03x faster than ES512 - jsonwebtoken (sync)
+ 708.82x faster than ES512 - fast-jwt (async)
+ 714.05x faster than ES512 - jose (sync)
```
@@ -411,48 +513,48 @@ summary
## RS512
```
-clk: ~3.77 GHz
-cpu: Apple M3 Pro
-runtime: node 22.13.1 (arm64-darwin)
+clk: ~3.23 GHz
+cpu: Apple M2 Pro
+runtime: node 22.11.0 (arm64-darwin)
benchmark avg (min … max) p75 / p99 (min … top 1%)
-------------------------------------------------- -------------------------------
-RS512 - fast-jwt (sync) 45.16 µs/iter 45.24 µs █ █
- (44.80 µs … 46.25 µs) 45.28 µs █▅ ▅ ▅ ▅ ▅ ▅█▅
- ( 1.80 kb … 1.81 kb) 1.80 kb ██▁█▁▁▁▁▁▁█▁▁█▁▁█▁███
+RS512 - fast-jwt (sync) 55.40 µs/iter 55.42 µs █
+ (54.99 µs … 56.66 µs) 55.62 µs ▅▅ ▅▅ ▅▅ ▅▅▅ █
+ ( 1.72 kb … 1.72 kb) 1.72 kb ██▁██▁▁▁▁██▁███▁▁▁▁▁█
-RS512 - fast-jwt (async) 128.43 µs/iter 132.04 µs █
- (119.79 µs … 191.54 µs) 144.88 µs █▆ ██
- ( 4.42 kb … 613.58 kb) 5.86 kb ▃███▅▄▂▂▄██▇▅▃▂▂▂▁▁▁▁
+RS512 - fast-jwt (async) 142.64 µs/iter 143.83 µs ▃█
+ (134.67 µs … 1.01 ms) 186.33 µs ▇██▇
+ ( 4.32 kb … 581.60 kb) 5.69 kb █████▆▅▃▂▂▁▁▁▁▁▁▁▁▁▁▁
-RS512 - fast-jwt (sync with cache) 1.51 µs/iter 1.32 µs █
- (1.26 µs … 2.37 µs) 2.34 µs █
- (888.29 b … 898.12 b) 897.84 b ██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▆▄
+RS512 - fast-jwt (sync with cache) 1.83 µs/iter 1.76 µs ▂ █
+ (1.50 µs … 2.49 µs) 2.49 µs ███▅
+ (912.44 b … 1.00 kb) 923.07 b ▂▅████▃▁▁▁▁▁▁▁▁▂▂▃▆▆▆
-RS512 - fast-jwt (async with cache) 1.70 µs/iter 2.01 µs █ ▃
- (1.43 µs … 2.10 µs) 2.08 µs ▄█ █
- ( 1.56 kb … 1.67 kb) 1.65 kb ██▅▃▂▁▁▁▁▁▁▁▁▁▁▁▁▇█▄▂
+RS512 - fast-jwt (async with cache) 1.93 µs/iter 2.13 µs █ ▃▃ ▃
+ (1.65 µs … 2.28 µs) 2.25 µs ▇█ ▂▂██▇ ██▅█
+ ( 1.59 kb … 1.69 kb) 1.68 kb ██▃█████▃▁▁▁▆▆▆████▃▆
-RS512 - jose (sync) 42.96 µs/iter 42.83 µs █
- (41.75 µs … 1.23 ms) 51.63 µs █
- ( 2.29 kb … 304.27 kb) 3.17 kb ▆██▄▂▁▂▃▂▁▁▁▁▁▁▁▁▁▁▁▁
+RS512 - jose (sync) 56.10 µs/iter 56.79 µs █▅
+ (53.04 µs … 860.38 µs) 75.58 µs ██ ▅
+ ( 2.30 kb … 323.83 kb) 3.41 kb ██▅██▃▂▂▂▂▂▁▁▁▁▁▁▁▁▁▁
-RS512 - jsonwebtoken (sync) 128.81 µs/iter 131.63 µs █
- (120.63 µs … 1.19 ms) 142.13 µs ▇▆ ██▃
- ( 7.33 kb … 869.80 kb) 9.95 kb ▂███▆▄▃▂▃███▅▄▂▂▂▂▂▁▁
+RS512 - jsonwebtoken (sync) 56.90 µs/iter 57.69 µs █
+ (55.61 µs … 58.92 µs) 57.73 µs █ █
+ ( 1.47 kb … 1.47 kb) 1.47 kb ████▁▁▁█▁▁▁▁▁▁▁▁█▁▁██
-RS512 - jsonwebtoken (async) 125.93 µs/iter 126.29 µs █
- (120.50 µs … 2.21 ms) 142.96 µs ██
- ( 1.14 kb … 165.64 kb) 8.58 kb ▂███▃▃▂▁▁▃▆▃▂▂▂▂▂▁▁▁▁
+RS512 - jsonwebtoken (async) 56.19 µs/iter 56.18 µs ██ █
+ (55.66 µs … 57.92 µs) 56.76 µs ▅ ██ █ ▅▅ ▅ ▅
+ (431.80 b … 439.38 b) 432.70 b █▁▁██▁█▁██▁█▁▁▁▁▁▁▁▁█
summary
RS512 - fast-jwt (sync with cache)
- 1.12x faster than RS512 - fast-jwt (async with cache)
- 28.45x faster than RS512 - jose (sync)
- 29.91x faster than RS512 - fast-jwt (sync)
- 83.41x faster than RS512 - jsonwebtoken (async)
- 85.06x faster than RS512 - fast-jwt (async)
- 85.31x faster than RS512 - jsonwebtoken (sync)
+ 1.05x faster than RS512 - fast-jwt (async with cache)
+ 30.22x faster than RS512 - fast-jwt (sync)
+ 30.6x faster than RS512 - jose (sync)
+ 30.64x faster than RS512 - jsonwebtoken (async)
+ 31.03x faster than RS512 - jsonwebtoken (sync)
+ 77.79x faster than RS512 - fast-jwt (async)
```
@@ -462,48 +564,48 @@ summary
## PS512
```
-clk: ~3.76 GHz
-cpu: Apple M3 Pro
-runtime: node 22.13.1 (arm64-darwin)
+clk: ~3.29 GHz
+cpu: Apple M2 Pro
+runtime: node 22.11.0 (arm64-darwin)
benchmark avg (min … max) p75 / p99 (min … top 1%)
-------------------------------------------------- -------------------------------
-PS512 - fast-jwt (sync) 45.97 µs/iter 46.59 µs █
- (44.13 µs … 46.98 µs) 46.94 µs █
- ( 1.76 kb … 1.77 kb) 1.77 kb █▁█▁▁▁▁█▁▁██▁▁▁▁▁████
+PS512 - fast-jwt (sync) 55.21 µs/iter 55.37 µs █
+ (54.69 µs … 56.85 µs) 55.52 µs ▅▅█ ▅ ▅ ▅ ▅ ▅ ▅ ▅
+ ( 1.68 kb … 1.68 kb) 1.68 kb ███▁█▁▁█▁▁▁▁█▁█▁█▁█▁█
-PS512 - fast-jwt (async) 73.33 µs/iter 75.13 µs █
- (69.42 µs … 1.71 ms) 93.04 µs █ ▂
- ( 4.36 kb … 397.64 kb) 5.39 kb ▇██▄▃█▅▂▂▂▁▁▂▁▁▁▁▁▁▁▁
+PS512 - fast-jwt (async) 86.37 µs/iter 86.79 µs █
+ (83.13 µs … 1.75 ms) 106.92 µs ▅█▃
+ ( 4.05 kb … 529.27 kb) 5.52 kb ███▇▅▄▂▂▂▂▁▁▁▁▁▁▁▁▁▁▁
-PS512 - fast-jwt (sync with cache) 1.48 µs/iter 1.28 µs █
- (1.22 µs … 2.36 µs) 2.34 µs ▅█
- (879.95 b … 889.60 b) 889.41 b ██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▂▅▄
+PS512 - fast-jwt (sync with cache) 1.55 µs/iter 1.59 µs █
+ (1.38 µs … 2.16 µs) 2.08 µs ██
+ (904.31 b … 0.98 kb) 914.85 b ██▃▁▂▁▂▂▁▁▂▁▁▁▁▁▁▃█▃▂
-PS512 - fast-jwt (async with cache) 1.64 µs/iter 1.94 µs █
- (1.37 µs … 2.12 µs) 2.08 µs ▅█ ▅
- ( 1.56 kb … 1.66 kb) 1.65 kb ██▅▂▂▂▂▁▁▁▁▁▁▁▂▇█▅▅▂▂
+PS512 - fast-jwt (async with cache) 1.66 µs/iter 1.82 µs █ ▂
+ (1.50 µs … 1.96 µs) 1.91 µs ██ █▃
+ ( 1.58 kb … 1.69 kb) 1.67 kb ██▅▅▁▂▁▁▁▁▁▂▁▁▂██▅▁▄▂
-PS512 - jose (sync) 47.65 µs/iter 47.67 µs █
- (44.00 µs … 1.16 ms) 54.17 µs █▆
- (360.00 b … 355.05 kb) 3.35 kb ▁▁▁▁▁▇██▆▂▁▂▂▁▁▁▁▁▁▁▁
+PS512 - jose (sync) 56.25 µs/iter 55.88 µs ▅█
+ (54.79 µs … 697.29 µs) 67.08 µs ██
+ ( 2.19 kb … 355.05 kb) 3.45 kb ██▇▂▂▂▃▂▂▂▁▁▁▁▁▁▁▁▁▁▁
-PS512 - jsonwebtoken (sync) 74.37 µs/iter 75.54 µs ▅▃ █▃
- (69.21 µs … 3.01 ms) 83.58 µs ██ ██
- ( 1.30 kb … 546.25 kb) 9.40 kb ▂██▆▂▂▂▆███▄▃▃▂▁▁▁▁▁▁
+PS512 - jsonwebtoken (sync) 57.72 µs/iter 57.80 µs █
+ (57.09 µs … 59.64 µs) 58.92 µs █ █ █
+ ( 1.38 kb … 1.38 kb) 1.38 kb █▁████▁▁█▁▁▁▁▁▁▁▁▁▁▁█
-PS512 - jsonwebtoken (async) 71.80 µs/iter 70.88 µs ▂█
- (69.25 µs … 2.87 ms) 80.46 µs ██▅
- ( 8.40 kb … 393.91 kb) 8.87 kb ▂███▄▂▂▂▂▁▁▁▁▁▁▁▁▁▁▁▁
+PS512 - jsonwebtoken (async) 58.79 µs/iter 57.85 µs █ █
+ (57.22 µs … 71.55 µs) 58.67 µs █ ▅█▅ ▅▅ ▅▅ ▅
+ (338.54 b … 339.49 b) 338.86 b █▁███▁██▁██▁▁▁▁▁▁▁▁▁█
summary
PS512 - fast-jwt (sync with cache)
- 1.11x faster than PS512 - fast-jwt (async with cache)
- 31.09x faster than PS512 - fast-jwt (sync)
- 32.22x faster than PS512 - jose (sync)
- 48.56x faster than PS512 - jsonwebtoken (async)
- 49.6x faster than PS512 - fast-jwt (async)
- 50.3x faster than PS512 - jsonwebtoken (sync)
+ 1.07x faster than PS512 - fast-jwt (async with cache)
+ 35.55x faster than PS512 - fast-jwt (sync)
+ 36.22x faster than PS512 - jose (sync)
+ 37.17x faster than PS512 - jsonwebtoken (sync)
+ 37.86x faster than PS512 - jsonwebtoken (async)
+ 55.62x faster than PS512 - fast-jwt (async)
```
@@ -513,38 +615,38 @@ summary
## EdDSA
```
-clk: ~3.80 GHz
-cpu: Apple M3 Pro
-runtime: node 22.13.1 (arm64-darwin)
+clk: ~3.30 GHz
+cpu: Apple M2 Pro
+runtime: node 22.11.0 (arm64-darwin)
benchmark avg (min … max) p75 / p99 (min … top 1%)
-------------------------------------------------- -------------------------------
-EdDSA - fast-jwt (sync) 66.87 µs/iter 66.58 µs █
- (65.83 µs … 101.29 µs) 78.25 µs ▇█
- ( 1.72 kb … 367.73 kb) 2.29 kb ██▄▂▂▂▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁
+EdDSA - fast-jwt (sync) 79.50 µs/iter 79.42 µs █
+ (77.42 µs … 178.92 µs) 92.92 µs ██
+ ( 1.63 kb … 400.78 kb) 2.45 kb ██▅▂▂▅▃▂▁▂▂▁▂▁▁▁▁▁▁▁▁
-EdDSA - fast-jwt (async) 109.31 µs/iter 109.50 µs █▆
- (106.54 µs … 204.38 µs) 123.17 µs ██
- ( 3.62 kb … 452.90 kb) 4.30 kb ▃███▅▅▃▂▂▁▃▃▂▁▁▁▁▁▁▁▁
+EdDSA - fast-jwt (async) 122.41 µs/iter 123.63 µs █
+ (119.04 µs … 193.75 µs) 138.83 µs ▂█
+ ( 3.53 kb … 580.81 kb) 4.51 kb ██▆▃▆▅▃▃▂▂▂▂▁▁▂▁▁▁▁▁▁
-EdDSA - fast-jwt (sync with cache) 1.23 µs/iter 1.78 µs ▃ █
- (944.07 ns … 1.95 µs) 1.94 µs █ █
- ( 1.04 kb … 1.04 kb) 1.04 kb █▆█▁▁▁▁▁▁▁▁▁▁▁▁▁▁█▂▇▂
+EdDSA - fast-jwt (sync with cache) 1.27 µs/iter 1.56 µs █
+ (1.08 µs … 1.83 µs) 1.80 µs ▂█
+ (733.41 b … 1.52 kb) 1.07 kb ███▁▂▂▁▂▁▁▁▁▁▂▅▇▄▂▁▁▁
-EdDSA - fast-jwt (async with cache) 1.32 µs/iter 1.55 µs █
- (1.06 µs … 1.74 µs) 1.72 µs ▆█ ▂█
- ( 1.73 kb … 1.84 kb) 1.83 kb ██▄▅▂▁▁▁▁▁▁▁▁▁██▆▄▄▂▂
+EdDSA - fast-jwt (async with cache) 1.55 µs/iter 1.61 µs █ ▄
+ (1.21 µs … 3.33 µs) 3.17 µs █▅ █▂▂
+ ( 1.75 kb … 1.86 kb) 1.84 kb ██▅███▅▃▂▁▁▃▁▁▂▁▂▂▁▁▂
-EdDSA - jose (sync) 67.21 µs/iter 67.04 µs █
- (66.17 µs … 112.92 µs) 78.42 µs █
- ( 2.20 kb … 469.91 kb) 3.05 kb ██▆▂▁▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁
+EdDSA - jose (sync) 81.76 µs/iter 82.25 µs █
+ (77.92 µs … 594.29 µs) 108.92 µs █
+ ( 2.15 kb … 482.91 kb) 3.17 kb █▇▇▇▃▃▂▂▂▂▁▁▁▁▁▁▁▁▁▁▁
summary
EdDSA - fast-jwt (sync with cache)
- 1.08x faster than EdDSA - fast-jwt (async with cache)
- 54.58x faster than EdDSA - fast-jwt (sync)
- 54.87x faster than EdDSA - jose (sync)
- 89.23x faster than EdDSA - fast-jwt (async)
+ 1.22x faster than EdDSA - fast-jwt (async with cache)
+ 62.78x faster than EdDSA - fast-jwt (sync)
+ 64.57x faster than EdDSA - jose (sync)
+ 96.68x faster than EdDSA - fast-jwt (async)
```
diff --git a/benchmarks/sign.mjs b/benchmarks/sign.mjs
index b067c7b..2dceb98 100644
--- a/benchmarks/sign.mjs
+++ b/benchmarks/sign.mjs
@@ -4,7 +4,7 @@ import { privateKeys, publicKeys, compareSigning, saveLogs } from './utils.mjs'
export async function runSuites() {
const benchmarkResults = []
- for (const algorithm of ['HS512', 'ES512', 'RS512', 'PS512', 'EdDSA']) {
+ for (const algorithm of ['HS256', 'HS512', 'ES512', 'RS512', 'PS512', 'EdDSA']) {
const result = await compareSigning({ a: 1, b: 2, c: 3 }, algorithm, privateKeys[algorithm], publicKeys[algorithm])
benchmarkResults.push({ algorithm, result })
}
diff --git a/benchmarks/utils.mjs b/benchmarks/utils.mjs
index 15afce8..8f0afac 100644
--- a/benchmarks/utils.mjs
+++ b/benchmarks/utils.mjs
@@ -2,6 +2,7 @@
import nodeRsJwt, { Algorithm } from '@node-rs/jsonwebtoken'
import { run, bench, summary } from 'mitata'
+import { createSecretKey, createPublicKey, createPrivateKey } from 'crypto'
import { readFileSync } from 'fs'
import { mkdir, writeFile } from 'fs/promises'
import { dirname, resolve } from 'path'
@@ -126,6 +127,28 @@ export function compareDecoding(token, algorithm) {
return runMitata(tests, mitataOptions)
}
+function jsonwebtokenPrivateKeyFromString(privateKey) {
+ return jsonwebtokenKeyFromString(privateKey, createPrivateKey)
+}
+
+function jsonwebtokenSecretKeyFromString(publicKey) {
+ return jsonwebtokenKeyFromString(publicKey, createSecretKey)
+}
+
+function jsonwebtokenPublicKeyFromString(publicKey) {
+ return jsonwebtokenKeyFromString(publicKey, createPublicKey)
+}
+
+function jsonwebtokenKeyFromString(key, keyFunc) {
+ const jsonwebtokenBuffer = Buffer.from(key)
+ const jwtSecretDataview = new DataView(
+ jsonwebtokenBuffer.buffer,
+ jsonwebtokenBuffer.byteOffset,
+ jsonwebtokenBuffer.byteLength
+ )
+ return keyFunc(jwtSecretDataview)
+}
+
export async function compareSigning(payload, algorithm, privateKey, publicKey) {
const isEdDSA = algorithm.slice(0, 2) === 'Ed'
@@ -134,6 +157,9 @@ export async function compareSigning(payload, algorithm, privateKey, publicKey)
const fastjwtVerify = createVerifier({ key: publicKey })
const josePrivateKey = asKey(privateKey)
+ const jsonwebtokenKey = /^(?:RS|PS|ES)/.test(algorithm)
+ ? jsonwebtokenPrivateKeyFromString(privateKey)
+ : jsonwebtokenSecretKeyFromString(publicKey)
const joseOptions = {
algorithm,
iat: false,
@@ -150,7 +176,7 @@ export async function compareSigning(payload, algorithm, privateKey, publicKey)
})
const jsonwebtokenGenerated = isEdDSA
? null
- : jsonwebtokenSign(payload, privateKey, { algorithm, noTimestamp: true })
+ : jsonwebtokenSign(payload, jsonwebtokenKey, { algorithm, noTimestamp: true })
log('-------')
log(`Generated ${algorithm} tokens:`)
@@ -162,7 +188,7 @@ export async function compareSigning(payload, algorithm, privateKey, publicKey)
log(`@node-rs/jsonwebtoken: ${JSON.stringify(nodeRsGenerated)}`)
log('Generated tokens verification:')
if (!isEdDSA) {
- log(` jsonwebtoken: ${JSON.stringify(jsonwebtokenVerify(jsonwebtokenGenerated, publicKey))}`)
+ log(` jsonwebtoken: ${JSON.stringify(jsonwebtokenVerify(jsonwebtokenGenerated, jsonwebtokenKey))}`)
}
log(` jose: ${JSON.stringify(joseVerify(joseGenerated, asKey(publicKey)))}`)
log(` fastjwt: ${JSON.stringify(fastjwtVerify(fastjwtGenerated))}`)
@@ -181,10 +207,12 @@ export async function compareSigning(payload, algorithm, privateKey, publicKey)
if (!isEdDSA) {
Object.assign(tests, {
[`${algorithm} - jsonwebtoken (sync)`]: function () {
- jsonwebtokenSign(payload, privateKey, { algorithm, noTimestamp: true })
+ jsonwebtokenSign(payload, jsonwebtokenKey, { algorithm, noTimestamp: true })
},
[`${algorithm} - jsonwebtoken (async)`]: async function () {
- return new Promise(resolve => jsonwebtokenSign(payload, privateKey, { algorithm, noTimestamp: true }, resolve))
+ return new Promise(resolve =>
+ jsonwebtokenSign(payload, jsonwebtokenKey, { algorithm, noTimestamp: true }, resolve)
+ )
}
})
}
@@ -216,12 +244,15 @@ export function compareVerifying(token, algorithm, publicKey) {
const fastjwtCachedVerifyAsync = createVerifier({ key: async () => publicKey, cache: true })
const josePublicKey = asKey(publicKey)
+ const jsonwebtokenKey = /^(?:RS|PS|ES)/.test(algorithm)
+ ? jsonwebtokenPublicKeyFromString(publicKey)
+ : jsonwebtokenSecretKeyFromString(publicKey)
if ((process.env.NODE_DEBUG || '').includes('fast-jwt')) {
log('-------')
log(`Verified ${algorithm} tokens:`)
if (!isEdDSA) {
- log(` jsonwebtoken: ${JSON.stringify(jsonwebtokenVerify(token, publicKey))}`)
+ log(` jsonwebtoken: ${JSON.stringify(jsonwebtokenVerify(token, jsonwebtokenKey))}`)
}
log(` jose: ${JSON.stringify(joseVerify(token, josePublicKey))}`)
log(` fastjwt: ${JSON.stringify(fastjwtVerify(token))}`)
@@ -250,10 +281,10 @@ export function compareVerifying(token, algorithm, publicKey) {
if (!isEdDSA) {
tests[`${algorithm} - jsonwebtoken (sync)`] = function () {
- jsonwebtokenVerify(token, publicKey)
+ jsonwebtokenVerify(token, jsonwebtokenKey)
}
tests[`${algorithm} - jsonwebtoken (async)`] = async function () {
- return new Promise(resolve => jsonwebtokenVerify(token, publicKey, resolve))
+ return new Promise(resolve => jsonwebtokenVerify(token, jsonwebtokenKey, resolve))
}
}
diff --git a/benchmarks/verify.mjs b/benchmarks/verify.mjs
index a3584a8..53b10c8 100644
--- a/benchmarks/verify.mjs
+++ b/benchmarks/verify.mjs
@@ -4,7 +4,7 @@ import { tokens, publicKeys, compareVerifying, saveLogs } from './utils.mjs'
export async function runSuites() {
const benchmarkResults = []
- for (const algorithm of ['HS512', 'ES512', 'RS512', 'PS512', 'EdDSA']) {
+ for (const algorithm of ['HS256', 'HS512', 'ES512', 'RS512', 'PS512', 'EdDSA']) {
const result = await compareVerifying(tokens[algorithm], algorithm, publicKeys[algorithm])
benchmarkResults.push({ algorithm, result })
}