version 1.1.1.4, 2013/10/14 08:02:27
|
version 1.1.1.5, 2014/06/15 20:03:52
|
Line 2
|
Line 2
|
+----------------------------------------------------------------------+ |
+----------------------------------------------------------------------+ |
| PHP Version 5 | |
| PHP Version 5 | |
+----------------------------------------------------------------------+ |
+----------------------------------------------------------------------+ |
| Copyright (c) 1997-2013 The PHP Group | | | Copyright (c) 1997-2014 The PHP Group | |
+----------------------------------------------------------------------+ |
+----------------------------------------------------------------------+ |
| This source file is subject to version 3.01 of the PHP license, | |
| This source file is subject to version 3.01 of the PHP license, | |
| that is bundled with this package in the file LICENSE, and is | |
| that is bundled with this package in the file LICENSE, and is | |
Line 78
|
Line 78
|
#endif |
#endif |
#define DEBUG_SMIME 0 |
#define DEBUG_SMIME 0 |
|
|
|
#if !defined(OPENSSL_NO_EC) && defined(EVP_PKEY_EC) |
|
#define HAVE_EVP_PKEY_EC 1 |
|
#endif |
|
|
/* FIXME: Use the openssl constants instead of |
/* FIXME: Use the openssl constants instead of |
* enum. It is now impossible to match real values |
* enum. It is now impossible to match real values |
* against php constants. Also sorry to break the |
* against php constants. Also sorry to break the |
Line 88 enum php_openssl_key_type {
|
Line 92 enum php_openssl_key_type {
|
OPENSSL_KEYTYPE_DSA, |
OPENSSL_KEYTYPE_DSA, |
OPENSSL_KEYTYPE_DH, |
OPENSSL_KEYTYPE_DH, |
OPENSSL_KEYTYPE_DEFAULT = OPENSSL_KEYTYPE_RSA, |
OPENSSL_KEYTYPE_DEFAULT = OPENSSL_KEYTYPE_RSA, |
#ifdef EVP_PKEY_EC | #ifdef HAVE_EVP_PKEY_EC |
OPENSSL_KEYTYPE_EC = OPENSSL_KEYTYPE_DH +1 |
OPENSSL_KEYTYPE_EC = OPENSSL_KEYTYPE_DH +1 |
#endif |
#endif |
}; |
}; |
Line 645 static time_t asn1_time_to_time_t(ASN1_UTCTIME * times
|
Line 649 static time_t asn1_time_to_time_t(ASN1_UTCTIME * times
|
char * thestr; |
char * thestr; |
long gmadjust = 0; |
long gmadjust = 0; |
|
|
if (timestr->length < 13) { | if (ASN1_STRING_type(timestr) != V_ASN1_UTCTIME) { |
php_error_docref(NULL TSRMLS_CC, E_WARNING, "extension author too lazy to parse %s correctly", timestr->data); | php_error_docref(NULL TSRMLS_CC, E_WARNING, "illegal ASN1 data type for timestamp"); |
return (time_t)-1; |
return (time_t)-1; |
} |
} |
|
|
strbuf = estrdup((char *)timestr->data); | if (ASN1_STRING_length(timestr) != strlen(ASN1_STRING_data(timestr))) { |
| php_error_docref(NULL TSRMLS_CC, E_WARNING, "illegal length in timestamp"); |
| return (time_t)-1; |
| } |
|
|
|
if (ASN1_STRING_length(timestr) < 13) { |
|
php_error_docref(NULL TSRMLS_CC, E_WARNING, "unable to parse time string %s correctly", timestr->data); |
|
return (time_t)-1; |
|
} |
|
|
|
strbuf = estrdup((char *)ASN1_STRING_data(timestr)); |
|
|
memset(&thetime, 0, sizeof(thetime)); |
memset(&thetime, 0, sizeof(thetime)); |
|
|
/* we work backwards so that we can use atoi more easily */ |
/* we work backwards so that we can use atoi more easily */ |
|
|
thestr = strbuf + timestr->length - 3; | thestr = strbuf + ASN1_STRING_length(timestr) - 3; |
|
|
thetime.tm_sec = atoi(thestr); |
thetime.tm_sec = atoi(thestr); |
*thestr = '\0'; |
*thestr = '\0'; |
Line 844 static int php_openssl_parse_config(struct php_x509_re
|
Line 858 static int php_openssl_parse_config(struct php_x509_re
|
req->digest = req->md_alg = EVP_get_digestbyname(req->digest_name); |
req->digest = req->md_alg = EVP_get_digestbyname(req->digest_name); |
} |
} |
if (req->md_alg == NULL) { |
if (req->md_alg == NULL) { |
req->md_alg = req->digest = EVP_md5(); | req->md_alg = req->digest = EVP_sha1(); |
} |
} |
|
|
PHP_SSL_CONFIG_SYNTAX_CHECK(extensions_section); |
PHP_SSL_CONFIG_SYNTAX_CHECK(extensions_section); |
Line 1106 PHP_MINIT_FUNCTION(openssl)
|
Line 1120 PHP_MINIT_FUNCTION(openssl)
|
REGISTER_LONG_CONSTANT("OPENSSL_KEYTYPE_DSA", OPENSSL_KEYTYPE_DSA, CONST_CS|CONST_PERSISTENT); |
REGISTER_LONG_CONSTANT("OPENSSL_KEYTYPE_DSA", OPENSSL_KEYTYPE_DSA, CONST_CS|CONST_PERSISTENT); |
#endif |
#endif |
REGISTER_LONG_CONSTANT("OPENSSL_KEYTYPE_DH", OPENSSL_KEYTYPE_DH, CONST_CS|CONST_PERSISTENT); |
REGISTER_LONG_CONSTANT("OPENSSL_KEYTYPE_DH", OPENSSL_KEYTYPE_DH, CONST_CS|CONST_PERSISTENT); |
#ifdef EVP_PKEY_EC | #ifdef HAVE_EVP_PKEY_EC |
REGISTER_LONG_CONSTANT("OPENSSL_KEYTYPE_EC", OPENSSL_KEYTYPE_EC, CONST_CS|CONST_PERSISTENT); |
REGISTER_LONG_CONSTANT("OPENSSL_KEYTYPE_EC", OPENSSL_KEYTYPE_EC, CONST_CS|CONST_PERSISTENT); |
#endif |
#endif |
|
|
Line 3004 static int php_openssl_is_private_key(EVP_PKEY* pkey T
|
Line 3018 static int php_openssl_is_private_key(EVP_PKEY* pkey T
|
} |
} |
break; |
break; |
#endif |
#endif |
|
#ifdef HAVE_EVP_PKEY_EC |
|
case EVP_PKEY_EC: |
|
assert(pkey->pkey.ec != NULL); |
|
|
|
if ( NULL == EC_KEY_get0_private_key(pkey->pkey.ec)) { |
|
return 0; |
|
} |
|
break; |
|
#endif |
default: |
default: |
php_error_docref(NULL TSRMLS_CC, E_WARNING, "key type not supported in this PHP build!"); |
php_error_docref(NULL TSRMLS_CC, E_WARNING, "key type not supported in this PHP build!"); |
break; |
break; |
Line 3404 PHP_FUNCTION(openssl_pkey_get_details)
|
Line 3427 PHP_FUNCTION(openssl_pkey_get_details)
|
} |
} |
|
|
break; |
break; |
#ifdef EVP_PKEY_EC | #ifdef HAVE_EVP_PKEY_EC |
case EVP_PKEY_EC: |
case EVP_PKEY_EC: |
ktype = OPENSSL_KEYTYPE_EC; |
ktype = OPENSSL_KEYTYPE_EC; |
break; |
break; |
Line 4298 PHP_FUNCTION(openssl_seal)
|
Line 4321 PHP_FUNCTION(openssl_seal)
|
|
|
if (!EVP_EncryptInit(&ctx,cipher,NULL,NULL)) { |
if (!EVP_EncryptInit(&ctx,cipher,NULL,NULL)) { |
RETVAL_FALSE; |
RETVAL_FALSE; |
|
EVP_CIPHER_CTX_cleanup(&ctx); |
goto clean_exit; |
goto clean_exit; |
} |
} |
|
|
Line 4308 PHP_FUNCTION(openssl_seal)
|
Line 4332 PHP_FUNCTION(openssl_seal)
|
#endif |
#endif |
/* allocate one byte extra to make room for \0 */ |
/* allocate one byte extra to make room for \0 */ |
buf = emalloc(data_len + EVP_CIPHER_CTX_block_size(&ctx)); |
buf = emalloc(data_len + EVP_CIPHER_CTX_block_size(&ctx)); |
|
EVP_CIPHER_CTX_cleanup(&ctx); |
|
|
if (!EVP_SealInit(&ctx, cipher, eks, eksl, NULL, pkeys, nkeys) || !EVP_SealUpdate(&ctx, buf, &len1, (unsigned char *)data, data_len)) { |
if (!EVP_SealInit(&ctx, cipher, eks, eksl, NULL, pkeys, nkeys) || !EVP_SealUpdate(&ctx, buf, &len1, (unsigned char *)data, data_len)) { |
RETVAL_FALSE; |
RETVAL_FALSE; |
efree(buf); |
efree(buf); |
|
EVP_CIPHER_CTX_cleanup(&ctx); |
goto clean_exit; |
goto clean_exit; |
} |
} |
|
|
Line 4344 PHP_FUNCTION(openssl_seal)
|
Line 4370 PHP_FUNCTION(openssl_seal)
|
efree(buf); |
efree(buf); |
} |
} |
RETVAL_LONG(len1 + len2); |
RETVAL_LONG(len1 + len2); |
|
EVP_CIPHER_CTX_cleanup(&ctx); |
|
|
clean_exit: |
clean_exit: |
for (i=0; i<nkeys; i++) { |
for (i=0; i<nkeys; i++) { |
Line 4402 PHP_FUNCTION(openssl_open)
|
Line 4429 PHP_FUNCTION(openssl_open)
|
if (EVP_OpenInit(&ctx, cipher, (unsigned char *)ekey, ekey_len, NULL, pkey) && EVP_OpenUpdate(&ctx, buf, &len1, (unsigned char *)data, data_len)) { |
if (EVP_OpenInit(&ctx, cipher, (unsigned char *)ekey, ekey_len, NULL, pkey) && EVP_OpenUpdate(&ctx, buf, &len1, (unsigned char *)data, data_len)) { |
if (!EVP_OpenFinal(&ctx, buf + len1, &len2) || (len1 + len2 == 0)) { |
if (!EVP_OpenFinal(&ctx, buf + len1, &len2) || (len1 + len2 == 0)) { |
efree(buf); |
efree(buf); |
if (keyresource == -1) { | RETVAL_FALSE; |
EVP_PKEY_free(pkey); | } else { |
} | zval_dtor(opendata); |
RETURN_FALSE; | buf[len1 + len2] = '\0'; |
| ZVAL_STRINGL(opendata, erealloc(buf, len1 + len2 + 1), len1 + len2, 0); |
| RETVAL_TRUE; |
} |
} |
} else { |
} else { |
efree(buf); |
efree(buf); |
if (keyresource == -1) { | RETVAL_FALSE; |
EVP_PKEY_free(pkey); | |
} | |
RETURN_FALSE; | |
} |
} |
if (keyresource == -1) { |
if (keyresource == -1) { |
EVP_PKEY_free(pkey); |
EVP_PKEY_free(pkey); |
} |
} |
zval_dtor(opendata); | EVP_CIPHER_CTX_cleanup(&ctx); |
buf[len1 + len2] = '\0'; | |
ZVAL_STRINGL(opendata, erealloc(buf, len1 + len2 + 1), len1 + len2, 0); | |
RETURN_TRUE; | |
} |
} |
/* }}} */ |
/* }}} */ |
|
|
Line 4613 SSL *php_SSL_new_from_context(SSL_CTX *ctx, php_stream
|
Line 4636 SSL *php_SSL_new_from_context(SSL_CTX *ctx, php_stream
|
|
|
GET_VER_OPT_STRING("local_cert", certfile); |
GET_VER_OPT_STRING("local_cert", certfile); |
if (certfile) { |
if (certfile) { |
X509 *cert = NULL; |
|
EVP_PKEY *key = NULL; |
|
SSL *tmpssl; |
|
char resolved_path_buff[MAXPATHLEN]; |
char resolved_path_buff[MAXPATHLEN]; |
const char * private_key = NULL; |
const char * private_key = NULL; |
|
|
Line 4642 SSL *php_SSL_new_from_context(SSL_CTX *ctx, php_stream
|
Line 4662 SSL *php_SSL_new_from_context(SSL_CTX *ctx, php_stream
|
} |
} |
} |
} |
|
|
tmpssl = SSL_new(ctx); | #if OPENSSL_VERSION_NUMBER < 0x10001001L |
cert = SSL_get_certificate(tmpssl); | do { |
| /* Unnecessary as of OpenSSLv1.0.1 (will segfault if used with >= 10001001 ) */ |
| X509 *cert = NULL; |
| EVP_PKEY *key = NULL; |
| SSL *tmpssl = SSL_new(ctx); |
| cert = SSL_get_certificate(tmpssl); |
|
|
if (cert) { | if (cert) { |
key = X509_get_pubkey(cert); | key = X509_get_pubkey(cert); |
EVP_PKEY_copy_parameters(key, SSL_get_privatekey(tmpssl)); | EVP_PKEY_copy_parameters(key, SSL_get_privatekey(tmpssl)); |
EVP_PKEY_free(key); | EVP_PKEY_free(key); |
} | } |
SSL_free(tmpssl); | SSL_free(tmpssl); |
| } while (0); |
| #endif |
if (!SSL_CTX_check_private_key(ctx)) { |
if (!SSL_CTX_check_private_key(ctx)) { |
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Private key does not match certificate!"); |
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Private key does not match certificate!"); |
} |
} |
Line 4988 PHP_FUNCTION(openssl_cipher_iv_length)
|
Line 5014 PHP_FUNCTION(openssl_cipher_iv_length)
|
|
|
|
|
/* {{{ proto string openssl_dh_compute_key(string pub_key, resource dh_key) |
/* {{{ proto string openssl_dh_compute_key(string pub_key, resource dh_key) |
Computes shared sicret for public value of remote DH key and local DH key */ | Computes shared secret for public value of remote DH key and local DH key */ |
PHP_FUNCTION(openssl_dh_compute_key) |
PHP_FUNCTION(openssl_dh_compute_key) |
{ |
{ |
zval *key; |
zval *key; |