|  Download Protocol VersionsThis document describes the cryptography and encoding rules for Paseto protocol versions,
to assist in cross-platform library development. Rules for Current and Future Protocol Versions
Everything must be authenticated. Attackers should never be allowed the opportunity
to alter messages freely.
* If encryption is specified, unauthenticated modes (e.g. AES-CBC) are forbidden.
* The nonce or initialization vector must be covered by the authentication
  tag, not just the ciphertext.
* Some degree of nonce-misuse resistance should be provided by any future schemes. 
Non-deterministic, stateful, and otherwise dangerous signature schemes (e.g. ECDSA
without RFC 6979, XMSS) are forbidden.
Public-key cryptography must be IND-CCA2 secure to be considered for inclusion.
* This means no RSA with PKCS1v1.5 padding, textbook RSA, etc.
By default, libraries should only allow the two most recent versions to be used.
* If there are only two versions, that means `v1` and `v2`.
* If a future post-quantum `v3` is defined, `v1` should no longer be accepted.
* If an additional version `v4` is defined, `v2` should also no longer be accepted.
New versions will be decided and formalized by the PASETO developers. 
* User-defined homemade protocols are discouraged. If implementors wish to break
  this rule and define their own custom protocol suite, they must NOT continue
  the {`v1`, `v2`, ... } series naming convention.
* Any version identifiers that match the regular expression, `/^v[0-9\.]+$/` are
  reserved by the PASETO development team.
 VersionsVersion 1: Compatibility ModeSee the version 1 specification for details. At a glance: 
v1.local: Symmetric Authenticated Encryption:
* AES-256-CTR + HMAC-SHA384 (Encrypt-then-MAC)
* Key-splitting: HKDF-SHA384
  * Info for encryption key: `paseto-encryption-key`
  * Info for authentication key: `paseto-auth-key-for-aead`
* 32-byte nonce (first half for AES-CTR, latter half for the HKDF salt)
* The nonce calculated from HMAC-SHA384(message, `random_bytes(32)`)
  truncated to 32 bytes, during encryption only
* The HMAC covers the header, nonce, and ciphertext
* Reference implementation in Version1.php:
  * See `aeadEncrypt()` for encryption
  * See `aeadDncrypt()` for decryption
v1.public: Asymmetric Authentication (Public-Key Signatures):
* 2048-bit RSA keys
* RSASSA-PSS with
  * Hash function: SHA384 as the hash function
  * Mask generation function: MGF1+SHA384
  * Public exponent: 65537
* Reference implementation in Version1.php:
  * See `sign()` for signature generation
  * See `verify()` for signature verification
 Version 1 implements the best possible RSA + AES + SHA2 ciphersuite. We only use
OAEP and PSS for RSA encryption and RSA signatures (respectively), never PKCS1v1.5. Version 1 is recommended only for legacy systems that cannot use modern cryptography. See also: Common implementation details for all versions. Version 2: RecommendedSee the version 2 specification for details. At a glance: 
v2.local: Symmetric Encryption:
* XChaCha20-Poly1305 (192-bit nonce, 256-bit key, 128-bit authentication tag)
* Encrypting: `sodium_crypto_aead_xchacha20poly1305_ietf_encrypt()`
* Decrypting: `sodium_crypto_aead_xchacha20poly1305_ietf_decrypt()`
* The nonce is calculated from `sodium_crypto_generichash()` of the message,
  with a BLAKE2b key provided by `random_bytes(24)` and an output length of 24,
  during encryption only
* Reference implementation in Version2.php:
  * See `aeadEncrypt()` for encryption
  * See `aeadDecrypt()` for decryption
v2.public: Asymmetric Authentication (Public-Key Signatures):
* Ed25519 (EdDSA over Curve25519)
* Signing: `sodium_crypto_sign_detached()` 
* Verifying: `sodium_crypto_sign_verify_detached()`
* Reference implementation in Version2.php:
  * See `sign()` for signature generation
  * See `verify()` for signature verification
 See also: Common implementation details for all versions. |