On Mon, Aug 31, 2015 at 5:16 PM, Anatol Belski <anatol....@belski.net> wrote: > Hi Jakub, > >> -----Original Message----- >> From: jakub....@gmail.com [mailto:jakub....@gmail.com] On Behalf Of Jakub >> Zelenka >> Sent: Monday, August 31, 2015 10:13 PM >> To: Anatol Belski <anatol....@belski.net> >> Cc: PHP internals list <internals@lists.php.net>; Ferenc Kovacs >> <tyr...@gmail.com>; Pierre Joye <pierre....@gmail.com> >> Subject: Re: [PHP-DEV] openssl_seal new param >> >> Hi Anatol, >> >> On Mon, Aug 31, 2015 at 12:17 PM, Anatol Belski <anatol....@belski.net> >> wrote: >> > >> > > Hi, >> > > >> > > I have been looking to https://bugs.php.net/bug.php?id=60632 which >> > > is >> > about >> > > failing (segfaulting) openssl_seal when used with cipher alg that >> > requires IV (e.g. >> > > AES-128-CBC). I think that the patch looks reasonable from the quick >> > look. >> > > >> > > The only question and the reason why I'm sending this here is if >> > everyone (and >> > > mainly Ferenc ) is ok with adding new ref arg to openssl_seal that >> > > will >> > return iv >> > > to 5.6? So the definition is: >> > > >> > > int openssl_seal ( string $data , string &$sealed_data , array >> > &$env_keys , array >> > > $pub_key_ids [, string $method[, string &$iv ]] ) >> > > >> > > (the last iv is new). There would be also a new param for >> > > openssl_open >> > that >> > > would allow to pass that IV for opening sealed data. >> > > >> > > Alternatively we could just disable IV ciphers in 5.6 to at least >> > prevent the >> > > segfault and add it to 7 if Anatol and Kalle are ok with that or 7.1 >> > > if >> > not :) ? >> > > >> > Were it possible to list the ciphers that are affected? IMHO adding >> > the IV arg were fine for 7.0 if there are many ciphers affected (say >> > 1/3 of them), otherwise just checking EVP_CIPHER_iv_length() and >> > returning false were appropriate with a subsequent proper fix flowing into >> > 7.1. >> > >> > >> It's actually about cipher algorithms (cipher + mode) where the IV is >> required by >> the mode en/decryption. Basically all modes except ECB require IV. There also >> are some archaic ciphers that don't have mode defined which is equal ECB >> (example is default example cipher for rc4). If you do >> >> php -r 'print_r(openssl_get_cipher_methods());' >> >> you will see that there are more than 80% of cipher algs requiring IV. >> >> The main thing is that openssl_seal doesn't have a practical usage at the >> moment if you encrypt (seal) a message longer than one block size because >> there is a risk of reply attack. >> >> The patch is self contained so I think that it shouldn't be a big issue for >> 7.0 if you are fine with that? >> >> About 5.6 I'm not really sure. I'm not a big fun of changing signature in >> the later >> stages of point release. It could be also a small motivation for updating to >> 7. So >> probably best to disable IV ciphers for 5.6 just to fix the segfault. If >> anyone >> doesn't have any objection and you are ok with adding new param to 7, I will >> go >> for it. >> > Yeah, just reread the docs - CBC, CFB, OFB, CTR all require an IV. And the > ECB mode which is the only available is weak. IMHO doing the necessary change > in 7.0 is legit because the only usable cipher mode is weak, and any other > mode will lead to crash. I were ok with the additional optional argument you > suggest if there are no other objections. > >> >> > > There also is an another thing for TS Win build (probably question >> > > for >> > Anatol and >> > > Pierre :) ). The thing is that EVP_SealInit uses internally RAND_bytes. >> > IIRC there is >> > > some locking issue with openssl RAND on TS win ( the reason why >> > > openssl_random_pseudo_bytes uses Win random) so I was wondering if >> > > it should be disabled on win? The thing is that it is already a case >> > > for >> > other >> > > functions. One example is generating key params in >> > > openssl_pkey_new: >> > > >> > > openssl_pkey_new(array( 'dh'=> array( 'p' => $bin_prime, 'g' => '2' >> > > ))); >> > > >> > > This will also call RAND_bytes when generating priv key. >> > > >> > If you look into crypto/rand/rand_lib.c within the openssl src - it is >> > not thread safe even in 1.0.2 branch. It is a good catch, but has only >> > to do with the thread safety. And the issue is exactly that there is >> > no locking around RAND_bytes() affected codes in PHP. So the issue is cross >> platform. >> > >> > A quick solution could be using the mutex functionality exported from >> > TSRM >> > (tsrm_mutex_*() functions) in the thread safe builds for affected >> > functions. >> > >> > >> > >> Yeah I was thinking about that after I sent an email yesterday. I will check >> if >> there are more places where this can be an issue and try to put together a >> patch. >> > TSRM is probably the best we have in the core right now. Mutex will sure have > a performance impact, but probably no way around it as openssl is always > external. After yet looking at the APIs, maybe one could setup the default > rand in MINIT, or force it to be always RAND_SSLeay(), but not sure it is a > better idea than locking. > > Regards > > Anatol > > > -- > PHP Internals - PHP Runtime Development Mailing List > To unsubscribe, visit: http://www.php.net/unsub.php >
At the risk of sounding silly, can we just use random_bytes()? :) Additionally, I'd like to (for example) be able to use ChaCha20 instead of RC4. Is that what the (currently undocumented) $method parameter is for? Scott Arciszewski Chief Development Officer Paragon Initiative Enterprises <https://paragonie.com> -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php