static X509 *php_openssl_x509_from_param(zend_object *cert_obj, zend_string *cert_str);
static X509 *php_openssl_x509_from_zval(zval *val, bool *free_cert);
static X509_REQ *php_openssl_csr_from_param(zend_object *csr_obj, zend_string *csr_str);
-static EVP_PKEY *php_openssl_pkey_from_zval(zval *val, int public_key, char *passphrase, size_t passphrase_len, bool *free_pkey);
+static EVP_PKEY *php_openssl_pkey_from_zval(zval *val, int public_key, char *passphrase, size_t passphrase_len);
static int php_openssl_is_private_key(EVP_PKEY* pkey);
static X509_STORE * php_openssl_setup_verify(zval * calist);
size_t challenge_len;
char * challenge = NULL, *spkstr = NULL;
zend_string * s = NULL;
- bool free_pkey = 0;
const char *spkac = "SPKAC=";
zend_long algo = OPENSSL_ALGO_MD5;
PHP_OPENSSL_CHECK_SIZE_T_TO_INT(challenge_len, challenge);
- pkey = php_openssl_pkey_from_zval(zpkey, 0, challenge, challenge_len, &free_pkey);
+ pkey = php_openssl_pkey_from_zval(zpkey, 0, challenge, challenge_len);
if (pkey == NULL) {
if (!EG(exception)) {
php_error_docref(NULL, E_WARNING, "Unable to use supplied private key");
goto cleanup;
cleanup:
-
+ if (pkey != NULL) {
+ EVP_PKEY_free(pkey);
+ }
if (spki != NULL) {
NETSCAPE_SPKI_free(spki);
}
zend_string *cert_str;
zval *zkey;
EVP_PKEY * key = NULL;
- bool free_pkey = 0;
ZEND_PARSE_PARAMETERS_START(2, 2)
Z_PARAM_STR_OR_OBJ_OF_CLASS(cert_str, cert_obj, php_openssl_certificate_ce)
RETVAL_FALSE;
- key = php_openssl_pkey_from_zval(zkey, 0, "", 0, &free_pkey);
+ key = php_openssl_pkey_from_zval(zkey, 0, "", 0);
if (key) {
RETVAL_BOOL(X509_check_private_key(cert, key));
- }
-
- if (free_pkey && key) {
EVP_PKEY_free(key);
}
zend_string *cert_str;
zval *zkey;
EVP_PKEY * key = NULL;
- bool free_pkey = 0;
int err = -1;
ZEND_PARSE_PARAMETERS_START(2, 2)
RETURN_LONG(err);
}
- key = php_openssl_pkey_from_zval(zkey, 1, NULL, 0, &free_pkey);
- if (key == NULL) {
- X509_free(cert);
- RETURN_LONG(err);
- }
-
- err = X509_verify(cert, key);
-
- if (err < 0) {
- php_openssl_store_errors();
- }
+ key = php_openssl_pkey_from_zval(zkey, 1, NULL, 0);
+ if (key != NULL) {
+ err = X509_verify(cert, key);
+ if (err < 0) {
+ php_openssl_store_errors();
+ }
- if (free_pkey && key) {
EVP_PKEY_free(key);
}
+
if (cert_str) {
X509_free(cert);
}
size_t pass_len;
zval *zpkey = NULL, *args = NULL;
EVP_PKEY *priv_key = NULL;
- bool free_pkey;
zval * item;
STACK_OF(X509) *ca = NULL;
return;
}
- priv_key = php_openssl_pkey_from_zval(zpkey, 0, "", 0, &free_pkey);
+ priv_key = php_openssl_pkey_from_zval(zpkey, 0, "", 0);
if (priv_key == NULL) {
if (!EG(exception)) {
php_error_docref(NULL, E_WARNING, "Cannot get private key from parameter 3");
cleanup:
- if (free_pkey && priv_key) {
+ if (priv_key) {
EVP_PKEY_free(priv_key);
}
PKCS12 * p12 = NULL;
zval *zout = NULL, *zpkey, *args = NULL;
EVP_PKEY *priv_key = NULL;
- bool free_pkey;
char * pass;
size_t pass_len;
char * friendly_name = NULL;
return;
}
- priv_key = php_openssl_pkey_from_zval(zpkey, 0, "", 0, &free_pkey);
+ priv_key = php_openssl_pkey_from_zval(zpkey, 0, "", 0);
if (priv_key == NULL) {
if (!EG(exception)) {
php_error_docref(NULL, E_WARNING, "Cannot get private key from parameter 3");
cleanup:
- if (free_pkey && priv_key) {
+ if (priv_key) {
EVP_PKEY_free(priv_key);
}
if (cert_str) {
zend_long serial = Z_L(0);
X509 *cert = NULL, *new_cert = NULL;
EVP_PKEY * key = NULL, *priv_key = NULL;
- bool free_pkey = 0;
int i;
struct php_x509_request req;
}
}
- priv_key = php_openssl_pkey_from_zval(zpkey, 0, "", 0, &free_pkey);
+ priv_key = php_openssl_pkey_from_zval(zpkey, 0, "", 0);
if (priv_key == NULL) {
if (!EG(exception)) {
php_error_docref(NULL, E_WARNING, "Cannot get private key from parameter 3");
PHP_SSL_REQ_DISPOSE(&req);
- if (free_pkey && priv_key) {
+ if (priv_key) {
EVP_PKEY_free(priv_key);
}
if (key) {
zval *args = NULL, *dn, *attribs = NULL;
zval *out_pkey;
X509_REQ *csr = NULL;
- int we_made_the_key = 1;
- bool free_pkey;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "az|a!a!", &dn, &out_pkey, &args, &attribs) == FAILURE) {
RETURN_THROWS();
PHP_SSL_REQ_INIT(&req);
if (PHP_SSL_REQ_PARSE(&req, args) == SUCCESS) {
+ int we_made_the_key = 0;
zval *out_pkey_val = out_pkey;
ZVAL_DEREF(out_pkey_val);
/* Generate or use a private key */
if (Z_TYPE_P(out_pkey_val) != IS_NULL) {
- req.priv_key = php_openssl_pkey_from_zval(out_pkey_val, 0, NULL, 0, &free_pkey);
- if (req.priv_key != NULL) {
- we_made_the_key = 0;
- }
+ req.priv_key = php_openssl_pkey_from_zval(out_pkey_val, 0, NULL, 0);
}
if (req.priv_key == NULL) {
php_openssl_generate_private_key(&req);
+ we_made_the_key = 1;
}
if (req.priv_key == NULL) {
php_error_docref(NULL, E_WARNING, "Unable to generate a private key");
ZEND_TRY_ASSIGN_REF_TMP(out_pkey, &zkey_object);
req.priv_key = NULL; /* make sure the cleanup code doesn't zap it! */
- } else if (!free_pkey) {
- req.priv_key = NULL; /* make sure the cleanup code doesn't zap it! */
}
}
}
- else {
- if (!we_made_the_key) {
- /* if we have not made the key we are not supposed to zap it by calling dispose! */
- req.priv_key = NULL;
- }
- }
} else {
php_openssl_store_errors();
}
}
/* }}} */
-static EVP_PKEY *php_openssl_pkey_from_zval(zval *val, int public_key, char *passphrase, size_t passphrase_len, bool *free_pkey)
+static EVP_PKEY *php_openssl_pkey_from_zval(zval *val, int public_key, char *passphrase, size_t passphrase_len)
{
EVP_PKEY *key = NULL;
X509 *cert = NULL;
} \
return NULL;
- if (free_pkey) {
- *free_pkey = 1;
- }
-
if (Z_TYPE_P(val) == IS_ARRAY) {
zval * zphrase;
if (Z_TYPE(tmp) == IS_STRING) {
zval_ptr_dtor_str(&tmp);
}
- /* got the key - return it */
- if (free_pkey) {
- *free_pkey = 0;
- }
+
+ EVP_PKEY_up_ref(key);
return key;
}
} else if (Z_TYPE_P(val) == IS_OBJECT && Z_OBJCE_P(val) == php_openssl_certificate_ce) {
size_t passphrase_len = 0;
char * filename = NULL;
size_t filename_len = 0;
- bool free_pkey = 0;
int pem_write = 0;
EVP_PKEY * key;
BIO * bio_out = NULL;
PHP_OPENSSL_CHECK_SIZE_T_TO_INT(passphrase_len, passphrase);
- key = php_openssl_pkey_from_zval(zpkey, 0, passphrase, passphrase_len, &free_pkey);
+ key = php_openssl_pkey_from_zval(zpkey, 0, passphrase, passphrase_len);
if (key == NULL) {
if (!EG(exception)) {
php_error_docref(NULL, E_WARNING, "Cannot get key from parameter 1");
clean_exit:
PHP_SSL_REQ_DISPOSE(&req);
- if (free_pkey && key) {
+ if (key) {
EVP_PKEY_free(key);
}
if (bio_out) {
zval * zpkey, * args = NULL, *out;
char * passphrase = NULL; size_t passphrase_len = 0;
int pem_write = 0;
- bool free_pkey = 0;
EVP_PKEY * key;
BIO * bio_out = NULL;
const EVP_CIPHER * cipher;
PHP_OPENSSL_CHECK_SIZE_T_TO_INT(passphrase_len, passphrase);
- key = php_openssl_pkey_from_zval(zpkey, 0, passphrase, passphrase_len, &free_pkey);
+ key = php_openssl_pkey_from_zval(zpkey, 0, passphrase, passphrase_len);
if (key == NULL) {
if (!EG(exception)) {
php_error_docref(NULL, E_WARNING, "Cannot get key from parameter 1");
}
PHP_SSL_REQ_DISPOSE(&req);
- if (free_pkey && key) {
+ if (key) {
EVP_PKEY_free(key);
}
if (bio_out) {
zval *cert;
EVP_PKEY *pkey;
php_openssl_pkey_object *key_object;
- bool free_pkey;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "z", &cert) == FAILURE) {
RETURN_THROWS();
}
- pkey = php_openssl_pkey_from_zval(cert, 1, NULL, 0, &free_pkey);
+ pkey = php_openssl_pkey_from_zval(cert, 1, NULL, 0);
if (pkey == NULL) {
RETURN_FALSE;
}
object_init_ex(return_value, php_openssl_pkey_ce);
key_object = Z_OPENSSL_PKEY_P(return_value);
key_object->pkey = pkey;
- if (!free_pkey) {
- EVP_PKEY_up_ref(pkey);
- }
}
/* }}} */
PHP_OPENSSL_CHECK_SIZE_T_TO_INT(passphrase_len, passphrase);
- pkey = php_openssl_pkey_from_zval(cert, 0, passphrase, passphrase_len, NULL);
+ pkey = php_openssl_pkey_from_zval(cert, 0, passphrase, passphrase_len);
if (pkey == NULL) {
RETURN_FALSE;
}
{
zval *priv_key;
zval *peer_pub_key;
- EVP_PKEY *pkey;
- EVP_PKEY *peer_key;
+ EVP_PKEY *pkey = NULL;
+ EVP_PKEY *peer_key = NULL;
+ EVP_PKEY_CTX *ctx = NULL;
size_t key_size;
zend_long key_len = 0;
zend_string *result;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "zz|l", &peer_pub_key, &priv_key, &key_len) == FAILURE) {
RETURN_THROWS();
}
+
+ RETVAL_FALSE;
if (key_len < 0) {
php_error_docref(NULL, E_WARNING, "keylen < 0, assuming NULL");
}
+
key_size = key_len;
- if ((pkey = php_openssl_pkey_from_zval(priv_key, 0, "", 0, NULL)) == NULL
- || (peer_key = php_openssl_pkey_from_zval(peer_pub_key, 1, NULL, 0, NULL)) == NULL) {
- RETURN_FALSE;
+ pkey = php_openssl_pkey_from_zval(priv_key, 0, "", 0);
+ if (!pkey) {
+ goto cleanup;
}
- EVP_PKEY_CTX *ctx = EVP_PKEY_CTX_new(pkey, NULL);
+
+ peer_key = php_openssl_pkey_from_zval(peer_pub_key, 1, NULL, 0);
+ if (!peer_key) {
+ goto cleanup;
+ }
+
+ ctx = EVP_PKEY_CTX_new(pkey, NULL);
if (!ctx) {
- RETURN_FALSE;
+ goto cleanup;
}
+
if (EVP_PKEY_derive_init(ctx) > 0
&& EVP_PKEY_derive_set_peer(ctx, peer_key) > 0
&& (key_size > 0 || EVP_PKEY_derive(ctx, NULL, &key_size) > 0)
zend_string_release_ex(result, 0);
RETVAL_FALSE;
}
- } else {
- RETVAL_FALSE;
}
- EVP_PKEY_CTX_free(ctx);
+
+cleanup:
+ if (pkey) {
+ EVP_PKEY_free(pkey);
+ }
+ if (peer_key) {
+ EVP_PKEY_free(peer_key);
+ }
+ if (ctx) {
+ EVP_PKEY_CTX_free(ctx);
+ }
}
/* }}} */
PKCS7 * p7 = NULL;
BIO * infile = NULL, * outfile = NULL;
STACK_OF(X509) *others = NULL;
- bool free_pkey = 0;
zend_string * strindex;
char * infilename;
size_t infilename_len;
}
}
- privkey = php_openssl_pkey_from_zval(zprivkey, 0, "", 0, &free_pkey);
+ privkey = php_openssl_pkey_from_zval(zprivkey, 0, "", 0);
if (privkey == NULL) {
if (!EG(exception)) {
php_error_docref(NULL, E_WARNING, "Error getting private key");
if (others) {
sk_X509_pop_free(others, X509_free);
}
- if (privkey && free_pkey) {
+ if (privkey) {
EVP_PKEY_free(privkey);
}
if (cert && cert_str) {
zval *recipcert, *recipkey = NULL;
bool free_recipcert;
EVP_PKEY * key = NULL;
- bool free_pkey;
BIO * in = NULL, *out = NULL, *datain = NULL;
PKCS7 * p7 = NULL;
char * infilename;
goto clean_exit;
}
- key = php_openssl_pkey_from_zval(recipkey ? recipkey : recipcert, 0, "", 0, &free_pkey);
+ key = php_openssl_pkey_from_zval(recipkey ? recipkey : recipcert, 0, "", 0);
if (key == NULL) {
if (!EG(exception)) {
php_error_docref(NULL, E_WARNING, "Unable to get private key");
if (cert && free_recipcert) {
X509_free(cert);
}
- if (key && free_pkey) {
+ if (key) {
EVP_PKEY_free(key);
}
}
CMS_ContentInfo * cms = NULL;
BIO * infile = NULL, * outfile = NULL;
STACK_OF(X509) *others = NULL;
- bool free_pkey = 0;
zend_string * strindex;
char * infilename;
size_t infilename_len;
}
}
- privkey = php_openssl_pkey_from_zval(zprivkey, 0, "", 0, &free_pkey);
+ privkey = php_openssl_pkey_from_zval(zprivkey, 0, "", 0);
if (privkey == NULL) {
if (!EG(exception)) {
php_error_docref(NULL, E_WARNING, "Error getting private key");
zval *recipcert, *recipkey = NULL;
bool free_recipcert;
EVP_PKEY * key = NULL;
- bool free_pkey;
zend_long encoding = ENCODING_SMIME;
BIO * in = NULL, * out = NULL, * datain = NULL;
CMS_ContentInfo * cms = NULL;
goto clean_exit;
}
- key = php_openssl_pkey_from_zval(recipkey ? recipkey : recipcert, 0, "", 0, &free_pkey);
+ key = php_openssl_pkey_from_zval(recipkey ? recipkey : recipcert, 0, "", 0);
if (key == NULL) {
if (!EG(exception)) {
php_error_docref(NULL, E_WARNING, "Unable to get private key");
if (cert && free_recipcert) {
X509_free(cert);
}
- if (key && free_pkey) {
+ if (key) {
EVP_PKEY_free(key);
}
}
int cryptedlen;
zend_string *cryptedbuf = NULL;
int successful = 0;
- bool free_pkey = 0;
char * data;
size_t data_len;
zend_long padding = RSA_PKCS1_PADDING;
}
RETVAL_FALSE;
- pkey = php_openssl_pkey_from_zval(key, 0, "", 0, &free_pkey);
+ pkey = php_openssl_pkey_from_zval(key, 0, "", 0);
if (pkey == NULL) {
if (!EG(exception)) {
if (cryptedbuf) {
zend_string_release_ex(cryptedbuf, 0);
}
- if (free_pkey) {
- EVP_PKEY_free(pkey);
- }
+ EVP_PKEY_free(pkey);
}
/* }}} */
unsigned char *crypttemp;
int successful = 0;
zend_long padding = RSA_PKCS1_PADDING;
- bool free_pkey = 0;
char * data;
size_t data_len;
}
RETVAL_FALSE;
- pkey = php_openssl_pkey_from_zval(key, 0, "", 0, &free_pkey);
+ pkey = php_openssl_pkey_from_zval(key, 0, "", 0);
if (pkey == NULL) {
if (!EG(exception)) {
php_error_docref(NULL, E_WARNING, "key parameter is not a valid private key");
php_openssl_store_errors();
}
- if (free_pkey) {
- EVP_PKEY_free(pkey);
- }
+ EVP_PKEY_free(pkey);
if (cryptedbuf) {
zend_string_release_ex(cryptedbuf, 0);
}
int cryptedlen;
zend_string *cryptedbuf;
int successful = 0;
- bool free_pkey = 0;
zend_long padding = RSA_PKCS1_PADDING;
char * data;
size_t data_len;
}
RETVAL_FALSE;
- pkey = php_openssl_pkey_from_zval(key, 1, NULL, 0, &free_pkey);
+ pkey = php_openssl_pkey_from_zval(key, 1, NULL, 0);
if (pkey == NULL) {
if (!EG(exception)) {
php_error_docref(NULL, E_WARNING, "key parameter is not a valid public key");
} else {
php_openssl_store_errors();
}
- if (free_pkey) {
- EVP_PKEY_free(pkey);
- }
+ EVP_PKEY_free(pkey);
if (cryptedbuf) {
zend_string_release_ex(cryptedbuf, 0);
}
zend_string *cryptedbuf = NULL;
unsigned char *crypttemp;
int successful = 0;
- bool free_pkey = 0;
zend_long padding = RSA_PKCS1_PADDING;
char * data;
size_t data_len;
}
RETVAL_FALSE;
- pkey = php_openssl_pkey_from_zval(key, 1, NULL, 0, &free_pkey);
+ pkey = php_openssl_pkey_from_zval(key, 1, NULL, 0);
if (pkey == NULL) {
if (!EG(exception)) {
php_error_docref(NULL, E_WARNING, "key parameter is not a valid public key");
if (cryptedbuf) {
zend_string_release_ex(cryptedbuf, 0);
}
- if (free_pkey) {
- EVP_PKEY_free(pkey);
- }
+ EVP_PKEY_free(pkey);
}
/* }}} */
EVP_PKEY *pkey;
unsigned int siglen;
zend_string *sigbuf;
- bool free_pkey = 0;
char * data;
size_t data_len;
EVP_MD_CTX *md_ctx;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "szz|z", &data, &data_len, &signature, &key, &method) == FAILURE) {
RETURN_THROWS();
}
- pkey = php_openssl_pkey_from_zval(key, 0, "", 0, &free_pkey);
+ pkey = php_openssl_pkey_from_zval(key, 0, "", 0);
if (pkey == NULL) {
if (!EG(exception)) {
php_error_docref(NULL, E_WARNING, "Supplied key param cannot be coerced into a private key");
RETVAL_FALSE;
}
EVP_MD_CTX_destroy(md_ctx);
- if (free_pkey) {
- EVP_PKEY_free(pkey);
- }
+ EVP_PKEY_free(pkey);
}
/* }}} */
int err = 0;
EVP_MD_CTX *md_ctx;
const EVP_MD *mdtype;
- bool free_pkey = 0;
char * data;
size_t data_len;
char * signature;
RETURN_FALSE;
}
- pkey = php_openssl_pkey_from_zval(key, 1, NULL, 0, &free_pkey);
+ pkey = php_openssl_pkey_from_zval(key, 1, NULL, 0);
if (pkey == NULL) {
if (!EG(exception)) {
php_error_docref(NULL, E_WARNING, "Supplied key param cannot be coerced into a public key");
php_openssl_store_errors();
}
EVP_MD_CTX_destroy(md_ctx);
-
- if (free_pkey) {
- EVP_PKEY_free(pkey);
- }
+ EVP_PKEY_free(pkey);
RETURN_LONG(err);
}
/* }}} */
zval *pubkeys, *pubkey, *sealdata, *ekeys, *iv = NULL;
HashTable *pubkeysht;
EVP_PKEY **pkeys;
- bool *free_pkeys; /* so we know what to cleanup */
int i, len1, len2, *eksl, nkeys, iv_len;
unsigned char iv_buf[EVP_MAX_IV_LENGTH + 1], *buf = NULL, **eks;
char * data;
eksl = safe_emalloc(nkeys, sizeof(*eksl), 0);
eks = safe_emalloc(nkeys, sizeof(*eks), 0);
memset(eks, 0, sizeof(*eks) * nkeys);
- free_pkeys = safe_emalloc(nkeys, sizeof(int *), 0);
- memset(free_pkeys, 0, sizeof(int *) * nkeys);
memset(pkeys, 0, sizeof(*pkeys) * nkeys);
/* get the public keys we are using to seal this data */
i = 0;
ZEND_HASH_FOREACH_VAL(pubkeysht, pubkey) {
- pkeys[i] = php_openssl_pkey_from_zval(pubkey, 1, NULL, 0, &free_pkeys[i]);
+ pkeys[i] = php_openssl_pkey_from_zval(pubkey, 1, NULL, 0);
if (pkeys[i] == NULL) {
if (!EG(exception)) {
php_error_docref(NULL, E_WARNING, "Not a public key (%dth member of pubkeys)", i+1);
clean_exit:
for (i=0; i<nkeys; i++) {
- if (free_pkeys[i] && pkeys[i] != NULL) {
+ if (pkeys[i] != NULL) {
EVP_PKEY_free(pkeys[i]);
}
if (eks[i]) {
efree(eks);
efree(eksl);
efree(pkeys);
- efree(free_pkeys);
}
/* }}} */
EVP_PKEY *pkey;
int len1, len2, cipher_iv_len;
unsigned char *buf, *iv_buf;
- bool free_pkey = 0;
EVP_CIPHER_CTX *ctx;
char * data;
size_t data_len;
RETURN_THROWS();
}
- pkey = php_openssl_pkey_from_zval(privkey, 0, "", 0, &free_pkey);
+ pkey = php_openssl_pkey_from_zval(privkey, 0, "", 0);
if (pkey == NULL) {
if (!EG(exception)) {
php_error_docref(NULL, E_WARNING, "Unable to coerce parameter 4 into a private key");
}
efree(buf);
- if (free_pkey) {
- EVP_PKEY_free(pkey);
- }
+ EVP_PKEY_free(pkey);
EVP_CIPHER_CTX_free(ctx);
}
/* }}} */