dmitry          Wed Jul 11 12:10:28 2007 UTC

  Modified files:              
    /php-src/ext/openssl        openssl.c 
    /php-src/ext/openssl/tests  005.phpt bug28382.phpt 
  Log:
  Unicode support
  improved openssl_x509_parse() extensions support
  
  
http://cvs.php.net/viewvc.cgi/php-src/ext/openssl/openssl.c?r1=1.144&r2=1.145&diff_format=u
Index: php-src/ext/openssl/openssl.c
diff -u php-src/ext/openssl/openssl.c:1.144 php-src/ext/openssl/openssl.c:1.145
--- php-src/ext/openssl/openssl.c:1.144 Wed Jul 11 07:35:53 2007
+++ php-src/ext/openssl/openssl.c       Wed Jul 11 12:10:28 2007
@@ -20,7 +20,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: openssl.c,v 1.144 2007/07/11 07:35:53 dmitry Exp $ */
+/* $Id: openssl.c,v 1.145 2007/07/11 12:10:28 dmitry Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -283,11 +283,11 @@
                                str = X509_NAME_ENTRY_get_data(ne);
                                if (ASN1_STRING_type(str) != V_ASN1_UTF8STRING) 
{
                                        to_add_len = 
ASN1_STRING_to_UTF8(&to_add, str);
-                                       add_next_index_stringl(subentries, 
(char *)to_add, to_add_len, 1);
+                                       add_next_index_utf8_stringl(subentries, 
(char *)to_add, to_add_len, 1);
                                } else {
                                        to_add = ASN1_STRING_data(str);
                                        to_add_len = ASN1_STRING_length(str);
-                                       add_next_index_stringl(subentries, 
(char *)to_add, to_add_len, 1);
+                                       add_next_index_utf8_stringl(subentries, 
(char *)to_add, to_add_len, 1);
                                }
                        }
                        last = j;
@@ -295,24 +295,36 @@
                i = last;
                
                if (obj_cnt > 1) {
-                       add_assoc_zval_ex(subitem, sname, strlen(sname) + 1, 
subentries);
+                       add_ascii_assoc_zval_ex(subitem, sname, strlen(sname) + 
1, subentries);
                } else {
                        zval_dtor(subentries);
                        FREE_ZVAL(subentries);
                        if (obj_cnt && str) {
-                               add_assoc_stringl(subitem, sname, (char 
*)to_add, to_add_len, 1);
+                               add_ascii_assoc_utf8_stringl(subitem, sname, 
(char *)to_add, to_add_len, 1);
                        }
                }
        }
        if (key != NULL) {
-               zend_hash_update(HASH_OF(val), key, strlen(key) + 1, (void 
*)&subitem, sizeof(subitem), NULL);
+               add_ascii_assoc_zval_ex(val, key, strlen(key) + 1, subitem);
        }
 }
 /* }}} */
 
 static void add_assoc_asn1_string(zval * val, char * key, ASN1_STRING * str) 
/* {{{ */
 {
-       add_assoc_stringl(val, key, (char *)str->data, str->length, 1);
+       unsigned char *data;
+       int data_len;
+       TSRMLS_FETCH();
+
+       if (ASN1_STRING_type(str) != V_ASN1_UTF8STRING) {
+               data = ASN1_STRING_data(str);
+               data_len = ASN1_STRING_length(str);
+               add_ascii_assoc_stringl(val, key, (char*)data, data_len, 1);
+       } else {
+               data = ASN1_STRING_data(str);
+               data_len = ASN1_STRING_length(str);
+               add_ascii_assoc_utf8_stringl(val, key, (char*)data, data_len, 
1);
+       }
 }
 /* }}} */
 
@@ -443,13 +455,15 @@
                        req->config_filename, req->var, req->req_config 
TSRMLS_CC) == FAILURE) return FAILURE
 
 #define SET_OPTIONAL_STRING_ARG(key, varname, defval)  \
-       if (optional_args && zend_hash_find(Z_ARRVAL_P(optional_args), key, 
sizeof(key), (void**)&item) == SUCCESS) \
+       if (optional_args && zend_ascii_hash_find(Z_ARRVAL_P(optional_args), 
key, sizeof(key), (void**)&item) == SUCCESS) { \
+               convert_to_string_ex(item); \
                varname = Z_STRVAL_PP(item); \
-       else \
-               varname = defval
+       } else \
+               varname = defval;
+
 
 #define SET_OPTIONAL_LONG_ARG(key, varname, defval)    \
-       if (optional_args && zend_hash_find(Z_ARRVAL_P(optional_args), key, 
sizeof(key), (void**)&item) == SUCCESS) \
+       if (optional_args && zend_ascii_hash_find(Z_ARRVAL_P(optional_args), 
key, sizeof(key), (void**)&item) == SUCCESS) \
                varname = Z_LVAL_PP(item); \
        else \
                varname = defval
@@ -985,8 +999,11 @@
        char * tmpstr;
        zval * subitem;
        X509_EXTENSION *extension;
-       ASN1_OCTET_STRING *extdata;
        char *extname;
+       BIO  *bio_out;
+       BUF_MEM *bio_buf;
+       char buf[256];
+
 
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z|b", &zcert, 
&useshortnames) == FAILURE) {
                return;
@@ -998,37 +1015,37 @@
        array_init(return_value);
 
        if (cert->name) {
-               add_assoc_string(return_value, "name", cert->name, 1);
+               add_ascii_assoc_string(return_value, "name", cert->name, 1);
        }
-/*     add_assoc_bool(return_value, "valid", cert->valid); */
+/*     add_ascii_assoc_bool(return_value, "valid", cert->valid); */
 
        add_assoc_name_entry(return_value, "subject",           
X509_get_subject_name(cert), useshortnames TSRMLS_CC);
        /* hash as used in CA directories to lookup cert by subject name */
        {
                char buf[32];
                snprintf(buf, sizeof(buf), "%08lx", 
X509_subject_name_hash(cert));
-               add_assoc_string(return_value, "hash", buf, 1);
+               add_ascii_assoc_string(return_value, "hash", buf, 1);
        }
        
        add_assoc_name_entry(return_value, "issuer",            
X509_get_issuer_name(cert), useshortnames TSRMLS_CC);
-       add_assoc_long(return_value, "version",                         
X509_get_version(cert));
+       add_ascii_assoc_long(return_value, "version",                   
X509_get_version(cert));
 
-       add_assoc_string(return_value, "serialNumber", i2s_ASN1_INTEGER(NULL, 
X509_get_serialNumber(cert)), 1);
+       add_ascii_assoc_string(return_value, "serialNumber", 
i2s_ASN1_INTEGER(NULL, X509_get_serialNumber(cert)), 1);
 
        add_assoc_asn1_string(return_value, "validFrom",        
X509_get_notBefore(cert));
        add_assoc_asn1_string(return_value, "validTo",          
X509_get_notAfter(cert));
 
-       add_assoc_long(return_value, "validFrom_time_t",        
asn1_time_to_time_t(X509_get_notBefore(cert) TSRMLS_CC));
-       add_assoc_long(return_value, "validTo_time_t",          
asn1_time_to_time_t(X509_get_notAfter(cert) TSRMLS_CC));
+       add_ascii_assoc_long(return_value, "validFrom_time_t",  
asn1_time_to_time_t(X509_get_notBefore(cert) TSRMLS_CC));
+       add_ascii_assoc_long(return_value, "validTo_time_t",            
asn1_time_to_time_t(X509_get_notAfter(cert) TSRMLS_CC));
 
        tmpstr = (char *)X509_alias_get0(cert, NULL);
        if (tmpstr) {
-               add_assoc_string(return_value, "alias", tmpstr, 1);
+               add_ascii_assoc_string(return_value, "alias", tmpstr, 1);
        }
 /*
-       add_assoc_long(return_value, "signaturetypeLONG", 
X509_get_signature_type(cert));
-       add_assoc_string(return_value, "signaturetype", 
OBJ_nid2sn(X509_get_signature_type(cert)), 1);
-       add_assoc_string(return_value, "signaturetypeLN", 
OBJ_nid2ln(X509_get_signature_type(cert)), 1);
+       add_ascii_assoc_long(return_value, "signaturetypeLONG", 
X509_get_signature_type(cert));
+       add_ascii_assoc_string(return_value, "signaturetype", 
OBJ_nid2sn(X509_get_signature_type(cert)), 1);
+       add_ascii_assoc_string(return_value, "signaturetypeLN", 
OBJ_nid2ln(X509_get_signature_type(cert)), 1);
 */
        MAKE_STD_ZVAL(subitem);
        array_init(subitem);
@@ -1060,19 +1077,29 @@
 
                add_index_zval(subitem, id, subsub);
        }
-       add_assoc_zval(return_value, "purposes", subitem);
+       add_ascii_assoc_zval(return_value, "purposes", subitem);
 
        MAKE_STD_ZVAL(subitem);
        array_init(subitem);
 
-
        for (i = 0; i < X509_get_ext_count(cert); i++) {
                extension = X509_get_ext(cert, i);
-               extdata = X509_EXTENSION_get_data(extension);
-               extname = (char 
*)OBJ_nid2sn(OBJ_obj2nid(X509_EXTENSION_get_object(extension)));
-               add_assoc_asn1_string(subitem, extname, extdata);
+               if (OBJ_obj2nid(X509_EXTENSION_get_object(extension)) != 
NID_undef) {
+                       extname = (char 
*)OBJ_nid2sn(OBJ_obj2nid(X509_EXTENSION_get_object(extension)));
+               } else {
+                       OBJ_obj2txt(buf, sizeof(buf)-1, 
X509_EXTENSION_get_object(extension), 1);
+                       extname = buf;
+               }
+               bio_out = BIO_new(BIO_s_mem());
+               if (X509V3_EXT_print(bio_out, extension, 0, 0)) {
+                       BIO_get_mem_ptr(bio_out, &bio_buf);
+                       add_ascii_assoc_utf8_stringl(subitem, extname, 
bio_buf->data, bio_buf->length, 1);
+               } else {
+                       add_assoc_asn1_string(subitem, extname, 
X509_EXTENSION_get_data(extension));
+               }
+               BIO_free(bio_out);
        }
-       add_assoc_zval(return_value, "extensions", subitem);
+       add_ascii_assoc_zval(return_value, "extensions", subitem);
 
        if (certresource == -1 && cert) {
                X509_free(cert);
@@ -1583,7 +1610,7 @@
                                BIO_get_mem_ptr(bio_out, &bio_buf);
                                MAKE_STD_ZVAL(zcert);
                                ZVAL_STRINGL(zcert, bio_buf->data, 
bio_buf->length, 1);
-                               add_assoc_zval(zout, "cert", zcert);
+                               add_ascii_assoc_zval(zout, "cert", zcert);
                        }
                        BIO_free(bio_out);
 
@@ -1593,7 +1620,7 @@
                                BIO_get_mem_ptr(bio_out, &bio_buf);
                                MAKE_STD_ZVAL(zpkey);
                                ZVAL_STRINGL(zpkey, bio_buf->data, 
bio_buf->length, 1);
-                               add_assoc_zval(zout, "pkey", zpkey);
+                               add_ascii_assoc_zval(zout, "pkey", zpkey);
                        }
                        BIO_free(bio_out);
 
@@ -1620,7 +1647,7 @@
                        }
                        if(ca) {
                                sk_X509_free(ca);
-                               add_assoc_zval(zout, "extracerts", zextracerts);
+                               add_ascii_assoc_zval(zout, "extracerts", 
zextracerts);
                        } else {
                                zval_dtor(zextracerts);
                        }
@@ -1687,26 +1714,40 @@
                        zstr strindex = NULL_ZSTR;
                        uint strindexlen = 0;
                        ulong intindex;
+                       zend_uchar index_type;
+                       zval index;
                        
-                       zend_hash_get_current_key_ex(HASH_OF(dn), &strindex, 
&strindexlen, &intindex, 0, &hpos);
+                       index_type = zend_hash_get_current_key_ex(HASH_OF(dn), 
&strindex, &strindexlen, &intindex, 0, &hpos);
+                       if (index_type == IS_UNICODE) {
+                               ZVAL_UNICODEL(&index, strindex.u, 
strindexlen-1, 1);
+                               convert_to_string(&index);
+                       } else {
+                               ZVAL_STRINGL(&index, strindex.s, strindexlen-1, 
0);
+                       }
 
                        convert_to_string_ex(item);
 
-                       if (strindex.s) {
+                       if (Z_STRVAL(index)) {
                                int nid;
 
-                               nid = OBJ_txt2nid(strindex.s);
+                               nid = OBJ_txt2nid(Z_STRVAL(index));
                                if (nid != NID_undef) {
                                        if (!X509_NAME_add_entry_by_NID(subj, 
nid, MBSTRING_ASC, 
                                                                (unsigned 
char*)Z_STRVAL_PP(item), -1, -1, 0))
                                        {
                                                php_error_docref(NULL 
TSRMLS_CC, E_WARNING, "dn: add_entry_by_NID %d -> %s (failed)", nid, 
Z_STRVAL_PP(item));
+                                               if (index_type == IS_UNICODE) {
+                                                       zval_dtor(&index);
+                                               }
                                                return FAILURE;
                                        }
                                } else {
-                                       php_error_docref(NULL TSRMLS_CC, 
E_WARNING, "dn: %s is not a recognized name", strindex.s);
+                                       php_error_docref(NULL TSRMLS_CC, 
E_WARNING, "dn: %s is not a recognized name", Z_STRVAL(index));
                                }
                        }
+                       if (index_type == IS_UNICODE) {
+                               zval_dtor(&index);
+                       }
                        zend_hash_move_forward_ex(HASH_OF(dn), &hpos);
                }
 
@@ -1762,23 +1803,38 @@
                                zstr strindex;
                                uint strindexlen;
                                ulong intindex;
+                               zend_uchar index_type;
+                               zval index;
+
+                               index_type = 
zend_hash_get_current_key_ex(HASH_OF(attribs), &strindex, &strindexlen, 
&intindex, 0, &hpos);
+                               if (index_type == IS_UNICODE) {
+                                       ZVAL_UNICODEL(&index, strindex.u, 
strindexlen-1, 1);
+                                       convert_to_string(&index);
+                               } else {
+                                       ZVAL_STRINGL(&index, strindex.s, 
strindexlen-1, 0);
+                               }
 
-                               zend_hash_get_current_key_ex(HASH_OF(attribs), 
&strindex, &strindexlen, &intindex, 0, &hpos);
                                convert_to_string_ex(item);
 
-                               if (strindex.s) {
+                               if (Z_STRVAL(index)) {
                                        int nid;
 
-                                       nid = OBJ_txt2nid(strindex.s);
+                                       nid = OBJ_txt2nid(Z_STRVAL(index));
                                        if (nid != NID_undef) {
                                                if 
(!X509_NAME_add_entry_by_NID(subj, nid, MBSTRING_ASC, (unsigned 
char*)Z_STRVAL_PP(item), -1, -1, 0)) {
                                                        php_error_docref(NULL 
TSRMLS_CC, E_WARNING, "attribs: add_entry_by_NID %d -> %s (failed)", nid, 
Z_STRVAL_PP(item));
+                                                       if (index_type == 
IS_UNICODE) {
+                                                               
zval_dtor(&index);
+                                                       }
                                                        return FAILURE;
                                                }
                                        } else {
-                                               php_error_docref(NULL 
TSRMLS_CC, E_WARNING, "dn: %s is not a recognized name", strindex.s);
+                                               php_error_docref(NULL 
TSRMLS_CC, E_WARNING, "dn: %s is not a recognized name", Z_STRVAL(index));
                                        }
                                }
+                               if (index_type == IS_UNICODE) {
+                                       zval_dtor(&index);
+                               }
                                zend_hash_move_forward_ex(HASH_OF(attribs), 
&hpos);
                        }
                        for (i = 0; i < sk_CONF_VALUE_num(attr_sk); i++) {
@@ -2704,8 +2760,8 @@
        pbio_len = BIO_get_mem_data(out, &pbio);
 
        array_init(return_value);
-       add_assoc_long(return_value, "bits", EVP_PKEY_bits(pkey));
-       add_assoc_stringl(return_value, "key", pbio, pbio_len, 1);
+       add_ascii_assoc_long(return_value, "bits", EVP_PKEY_bits(pkey));
+       add_ascii_assoc_stringl(return_value, "key", pbio, pbio_len, 1);
        /*TODO: Use the real values once the openssl constants are used 
         * See the enum at the top of this file
         */
@@ -2732,7 +2788,7 @@
                        ktype = -1;
                        break;
        }
-       add_assoc_long(return_value, "type", ktype);
+       add_ascii_assoc_long(return_value, "type", ktype);
 
        BIO_free(out);
 }
http://cvs.php.net/viewvc.cgi/php-src/ext/openssl/tests/005.phpt?r1=1.3&r2=1.4&diff_format=u
Index: php-src/ext/openssl/tests/005.phpt
diff -u php-src/ext/openssl/tests/005.phpt:1.3 
php-src/ext/openssl/tests/005.phpt:1.4
--- php-src/ext/openssl/tests/005.phpt:1.3      Thu Apr  5 07:24:21 2007
+++ php-src/ext/openssl/tests/005.phpt  Wed Jul 11 12:10:28 2007
@@ -32,3 +32,20 @@
 }
 
 string(15) "*.triconnect.nl"
+--UEXPECTF--   
+array(6) {
+  [u"C"]=>
+  unicode(2) "NL"
+  [u"ST"]=>
+  unicode(13) "Noord Brabant"
+  [u"L"]=>
+  unicode(4) "Uden"
+  [u"O"]=>
+  unicode(10) "Triconnect"
+  [u"OU"]=>
+  unicode(10) "Triconnect"
+  [u"CN"]=>
+  unicode(15) "*.triconnect.nl"
+}
+
+unicode(15) "*.triconnect.nl"
http://cvs.php.net/viewvc.cgi/php-src/ext/openssl/tests/bug28382.phpt?r1=1.4&r2=1.5&diff_format=u
Index: php-src/ext/openssl/tests/bug28382.phpt
diff -u php-src/ext/openssl/tests/bug28382.phpt:1.4 
php-src/ext/openssl/tests/bug28382.phpt:1.5
--- php-src/ext/openssl/tests/bug28382.phpt:1.4 Wed May 30 15:40:17 2007
+++ php-src/ext/openssl/tests/bug28382.phpt     Wed Jul 11 12:10:28 2007
@@ -14,25 +14,56 @@
 --EXPECTF--
 array(11) {
   ["basicConstraints"]=>
-  string(2) "%s"
+  string(8) "CA:FALSE"
   ["nsComment"]=>
-  string(40) "%s"
+  string(38) "For Grid use only; request tag userTag"
   ["nsCertType"]=>
-  string(4) "%s"
+  string(30) "SSL Client, SSL Server, S/MIME"
   ["crlDistributionPoints"]=>
-  string(56) "%s"
+  string(51) "URI:http://mobile.blue-software.ro:90/ca/crl.shtml
+"
   ["nsCaPolicyUrl"]=>
-  string(40) "%s"
+  string(38) "http://mobile.blue-software.ro:90/pub/";
   ["subjectAltName"]=>
-  string(26) "%s"
+  string(28) "email:[EMAIL PROTECTED]"
   ["subjectKeyIdentifier"]=>
-  string(22) "%s"
+  string(59) "B0:A7:FF:F9:41:15:DE:23:39:BD:DD:31:0F:97:A0:B2:A2:74:E0:FC"
   ["authorityKeyIdentifier"]=>
-  string(159) "%s"
+  string(115) "DirName:/C=RO/ST=Romania/L=Craiova/O=Sergiu/OU=Sergiu 
SRL/CN=Sergiu CA/[EMAIL PROTECTED]
+serial:00
+"
   ["keyUsage"]=>
-  string(4) "%s"
+  string(71) "Digital Signature, Non Repudiation, Key Encipherment, Data 
Encipherment"
   ["nsBaseUrl"]=>
-  string(22) "%s"
-  ["UNDEF"]=>
+  string(20) "http://62.231.98.52/";
+  ["1.2.3.4"]=>
   string(4) "%s"
 }
+--UEXPECTF--
+array(11) {
+  [u"basicConstraints"]=>
+  unicode(8) "CA:FALSE"
+  [u"nsComment"]=>
+  unicode(38) "For Grid use only; request tag userTag"
+  [u"nsCertType"]=>
+  unicode(30) "SSL Client, SSL Server, S/MIME"
+  [u"crlDistributionPoints"]=>
+  unicode(51) "URI:http://mobile.blue-software.ro:90/ca/crl.shtml
+"
+  [u"nsCaPolicyUrl"]=>
+  unicode(38) "http://mobile.blue-software.ro:90/pub/";
+  [u"subjectAltName"]=>
+  unicode(28) "email:[EMAIL PROTECTED]"
+  [u"subjectKeyIdentifier"]=>
+  unicode(59) "B0:A7:FF:F9:41:15:DE:23:39:BD:DD:31:0F:97:A0:B2:A2:74:E0:FC"
+  [u"authorityKeyIdentifier"]=>
+  unicode(115) "DirName:/C=RO/ST=Romania/L=Craiova/O=Sergiu/OU=Sergiu 
SRL/CN=Sergiu CA/[EMAIL PROTECTED]
+serial:00
+"
+  [u"keyUsage"]=>
+  unicode(71) "Digital Signature, Non Repudiation, Key Encipherment, Data 
Encipherment"
+  [u"nsBaseUrl"]=>
+  unicode(20) "http://62.231.98.52/";
+  [u"1.2.3.4"]=>
+  string(4) "%s"
+}
\ No newline at end of file

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to