# Performance Test Suite

The table hereafter is the result of all benchmarks *with our development environment*.
It is given to help you to select the appropriate algorithms for your application.

**The use of the algorithm ECDH-ES with curves P-256, P-384 or P-521 is not recommended**.
The cryptographic operations with those curves are done using a pure PHP function and hence very slow.

The use of the RSA algorithms with a very long key (more that 4096 bits) is quite slow, but offers a good protection.

The PBES2* algorithms are quite slow, but also offer a good protection (see https://en.wikipedia.org/wiki/PBKDF2). Default salt size (512 bits) and iterations (4096) and custom values (256/1024) used for the tests. Those values can be configured if needed.

subject | groups | mean |
---|---|---|

sign | JWS,EdDSA,Ed25519 | 139.323μs |

verify | JWS,EdDSA,Ed25519 | 169.125μs |

sign | JWS,ECDSA,ES256 | 139.144μs |

verify | JWS,ECDSA,ES256 | 223.170μs |

sign | JWS,ECDSA,ES384 | 941.535μs |

verify | JWS,ECDSA,ES384 | 1,075.417μs |

sign | JWS,ECDSA,ES512 | 504.271μs |

verify | JWS,ECDSA,ES512 | 826.615μs |

sign | JWS,hmac,HS256 | 19.593μs |

verify | JWS,hmac,HS256 | 24.045μs |

sign | JWS,hmac,HS384 | 20.061μs |

verify | JWS,hmac,HS384 | 24.672μs |

sign | JWS,hmac,HS512 | 19.838μs |

verify | JWS,hmac,HS512 | 24.935μs |

sign | JWS,none | 14.021μs |

verify | JWS,none | 17.317μs |

sign | JWS,RSASign,PS256 | 1,310.264μs |

verify | JWS,RSASign,PS256 | 121.113μs |

sign | JWS,RSASign,PS384 | 1,300.622μs |

verify | JWS,RSASign,PS384 | 119.065μs |

sign | JWS,RSASign,PS512 | 1,302.404μs |

verify | JWS,RSASign,PS512 | 117.445μs |

sign | JWS,RSASign,RS256 | 1,280.885μs |

verify | JWS,RSASign,RS256 | 106.382μs |

sign | JWS,RSASign,RS384 | 1,280.652μs |

verify | JWS,RSASign,RS384 | 297.263μs |

sign | JWS,RSASign,RS512 | 1,659.753μs |

verify | JWS,RSASign,RS512 | 119.476μs |

encryption/decryption | JWE,GCMKW,A128GCMKW | 63.022μs, 60.639μs, 58.909μs (with A128CBC-HS256, A192CBC-HS384, A256CBC-HS512 respectively) |

encryption/decryption | JWE,GCMKW,A128GCMKW | 48.335μs, 50.021μs, 49.393μs (with A128GCM, A192GCM, A256GCM respectively) |

encryption/decryption | JWE,GCMKW,A192GCMKW | 59.719μs, 59.396μs, 60.329μs (with A128CBC-HS256, A192CBC-HS384, A256CBC-HS512 respectively) |

encryption/decryption | JWE,GCMKW,A192GCMKW | 48.432μs, 49.295μs, 50.244μs (with A128GCM, A192GCM, A256GCM respectively) |

encryption/decryption | JWE,GCMKW,A256GCMKW | 60.966μs, 60.621μs, 59.821μs (with A128CBC-HS256, A192CBC-HS384, A256CBC-HS512 respectively) |

encryption/decryption | JWE,GCMKW,A256GCMKW | 48.894μs, 49.165μs, 49.224μs (with A128GCM, A192GCM, A256GCM respectively) |

encryption/decryption | JWE,KW,A128KW | 159.758μs, 176.995μs, 210.580μs (with A128CBC-HS256, A192CBC-HS384, A256CBC-HS512 respectively) |

encryption/decryption | JWE,KW,A128KW | 93.752μs, 117.309μs, 162.917μs (with A128GCM, A192GCM, A256GCM respectively) |

encryption/decryption | JWE,KW,A192KW | 137.808μs, 176.636μs, 214.446μs (with A128CBC-HS256, A192CBC-HS384, A256CBC-HS512 respectively) |

encryption/decryption | JWE,KW,A192KW | 104.048μs, 122.472μs, 138.150μs (with A128GCM, A192GCM, A256GCM respectively) |

encryption/decryption | JWE,KW,A256KW | 139.867μs, 176.727μs, 208.664μs (with A128CBC-HS256, A192CBC-HS384, A256CBC-HS512 respectively) |

encryption/decryption | JWE,KW,A256KW | 93.840μs, 115.313μs, 140.135μs (with A128GCM, A192GCM, A256GCM respectively) |

encryption | JWE,RSAEnc,RSA1_5 | from 178.368μs to 373.941μs (depending on the Content Encryption Algorithm and the key size) |

decryption | JWE,RSAEnc,RSA1_5 | from 354.921μs to 10,148.146μs (depending on the Content Encryption Algorithm and the key size) |

encryption | JWE,RSAEnc,RSA-OAEP | from 188.228μs to 428.624μs (depending on the Content Encryption Algorithm and the key size) |

decryption | JWE,RSAEnc,RSA-OAEP | from 381.853μs to 13,079.733μs (depending on the Content Encryption Algorithm and the key size) |

encryption | JWE,RSAEnc,RSA-OAEP-256 | from 195.231μs to 410.868μs (depending on the Content Encryption Algorithm and the key size) |

decryption | JWE,RSAEnc,RSA-OAEP-256 | from 354.090μs to 11,238.001μs (depending on the Content Encryption Algorithm and the key size) |

encryption/decryption | JWE,PBES2,PBES2HS256A128KW | from 2,109.175μs (256 bit salt / 1024 counts) to 7,943.047μs (512 bit salt / 4096 counts) |

encryption/decryption | JWE,PBES2,PBES2HS384A192KW | from 2,719.313μs (256 bit salt / 1024 counts) to 10,466.043μs (512 bit salt / 4096 counts) |

encryption/decryption | JWE,PBES2,PBES2HS256A128KW | from 2,746.634μs (256 bit salt / 1024 counts) to 10,600.124μs (512 bit salt / 4096 counts) |

encryption | JWE,ECDHES,ECDHESKW,ECDHESA128KW | ~45,198.922μs (with curve P-256) |

encryption | JWE,ECDHES,ECDHESKW,ECDHESA128KW | ~77,320.816μs (with curve P-384) |

encryption | JWE,ECDHES,ECDHESKW,ECDHESA128KW | ~120,709.648μs (with curve P-521) |

encryption | JWE,ECDHES,ECDHESKW,ECDHESA128KW | ~453.445μs (with curve X25519) |

decryption | JWE,ECDHES,ECDHESKW,ECDHESA128KW | ~21,249.059μs (with curve P-256) |

decryption | JWE,ECDHES,ECDHESKW,ECDHESA128KW | ~37,207.750μs (with curve P-384) |

decryption | JWE,ECDHES,ECDHESKW,ECDHESA128KW | ~57,072.871μs (with curve P-521) |

decryption | JWE,ECDHES,ECDHESKW,ECDHESA128KW | ~387.441μs (with curve X25519) |

encryption | JWE,ECDHES,ECDHESKW,ECDHESA192KW | ~44,697.707μs (with curve P-256) |

encryption | JWE,ECDHES,ECDHESKW,ECDHESA192KW | ~76,731.773μs (with curve P-384) |

encryption | JWE,ECDHES,ECDHESKW,ECDHESA192KW | ~124,164.813μs (with curve P-521) |

encryption | JWE,ECDHES,ECDHESKW,ECDHESA192KW | ~501.742μs (with curve X25519) |

decryption | JWE,ECDHES,ECDHESKW,ECDHESA192KW | ~21,603.676μs (with curve P-256) |

decryption | JWE,ECDHES,ECDHESKW,ECDHESA192KW | ~36,172.617μs (with curve P-384) |

decryption | JWE,ECDHES,ECDHESKW,ECDHESA192KW | ~55,530.465μs (with curve P-521) |

decryption | JWE,ECDHES,ECDHESKW,ECDHESA192KW | ~378.129μs (with curve X25519) |

encryption | JWE,ECDHES,ECDHESKW,ECDHESA256KW | ~44,701.426μs (with curve P-256) |

encryption | JWE,ECDHES,ECDHESKW,ECDHESA256KW | ~76,805.012μs (with curve P-384) |

encryption | JWE,ECDHES,ECDHESKW,ECDHESA256KW | ~121,017.648μs (with curve P-521) |

encryption | JWE,ECDHES,ECDHESKW,ECDHESA256KW | ~451.094μs (with curve X25519) |

decryption | JWE,ECDHES,ECDHESKW,ECDHESA256KW | ~21,335.781μs (with curve P-256) |

decryption | JWE,ECDHES,ECDHESKW,ECDHESA256KW | ~36,207.594μs (with curve P-384) |

decryption | JWE,ECDHES,ECDHESKW,ECDHESA256KW | ~55,440.664μs (with curve P-521) |

decryption | JWE,ECDHES,ECDHESKW,ECDHESA256KW | ~377.367μs (with curve X25519) |

encryption | JWE,ECDHES | ~44,762.633μs (with curve P-256) |

encryption | JWE,ECDHES | ~76,660.664μs (with curve P-384) |

encryption | JWE,ECDHES | ~119,539.141μs (with curve P-521) |

encryption | JWE,ECDHES | ~369.992μs (with curve X25519) |

decryption | JWE,ECDHES | ~21,894.422μs (with curve P-256) |

decryption | JWE,ECDHES | ~37,380.137μs (with curve P-384) |

decryption | JWE,ECDHES | ~58,231.930μs (with curve P-521) |

decryption | JWE,ECDHES | ~263.254μs (with curve X25519) |