Added:
New functions for certificate signed requests:
openssl_csr_file_verify
openssl_csr_verify
openssl_csr_parse
openssl_csr_get_public
Changed:
openssl_pkcs7_verify to accept DER and PEM formats.
--
Regards,
Arkadiusz Góralski: [EMAIL PROTECTED]
diff -Nu --recursive php-4.2.2/ext/openssl/openssl.c php-4.2.2-new/ext/openssl/openssl.c
--- php-4.2.2/ext/openssl/openssl.c Wed May 1 10:22:56 2002
+++ php-4.2.2-new/ext/openssl/openssl.c Tue Jul 23 08:44:38 2002
@@ -15,6 +15,8 @@
| Authors: Stig Venaas <[EMAIL PROTECTED]> |
| Wez Furlong <[EMAIL PROTECTED]> |
| Sascha Kettler <[EMAIL PROTECTED]> |
+ | Additional programming: |
+ | Norbert Mocek <[EMAIL PROTECTED]> |
+----------------------------------------------------------------------+
*/
@@ -39,12 +41,16 @@
#include <openssl/pem.h>
#include <openssl/err.h>
#include <openssl/conf.h>
-#include <openssl/e_os.h>
+#include <openssl/e_os2.h>
#include <openssl/rand.h>
#define DEFAULT_KEY_LENGTH 512
#define MIN_KEY_LENGTH 384
+#define FORMAT_UNDEF 0
+#define FORMAT_ASN1 1
+#define FORMAT_PEM 3
+#define FORMAT_SMIME 6
#define DEBUG_SMIME 0
@@ -89,6 +95,10 @@
PHP_FE(openssl_csr_export, arg2_force_ref)
PHP_FE(openssl_csr_export_to_file, NULL)
PHP_FE(openssl_csr_sign, NULL)
+ PHP_FE(openssl_csr_parse, NULL)
+ PHP_FE(openssl_csr_file_verify, NULL)
+ PHP_FE(openssl_csr_verify, NULL)
+ PHP_FE(openssl_csr_get_public, NULL)
PHP_FE(openssl_sign, arg2_force_ref)
@@ -109,6 +119,7 @@
PHP_FE(openssl_error_string, NULL)
{NULL, NULL, NULL}
+
};
/* }}} */
@@ -545,6 +556,9 @@
REGISTER_LONG_CONSTANT("PKCS7_NOCERTS", PKCS7_NOCERTS, CONST_CS|CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("PKCS7_NOATTR", PKCS7_NOATTR, CONST_CS|CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("PKCS7_BINARY", PKCS7_BINARY, CONST_CS|CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("FORMAT_PEM", FORMAT_PEM, CONST_CS|CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("FORMAT_SMIME", FORMAT_SMIME, CONST_CS|CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("FORMAT_DER", FORMAT_ASN1, CONST_CS|CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("PKCS7_NOSIGS", PKCS7_NOSIGS, CONST_CS|CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("OPENSSL_PKCS1_PADDING",
@@ -1579,6 +1593,247 @@
}
/* }}} */
+/* {{{ proto bool openssl_csr_file_verify(string filename, long inform)
+ verifies the signature on the request in file*/
+PHP_FUNCTION(openssl_csr_file_verify)
+{
+ int x509=0;
+ BIO *in=NULL,*out=NULL;
+ EVP_PKEY *pkey=NULL;
+ int i,newreq=0;
+ int kludge=0;
+ int informat,verify=1,keyform=FORMAT_PEM;
+ char *infile;
+ long infile_len;
+ X509_REQ *req=NULL;
+
+ RETVAL_LONG(-1);
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sl", &infile, &infile_len,
+ &informat) == FAILURE)
+ return;
+
+ in=BIO_new(BIO_s_file());
+ out=BIO_new(BIO_s_file());
+ if ((in == NULL) || (out == NULL))
+ goto end;
+
+ if (!newreq)
+ {
+ /* Since we are using a pre-existing certificate
+ * request, the kludge 'format' info should not be
+ * changed. */
+ kludge= -1;
+ if (infile == NULL)
+ BIO_set_fp(in,stdin,BIO_NOCLOSE);
+ else
+ {
+ if (BIO_read_filename(in,infile) <= 0)
+ {
+ perror(infile);
+ goto end;
+ }
+ }
+
+ if (informat == FORMAT_ASN1)
+ req=d2i_X509_REQ_bio(in,NULL);
+ else if (informat == FORMAT_PEM)
+ req=PEM_read_bio_X509_REQ(in,NULL,NULL,NULL);
+ else
+ {
+ zend_error(E_WARNING, "bad input format specified for X509 request\n");
+ RETVAL_LONG(-1);
+ goto end;
+ }
+ if (req == NULL)
+ {
+ zend_error(E_WARNING, "unable to load X509 request\n");
+ RETVAL_LONG(-1);
+ goto end;
+ }
+ }
+
+ if (verify && !x509)
+ {
+ int tmp=0;
+
+ if (pkey == NULL)
+ {
+ pkey=X509_REQ_get_pubkey(req);
+ tmp=1;
+ if (pkey == NULL) goto end;
+ }
+
+ i=X509_REQ_verify(req,pkey);
+ if (tmp) {
+ EVP_PKEY_free(pkey);
+ pkey=NULL;
+ }
+
+ if (i < 0)
+ {
+ goto end;
+ }
+ else if (i == 0)
+ {
+ zend_error(E_WARNING, "verify failure\n");
+ RETVAL_LONG(-1);
+ }
+ else /* if (i > 0) */
+ RETVAL_TRUE;
+ }
+
+end:
+ EVP_PKEY_free(pkey);
+ X509_REQ_free(req);
+}
+/* }}} */
+
+/* {{{ proto bool openssl_csr_verify(mixed csr)
+ verifies the signature on the request*/
+PHP_FUNCTION(openssl_csr_verify)
+{
+ int x509=0;
+ zval * zcsr;
+ BIO *in=NULL,*out=NULL;
+ EVP_PKEY *pkey=NULL;
+ int i,newreq=0;
+ int kludge=0;
+ int informat,verify=1,keyform=FORMAT_PEM;
+ char *infile;
+ long infile_len;
+ X509_REQ *req=NULL;
+ long csr_resource = -1;
+ char *bio_mem_ptr;
+ long bio_mem_len;
+
+ RETVAL_LONG(-1);
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &zcsr) == FAILURE)
+ return;
+
+ req = php_openssl_csr_from_zval(&zcsr, 0, &csr_resource TSRMLS_CC);
+ if (req == NULL) {
+ zend_error(E_WARNING, "cannot get CSR from parameter 1");
+ return;
+ }
+
+
+ if (verify && !x509)
+ {
+ int tmp=0;
+
+ if (pkey == NULL)
+ {
+ pkey=X509_REQ_get_pubkey(req);
+ tmp=1;
+ if (pkey == NULL) goto end;
+ }
+
+ i=X509_REQ_verify(req,pkey);
+ if (tmp) {
+ EVP_PKEY_free(pkey);
+ pkey=NULL;
+ }
+
+ if (i < 0)
+ {
+ goto end;
+ }
+ else if (i == 0)
+ {
+ zend_error(E_WARNING, "verify failure\n");
+ RETVAL_LONG(-1);
+ }
+ else /* if (i > 0) */
+ RETVAL_TRUE;
+ }
+
+end:
+ RETVAL_TRUE;
+
+}
+/* }}} */
+
+/* {{{ proto array openssl_csr_parse(mixed csr [, bool shortnames=true])
+ Returns an array of the fields/values of the csr */
+PHP_FUNCTION(openssl_csr_parse)
+{
+ zval * zreq;
+ X509_REQ *req=NULL;
+ long reqresource = -1;
+ zend_bool useshortnames = 1;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|b", &zreq, &useshortnames) == FAILURE)
+ return;
+
+ req = php_openssl_csr_from_zval(&zreq, 0, &reqresource TSRMLS_CC);
+ if (req == NULL)
+ RETURN_FALSE;
+
+ array_init(return_value);
+
+ add_assoc_long(return_value, "version", X509_REQ_get_version(req));
+ add_assoc_name_entry(return_value, "subject", X509_REQ_get_subject_name(req), useshortnames TSRMLS_CC);
+
+ if (reqresource == -1 && req)
+ X509_REQ_free(req);
+}
+/* }}} */
+
+/* {{{ proto bool openssl_csr_get_public(mixed csr, mixed publickey)
+ Gets public key from csr*/
+PHP_FUNCTION(openssl_csr_get_public)
+{
+ zval *zcsr, *zpublickey;
+ EVP_PKEY *pkey;
+ X509_REQ *req=NULL;
+ long csr_resource = -1;
+ unsigned char *publickeybuf = 0;
+ long publickeylen = -1;
+ char* publickey= 0;
+
+ RETVAL_LONG(-1);
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zz", &zcsr, &zpublickey) == FAILURE)
+ return;
+
+ req = php_openssl_csr_from_zval(&zcsr, 0, &csr_resource TSRMLS_CC);
+ if (req == NULL) {
+ zend_error(E_WARNING, "cannot get CSR from parameter 1");
+ return;
+ }
+
+ pkey=X509_REQ_get_pubkey(req);
+
+ if (pkey == NULL) {
+ zend_error(E_WARNING, "cannot get public key from csr");
+ RETURN_FALSE;
+ }
+
+ {
+ BIO * oid_bio = BIO_new(BIO_s_mem());
+ char *bio_mem_ptr;
+ long bio_mem_len;
+
+ PEM_write_bio_PUBKEY(oid_bio, pkey);
+
+ bio_mem_len = BIO_get_mem_data(oid_bio, &bio_mem_ptr);
+ zval_dtor(zpublickey);
+ ZVAL_STRINGL(zpublickey, bio_mem_ptr, bio_mem_len, 1);
+
+ if (oid_bio)
+ BIO_free(oid_bio);
+ }
+
+ if(pkey)
+ EVP_PKEY_free(pkey);
+
+ RETVAL_TRUE;
+}
+/* }}} */
+
+
/* }}} */
/* {{{ EVP Public/Private key functions */
@@ -1934,7 +2189,7 @@
/* {{{ PKCS7 S/MIME functions */
-/* {{{ proto bool openssl_pkcs7_verify(string filename, long flags [, string signerscerts [, array cainfo [, string extracerts]]])
+/* {{{ proto bool openssl_pkcs7_verify(string filename, long inform, long flags [, string content [, string signerscerts [, array cainfo [, string extracerts]]]])
Verifys that the data block is intact, the signer is who they say they are, and returns the CERTs of the signers */
PHP_FUNCTION(openssl_pkcs7_verify)
{
@@ -1948,11 +2203,14 @@
char * filename; long filename_len;
char * extracerts = NULL; long extracerts_len;
char * signersfilename = NULL; long signersfilename_len;
+ char *contfile=NULL; long contfile_len;
+ int informat = FORMAT_SMIME;
RETVAL_LONG(-1);
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sl|sas", &filename, &filename_len,
- &flags, &signersfilename, &signersfilename_len, &cainfo,
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sll|ssas", &filename, &filename_len,
+ &informat, &flags, &contfile, &contfile_len,
+ &signersfilename, &signersfilename_len, &cainfo,
&extracerts, &extracerts_len) == FAILURE)
return;
@@ -1972,7 +2230,19 @@
in = BIO_new_file(filename, (flags & PKCS7_BINARY) ? "rb" : "r");
if (in == NULL)
goto clean_exit;
- p7 = SMIME_read_PKCS7(in, &datain);
+
+ if(informat == FORMAT_SMIME)
+ p7 = SMIME_read_PKCS7(in, &datain);
+ else if(informat == FORMAT_PEM)
+ p7 = PEM_read_bio_PKCS7(in, NULL, NULL, NULL);
+ else if(informat == FORMAT_ASN1)
+ p7 = d2i_PKCS7_bio(in, NULL);
+ else {
+ zend_error(E_WARNING, "Bad input format for PKCS#7 file\n");
+ RETVAL_LONG(-1);
+ goto clean_exit;
+ }
+
if (p7 == NULL) {
#if DEBUG_SMIME
zend_printf("SMIME_read_PKCS7 failed\n");
@@ -1983,7 +2253,16 @@
zend_printf("Calling PKCS7 verify\n");
#endif
- if (PKCS7_verify(p7, others, store, datain, NULL, flags)) {
+ if(contfile_len > 0 && contfile) {
+ BIO_free(datain);
+ if(!(datain = BIO_new_file(contfile, "rb"))) {
+ zend_error(E_WARNING, "Can't read content file %s\n", contfile);
+ RETVAL_LONG(-1);
+ goto clean_exit;
+ }
+ }
+
+ if (PKCS7_verify(p7, others, store, datain, NULL, flags)) {
RETVAL_TRUE;
@@ -2414,7 +2693,7 @@
zval_dtor(crypted);
cryptedbuf[cryptedlen] = '\0';
ZVAL_STRINGL(crypted, cryptedbuf, cryptedlen, 0);
- cryptedbuf = NULL;
+ //cryptedbuf = NULL;
RETVAL_TRUE;
}
@@ -2438,7 +2717,7 @@
long padding = RSA_PKCS1_PADDING;
char * data;
long data_len;
-
+
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "szz|l", &data, &data_len, &crypted, &key, &padding) == FAILURE)
return;
@@ -2831,6 +3110,8 @@
}
/* }}} */
+
+
/*
* Local variables:
* tab-width: 8
diff -Nu --recursive php-4.2.2/ext/openssl/php_openssl.h php-4.2.2-new/ext/openssl/php_openssl.h
--- php-4.2.2/ext/openssl/php_openssl.h Tue Dec 11 16:30:02 2001
+++ php-4.2.2-new/ext/openssl/php_openssl.h Tue Jul 23 08:29:03 2002
@@ -14,6 +14,8 @@
+----------------------------------------------------------------------+
| Authors: Stig Venaas <[EMAIL PROTECTED]> |
| Wez Furlong <[EMAIL PROTECTED] |
+ | Additional programming: |
+ | Norbert Mocek <[EMAIL PROTECTED]> |
+----------------------------------------------------------------------+
*/
@@ -64,6 +66,10 @@
PHP_FUNCTION(openssl_csr_export);
PHP_FUNCTION(openssl_csr_export_to_file);
PHP_FUNCTION(openssl_csr_sign);
+PHP_FUNCTION(openssl_csr_file_verify);
+PHP_FUNCTION(openssl_csr_verify);
+PHP_FUNCTION(openssl_csr_parse);
+PHP_FUNCTION(openssl_csr_get_public);
#else
--
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, visit: http://www.php.net/unsub.php