On Thu, Jun 2, 2016 at 2:10 PM, Niklas Keller <m...@kelunik.com> wrote:
> 2016-06-02 19:36 GMT+02:00 Fleshgrinder <p...@fleshgrinder.com>: > >> On 6/1/2016 9:25 PM, Niklas Keller wrote: >> > Why does it directly extend throwable? >> > >> > Just a short node: the keys shouldn't be responsible for signing / >> > verification. >> > >> >> This was not a real proposal, I only wanted to illustrate the potential >> for a nice OO implementation. >> > > Yes, sure. > > >> The goal is it to make crypto simpler for userland. Well, having >> dedicated classes and everything type hinting against those makes it >> very easy. >> >> For instance nonce arguments ... >> >> $nonce = randombytes_buf(CRYPTO_SECRETBOX_NONCEBYTES); >> crypto_secretbox(... >> >> $message_nonce = randombytes_buf(CRYPTO_BOX_NONCEBYTES); >> crypto_box(... >> >> $nonce = randombytes_buf(CRYPTO_AEAD_CHACHA20POLY1305_NPUBBYTES); >> crypto_aead_chacha20poly1305_encrypt(... >> >> $nonce = randombytes_buf(CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES); >> crypto_aead_chacha20poly1305_ietf_encrypt(... >> >> $nonce = randombytes_buf(CRYPTO_AEAD_AES256GCM_NPUBBYTES); >> crypto_aead_aes256gcm_encrypt(... >> >> ... >> >> This is not only super annoying, it also requires you to perform the >> same fixtures all the time and allows users to make mistakes, e.g. >> reusing the same nonce. >> > > I agree, we should expose a higher level API. For nonces, a random value > might even be bad, because of the birthday paradoxon. But it's probably > best if the user doesn't even have to care about generating a nonce > manually. > > >> namespace Php\Sodium { >> >> class Nonce { >> >> function __construct(int $bytes); >> >> function __toString(): string; >> >> function getBytes(): int; >> >> } >> >> } >> >> namespace Php\Sodium\Asymmetric { >> >> class EncryptedMessage { >> >> function decrypt(PrivateKey $private_key): Message; >> >> function getNonce(): Nonce; >> >> } >> >> class Message { >> >> function __construct(string $plain_text); >> >> function encrypt(PublicKey $public_key): EncryptedMessage; >> >> } >> >> } >> >> Of course some of the provided stuff is not well suited for OO but those >> could be implemented normally as procedural functions. However, I >> question the names and the functionality of some. For instance: >> >> Isn't randombytes_buf() pretty much the same as random_bytes()? >> > > Yes, and thus I think it shouldn't be exposed to userland. > > >> randombytes_uniform() has a weird name that does not really tell what it >> does. random_int_uniform() would be better and match the existing >> random_int() function. >> >> Why does randombytes_random16() even exist? It does exactly the same as >> randombytes_uniform(65536)? >> >> Again, I really like the goal but I don't think that the current >> proposal meets it. I also understand the desire to have it in 7.1 but it >> is the same problem as in every company: rushing is bad! Once released >> we're done. We cannot remove it anymore, we cannot change it anymore, we >> have to live with it. All because we wanted something better but too fast. >> >> Let's give it some time to come up with a simpler solution that >> integrates nicely into existing PHP. Without confusion over functions >> that are doing what already existing functions to. With classes that >> encapsulate complicated stuff and make it hard to get things wrong. >> >> -- >> Richard "Fleshgrinder" Fussenegger >> >> > The birthday bound of a crypto_box or crypto_secretbox nonce, generated from a CSPRNG, is 2^96 for one collision. If it's gonna happen, you've got bigger things to worry about. I should probably state clearly that the concept of an abstract pluggable crypto API that supports OpenSSL and Libsodium isn't what I'm proposing here. Just libsodium. If I find time to write the pluggable crypto API, I will propose that next. Unfortunately, that likely won't be until 7.2. Scott Arciszewski Chief Development Officer Paragon Initiative Enterprises <https://paragonie.com/>