Libsodium View as Markdown

Implemented (PHP 7.2)
Authors
Scott Arciszewski, scott@paragonie.com
Date
2016-01-11
Version
0.5.1
Source
wiki.php.net/rfc/libsodium

Votes

Libsodium as a Core Extension in PHP 7.2 closed
Yes
37
No
0
37 voters
aharvey Yes 2017-02-04 04:12
bishop Yes 2017-02-06 17:16
bwoebi Yes 2017-02-03 23:26
colinodell Yes 2017-02-04 18:13
daverandom Yes 2017-02-04 23:12
derick Yes 2017-02-07 07:31
dm Yes 2017-02-07 08:58
eliw Yes 2017-02-03 20:57
galvao Yes 2017-02-04 08:31
gooh Yes 2017-02-07 08:47
guilhermeblanco Yes 2017-02-06 21:38
jedisct1 Yes 2017-02-03 21:03
joey Yes 2017-02-06 22:56
jpauli Yes 2017-02-07 16:08
krakjoe Yes 2017-02-04 07:43
lcobucci Yes 2017-02-05 20:52
leigh Yes 2017-02-07 17:11
mbeccati Yes 2017-02-07 09:58
mike Yes 2017-02-04 08:28
nikic Yes 2017-02-06 14:57
ocramius Yes 2017-02-03 21:28
omars Yes 2017-02-08 10:37
pmjones Yes 2017-02-06 19:54
pollita Yes 2017-02-06 20:27
ramsey Yes 2017-02-05 19:58
rdohms Yes 2017-02-07 14:36
remi Yes 2017-02-06 17:51
salathe Yes 2017-02-06 19:28
sammyk Yes 2017-02-06 23:45
sebastian Yes 2017-02-04 05:28
stas Yes 2017-02-09 06:29
svpernova09 Yes 2017-02-05 20:10
tpunt Yes 2017-02-06 17:25
trowski Yes 2017-02-08 01:17
yohgaki Yes 2017-02-03 23:12
yunosh Yes 2017-02-06 10:40
zeev Yes 2017-02-07 05:33
Use the current PECL syntax? closed
Yes, \Sodium\foo
15
No, sodium_foo
23
38 voters
aharvey Yes, \Sodium\foo 2017-02-04 04:12
ajf Yes, \Sodium\foo 2017-02-08 19:58
bishop No, sodium_foo 2017-02-06 17:16
bwoebi No, sodium_foo 2017-02-03 23:26
danack No, sodium_foo 2017-02-07 14:35
daverandom Yes, \Sodium\foo 2017-02-04 23:12
derick No, sodium_foo 2017-02-07 07:31
dm Yes, \Sodium\foo 2017-02-07 08:58
eliw No, sodium_foo 2017-02-03 20:57
galvao Yes, \Sodium\foo 2017-02-04 08:32
guilhermeblanco Yes, \Sodium\foo 2017-02-06 21:48
jedisct1 Yes, \Sodium\foo 2017-02-03 21:03
jhdxr No, sodium_foo 2017-02-07 07:58
joey Yes, \Sodium\foo 2017-02-06 22:57
jpauli No, sodium_foo 2017-02-07 16:08
kelunik No, sodium_foo 2017-02-06 18:06
krakjoe Yes, \Sodium\foo 2017-02-04 07:43
lcobucci Yes, \Sodium\foo 2017-02-05 20:52
leigh No, sodium_foo 2017-02-07 17:11
levim Yes, \Sodium\foo 2017-02-04 15:23
mbeccati No, sodium_foo 2017-02-07 09:59
nikic Yes, \Sodium\foo 2017-02-03 23:35
ocramius Yes, \Sodium\foo 2017-02-03 21:28
omars No, sodium_foo 2017-02-08 10:39
pmjones No, sodium_foo 2017-02-06 19:53
pollita No, sodium_foo 2017-02-06 20:27
ramsey No, sodium_foo 2017-02-07 04:38
rdohms No, sodium_foo 2017-02-07 14:39
remi Yes, \Sodium\foo 2017-02-06 17:51
salathe No, sodium_foo 2017-02-06 19:22
sammyk No, sodium_foo 2017-02-08 16:13
sebastian Yes, \Sodium\foo 2017-02-04 05:28
stas No, sodium_foo 2017-02-09 06:29
svpernova09 No, sodium_foo 2017-02-10 16:31
trowski No, sodium_foo 2017-02-08 01:17
yohgaki No, sodium_foo 2017-02-03 23:14
yunosh No, sodium_foo 2017-02-06 10:40
zeev No, sodium_foo 2017-02-07 05:33

Discussions on the mailing list

[RFC] [PHP 7.1] libsodium
by Scott Arciszewski · 12 messages
[RFC] Libsodium
by Scott Arciszewski · 25 messages
[RFC] Libsodium (bump)
by Scott Arciszewski · 14 messages
[RFC] Libsodium (bump)
by Scott Arciszewski · 1 message
[RFC] Libsodium - Discussion
by Scott Arciszewski · 39 messages
[RFC] [VOTE] Libsodium as a core extension in PHP 7.2
by Scott Arciszewski · 13 messages
Namespaces in Core
by Fleshgrinder · 27 messages

RFC text

Copied from wiki.php.net, last synchronized Oct 13, 2026 11:51 UTC

Introduction

As we move towards PHP 7.0.0, we must look at the current state of cryptography in PHP. Libmcrypt hasn't been touched in eight years (last release was in 2007), leaving openssl as the only viable option for PHP 5.x and 7.0 users.

Meanwhile, libsodium bindings have been available in PECL for a while now, and has reached stability.

Libsodium is a modern cryptography library that offers authenticated encryption, high-speed elliptic curve cryptography, and much more. Unlike other cryptography standards (which are a potluck of cryptography primitives; i.e. WebCrypto), libsodium is comprised of carefully selected algorithms implemented by security experts to avoid side-channel vulnerabilities.

I maintain the documentation for the PHP extension here.

Proposal

This proposal is to adopt the libsodium extension (as ext/sodium) in the PHP core in PHP 7.2.0.

Currently, the libsodium extension in PECL uses the `Sodium` namespace, which runs contrary to the coding standards. If this RFC adopted into the PHP core, the namespace can be changed to conform to the coding standards (pending the outcome of a secondary vote).

    // In PECL today:
    $key = \Sodium\randombytes_buf(\Sodium\CRYPTO_SECRETBOX_KEYBYTES);
    $nonce = \Sodium\randombytes_buf(\Sodium\CRYPTO_SECRETBOX_NONCEBYTES);
    $message = \Sodium\crypto_secretbox(
        $plaintext,
        $key,
        $nonce
    );
    
    // If the second vote is against the use of a namespace:
    $key = sodium_randombytes_buf(SODIUM_CRYPTO_SECRETBOX_KEYBYTES);
    $nonce = sodium_randombytes_buf(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
    $message = sodium_crypto_secretbox(
        $plaintext,
        $key,
        $nonce
    );

Libsodium has a plethora of useful cryptography features:

  • Password hashing and key derivation (sodium_crypto_pwhash_*)
    • Argon2i (the chosen algorithm of the Password Hashing Competition)
    • Scrypt
  • ECDH over Curve25519 (sodium_crypto_box)
  • Authenticated secret key encryption (sodium_crypto_secretbox)
  • Ed25519 digital signatures (sodium_crypto_sign)
  • AEAD Modes
    • ChaCha20-Poly1305
    • AES-256-GCM

Libsodium (like NaCl, from which it was forked) is widely regarded by cryptography and security industry experts for many reasons:

  • No guesswork. The APIs are simple and powerful.
  • Conservative security. Great effort was taken to perform every security-critical operation in constant time.
  • Best-in-class elliptic curve cryptography.

Libsodium API Subset

  • Mainline NaCl Features
    • \Sodium\crypto_auth()
    • \Sodium\crypto_auth_verify()
    • \Sodium\crypto_box()
    • \Sodium\crypto_box_open()
    • \Sodium\crypto_scalarmult()
    • \Sodium\crypto_secretbox()
    • \Sodium\crypto_secretbox_open()
    • \Sodium\crypto_sign()
    • \Sodium\crypto_sign_open()
  • PECL Libsodium Features
    • \Sodium\crypto_aead_chacha20poly1305_encrypt()
    • \Sodium\crypto_aead_chacha20poly1305_decrypt()
    • \Sodium\crypto_aead_chacha20poly1305_ietf_encrypt()
    • \Sodium\crypto_aead_chacha20poly1305_ietf_decrypt()
    • \Sodium\crypto_box_keypair()
    • \Sodium\crypto_box_keypair_from_secretkey_and_publickey()
    • \Sodium\crypto_box_publickey()
    • \Sodium\crypto_box_publickey_from_secretkey()
    • \Sodium\crypto_box_seal()
    • \Sodium\crypto_box_seal_open()
    • \Sodium\crypto_box_secretkey()
    • \Sodium\crypto_generichash()
    • \Sodium\crypto_generichash_init()
    • \Sodium\crypto_generichash_update()
    • \Sodium\crypto_generichash_final()
    • \Sodium\crypto_kx()
    • \Sodium\crypto_pwhash()
    • \Sodium\crypto_pwhash_str()
    • \Sodium\crypto_pwhash_str_verify()
    • \Sodium\crypto_shorthash()
    • \Sodium\crypto_sign_detached()
    • \Sodium\crypto_sign_keypair()
    • \Sodium\crypto_sign_publickey()
    • \Sodium\crypto_sign_publickey_from_secretkey()
    • \Sodium\crypto_sign_secretkey()
    • \Sodium\crypto_sign_verify_detached()
    • \Sodium\crypto_stream()
    • \Sodium\crypto_stream_xor()
    • \Sodium\compare()
    • \Sodium\memzero()
    • \Sodium\increment()

Because crypto_aead_encrypt() will be the CAESAR finalist, we should tentatively commit to adding that one day. https://competitions.cr.yp.to/caesar.html

We don't need crypto_aead_aes256gcm since that's provided by OpenSSL. We only provide ChaCha20-Poly1305 for e.g. Noise protocol integrations.

We don't need scrypt; we have crypto_pwhash() which is Argon2i.

We don't need several other utilities (bin2hex, hex2bin, etc.). Instead, we should make those existing mainline functions cache-timing safe. We MAY decide to add function aliases (e.g. \Sodium\bin2hex() -> \bin2hex()) for compatibility with software already written for ext/sodium.

Proposed PHP Version(s)

This RFC targets PHP 7.2.

RFC Impact

I'm not aware of any potential impact that adopting ext/sodium will have on other RFCs.

Future Scope

With libsodium in the PHP core, we may be able to update the Phar extension to support Ed25519 signatures. This will be a great boon for authentic PHP Archive distribution. The current best option, OpenSSL, may provide inadequate security.

New Constants

See the list of all libsodium constants in the reference. In every case, \Sodium\FOO will be transformed to SODIUM_FOO.

\Sodium\CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES	=>	32
\Sodium\CRYPTO_AEAD_CHACHA20POLY1305_NSECBYTES	=>	0
\Sodium\CRYPTO_AEAD_CHACHA20POLY1305_NPUBBYTES	=>	8
\Sodium\CRYPTO_AEAD_CHACHA20POLY1305_ABYTES	=>	16
\Sodium\CRYPTO_AEAD_CHACHA20POLY1305_IETF_KEYBYTES	=>	32
\Sodium\CRYPTO_AEAD_CHACHA20POLY1305_IETF_NSECBYTES	=>	0
\Sodium\CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES	=>	12
\Sodium\CRYPTO_AEAD_CHACHA20POLY1305_IETF_ABYTES	=>	16 
\Sodium\CRYPTO_AUTH_BYTES	=>	32
\Sodium\CRYPTO_AUTH_KEYBYTES	=>	32
\Sodium\CRYPTO_BOX_SEALBYTES	=>	16
\Sodium\CRYPTO_BOX_SECRETKEYBYTES	=>	32
\Sodium\CRYPTO_BOX_PUBLICKEYBYTES	=>	32
\Sodium\CRYPTO_BOX_KEYPAIRBYTES	=>	64
\Sodium\CRYPTO_BOX_MACBYTES	=>	16
\Sodium\CRYPTO_BOX_NONCEBYTES	=>	24
\Sodium\CRYPTO_BOX_SEEDBYTES	=>	32
\Sodium\CRYPTO_KX_BYTES	=>	32
\Sodium\CRYPTO_KX_PUBLICKEYBYTES	=>	32
\Sodium\CRYPTO_KX_SECRETKEYBYTES	=>	32
\Sodium\CRYPTO_GENERICHASH_BYTES	=>	32
\Sodium\CRYPTO_GENERICHASH_BYTES_MIN	=>	16
\Sodium\CRYPTO_GENERICHASH_BYTES_MAX	=>	64
\Sodium\CRYPTO_GENERICHASH_KEYBYTES	=>	32
\Sodium\CRYPTO_GENERICHASH_KEYBYTES_MIN	=>	16
\Sodium\CRYPTO_GENERICHASH_KEYBYTES_MAX	=>	64
\Sodium\CRYPTO_PWHASH_SALTBYTES	=>	16
\Sodium\CRYPTO_PWHASH_STRPREFIX	=>	$argon2i$
\Sodium\CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE	=>	4
\Sodium\CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE	=>	33554432
\Sodium\CRYPTO_PWHASH_OPSLIMIT_MODERATE	=>	6
\Sodium\CRYPTO_PWHASH_MEMLIMIT_MODERATE	=>	134217728
\Sodium\CRYPTO_PWHASH_OPSLIMIT_SENSITIVE	=>	8
\Sodium\CRYPTO_PWHASH_MEMLIMIT_SENSITIVE	=>	536870912
\Sodium\CRYPTO_SCALARMULT_BYTES	=>	32
\Sodium\CRYPTO_SCALARMULT_SCALARBYTES	=>	32
\Sodium\CRYPTO_SHORTHASH_BYTES	=>	8
\Sodium\CRYPTO_SHORTHASH_KEYBYTES	=>	16
\Sodium\CRYPTO_SECRETBOX_KEYBYTES	=>	32
\Sodium\CRYPTO_SECRETBOX_MACBYTES	=>	16
\Sodium\CRYPTO_SECRETBOX_NONCEBYTES	=>	24
\Sodium\CRYPTO_SIGN_BYTES	=>	64
\Sodium\CRYPTO_SIGN_SEEDBYTES	=>	32
\Sodium\CRYPTO_SIGN_PUBLICKEYBYTES	=>	32
\Sodium\CRYPTO_SIGN_SECRETKEYBYTES	=>	64
\Sodium\CRYPTO_SIGN_KEYPAIRBYTES	=>	96
\Sodium\CRYPTO_STREAM_KEYBYTES	=>	32
\Sodium\CRYPTO_STREAM_NONCEBYTES	=>	24

Proposed Voting Choices

Voting starts on 2017-02-03 20:42 UTC and closes on 2017-02-10 21:00 UTC.

Vote YES to add ext/sodium to PHP 7.2. As per new voting rules, a 2/3 majority is required.

Vote: Libsodium as a Core Extension in PHP 7.2 — Yes: 37 · No: 0 (closed)

Second vote: Vote YES to keep the namespace (\Sodium\etc), vote NO to switch to a prefix in the global namespace (sodium_etc). A 2/3 majority is also required for “Yes” to be accepted. The default is for “No”.

Vote: Use the current PECL syntax? — Yes, \Sodium\foo: 15 · No, sodium_foo: 23 (closed)

Implementation

  1. merged to PHP 7.2+ in http://git.php.net/?p=php-src.git;a=commit;h=5cfa26c18189ae5e0ae8bb1eac5dd0e213a2bb3e
  2. PHP manual section: yet missing

References

Links to external references, discussions or RFCs: