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.

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.

  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()?

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

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to