Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:46173 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 53567 invoked from network); 24 Nov 2009 17:27:35 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 24 Nov 2009 17:27:35 -0000 Authentication-Results: pb1.pair.com smtp.mail=rrichards@cdatazone.org; spf=softfail; sender-id=softfail Authentication-Results: pb1.pair.com header.from=rrichards@cdatazone.org; sender-id=softfail Received-SPF: softfail (pb1.pair.com: domain cdatazone.org does not designate 207.58.142.213 as permitted sender) X-PHP-List-Original-Sender: rrichards@cdatazone.org X-Host-Fingerprint: 207.58.142.213 smtp2go.com Linux 2.6 Received: from [207.58.142.213] ([207.58.142.213:44523] helo=smtp2go.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id BE/85-25180-1871C0B4 for ; Tue, 24 Nov 2009 12:27:30 -0500 Received: from [67.158.171.203] (helo=Rob-Richardss-MacBook-Pro.local) by smtp2go.com with esmtp (Exim 4.69) (envelope-from ) id 1NCzAh-0004tm-9R for internals@lists.php.net; Tue, 24 Nov 2009 17:27:23 +0000 Message-ID: <4B0C177A.6020500@cdatazone.org> Date: Tue, 24 Nov 2009 12:27:22 -0500 User-Agent: Thunderbird 2.0.0.23 (Macintosh/20090812) MIME-Version: 1.0 To: PHP Developers Mailing List Content-Type: multipart/mixed; boundary="------------090302030801020501040901" X-SMTP2Go-MailScanner-Information: Please contact support@smtp2go.com for more information X-SMTP2Go-MailScanner-ID: 1NCzAh-0004tm-9R X-SMTP2Go-MailScanner: Found to be clean X-SMTP2Go-MailScanner-From: rrichards@cdatazone.org Subject: openssl supported algorithms From: rrichards@cdatazone.org (Rob Richards) --------------090302030801020501040901 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit The openssl extension is way to restrictive in the algorithms it supports, i.e. no support for SHA265 which is starting to become the standard algo to use, etc.. Rather than having to always add more constants and additional logic for any new algorithms, I'd like to change the sign and verify functions to not only accept the current integers, but also a string so the EVP_get_digestbyname function can be used. So while still supporting something list: openssl_sign($data, $signature, $priv_key_id, OPENSSL_ALGO_SHA1) It can also be called using: openssl_sign($data, $signature, $priv_key_id, "SHA1") openssl_sign($data, $signature, $priv_key_id, "SHA256") Attached is a patch to illustrate the change made to the PHP_5_2 branch (only to the sign function but same change would be made to verify as well). I'd really like to be able to support the string based algorithm rather than always having to add constants just for the added flexibility but in any case we really need to add support for more than what we have now. Personally I'd also like to see this in 5.2.12 but know that might be pushing it. Rob --------------090302030801020501040901 Content-Type: text/plain; name="openssl.c.diff.txt" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="openssl.c.diff.txt" Index: openssl.c =================================================================== --- openssl.c (revision 291215) +++ openssl.c (working copy) @@ -3504,11 +3504,11 @@ } /* }}} */ -/* {{{ proto bool openssl_sign(string data, &string signature, mixed key[, int signature_alg]) +/* {{{ proto bool openssl_sign(string data, &string signature, mixed key[, mixed signature_alg]) Signs data */ PHP_FUNCTION(openssl_sign) { - zval **key, *signature; + zval **key, *signature, *digest_algo; EVP_PKEY *pkey; int siglen; unsigned char *sigbuf; @@ -3516,10 +3516,9 @@ char * data; int data_len; EVP_MD_CTX md_ctx; - long signature_algo = OPENSSL_ALGO_SHA1; - EVP_MD *mdtype; + EVP_MD *mdtype = NULL; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "szZ|l", &data, &data_len, &signature, &key, &signature_algo) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "szZ|z!", &data, &data_len, &signature, &key, &digest_algo) == FAILURE) { return; } pkey = php_openssl_evp_from_zval(key, 0, "", 0, &keyresource TSRMLS_CC); @@ -3528,7 +3527,17 @@ RETURN_FALSE; } - mdtype = php_openssl_get_evp_md_from_algo(signature_algo); + if ((digest_algo != NULL) && (Z_TYPE_P(digest_algo) == IS_STRING)) { + mdtype = EVP_get_digestbyname(Z_STRVAL_P(digest_algo)); + } else { + long signature_algo = OPENSSL_ALGO_SHA1; + if ((digest_algo != NULL)) { + convert_to_long(digest_algo); + signature_algo = Z_LVAL_P(digest_algo); + } + mdtype = php_openssl_get_evp_md_from_algo(signature_algo); + } + if (!mdtype) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown signature algorithm."); RETURN_FALSE; --------------090302030801020501040901--