@@ -60,11 +60,17 @@ static
60
60
ZEND_ARG_PASS_INFO (1 )
61
61
ZEND_END_ARG_INFO ();
62
62
63
+ /* FIXME: Use the openssl constants instead of
64
+ * enum. It is now impossible to match real values
65
+ * against php constants. Also sorry to break the
66
+ * enum principles here, BC...
67
+ */
63
68
enum php_openssl_key_type {
64
69
OPENSSL_KEYTYPE_RSA ,
65
70
OPENSSL_KEYTYPE_DSA ,
66
71
OPENSSL_KEYTYPE_DH ,
67
- OPENSSL_KEYTYPE_DEFAULT = OPENSSL_KEYTYPE_RSA
72
+ OPENSSL_KEYTYPE_DEFAULT = OPENSSL_KEYTYPE_RSA ,
73
+ OPENSSL_KEYTYPE_EC = OPENSSL_KEYTYPE_DH + 1
68
74
};
69
75
70
76
enum php_openssl_cipher_type {
@@ -87,6 +93,7 @@ zend_function_entry openssl_functions[] = {
87
93
PHP_FE (openssl_pkey_export_to_file , NULL )
88
94
PHP_FE (openssl_pkey_get_private , NULL )
89
95
PHP_FE (openssl_pkey_get_public , NULL )
96
+ PHP_FE (openssl_pkey_get_details , NULL )
90
97
91
98
PHP_FALIAS (openssl_free_key , openssl_pkey_free , NULL )
92
99
PHP_FALIAS (openssl_get_privatekey , openssl_pkey_get_private , NULL )
@@ -680,6 +687,7 @@ PHP_MINIT_FUNCTION(openssl)
680
687
REGISTER_LONG_CONSTANT ("OPENSSL_KEYTYPE_DSA" , OPENSSL_KEYTYPE_DSA , CONST_CS |CONST_PERSISTENT );
681
688
#endif
682
689
REGISTER_LONG_CONSTANT ("OPENSSL_KEYTYPE_DH" , OPENSSL_KEYTYPE_DH , CONST_CS |CONST_PERSISTENT );
690
+ REGISTER_LONG_CONSTANT ("OPENSSL_KEYTYPE_EC" , OPENSSL_KEYTYPE_EC , CONST_CS |CONST_PERSISTENT );
683
691
684
692
/* Determine default SSL configuration file */
685
693
config_filename = getenv ("OPENSSL_CONF" );
@@ -2216,6 +2224,61 @@ PHP_FUNCTION(openssl_pkey_get_private)
2216
2224
2217
2225
/* }}} */
2218
2226
2227
+ /* {{{ proto resource openssl_pkey_get_details(resource key)
2228
+ returns an array with the key details (bits, pkey, type)*/
2229
+ PHP_FUNCTION (openssl_pkey_get_details )
2230
+ {
2231
+ zval * key ;
2232
+ EVP_PKEY * pkey ;
2233
+ BIO * out ;
2234
+ unsigned int pbio_len ;
2235
+ char * pbio ;
2236
+ long ktype ;
2237
+
2238
+ if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "r" , & key ) == FAILURE ) {
2239
+ return ;
2240
+ }
2241
+ ZEND_FETCH_RESOURCE (pkey , EVP_PKEY * , & key , -1 , "OpenSSL key" , le_key );
2242
+ if (!pkey ) {
2243
+ RETURN_FALSE ;
2244
+ }
2245
+ out = BIO_new (BIO_s_mem ());
2246
+ PEM_write_bio_PUBKEY (out , pkey );
2247
+ pbio_len = BIO_get_mem_data (out , & pbio );
2248
+
2249
+ array_init (return_value );
2250
+ add_assoc_long (return_value , "bits" , EVP_PKEY_bits (pkey ));
2251
+ add_assoc_stringl (return_value , "key" , pbio , pbio_len , 1 );
2252
+ /*TODO: Use the real values once the openssl constants are used
2253
+ * See the enum at the top of this file
2254
+ */
2255
+ switch (EVP_PKEY_type (pkey -> type )) {
2256
+ case EVP_PKEY_RSA :
2257
+ case EVP_PKEY_RSA2 :
2258
+ ktype = OPENSSL_KEYTYPE_RSA ;
2259
+ break ;
2260
+ case EVP_PKEY_DSA :
2261
+ case EVP_PKEY_DSA2 :
2262
+ case EVP_PKEY_DSA3 :
2263
+ case EVP_PKEY_DSA4 :
2264
+ ktype = OPENSSL_KEYTYPE_DSA ;
2265
+ break ;
2266
+ case EVP_PKEY_DH :
2267
+ ktype = OPENSSL_KEYTYPE_DH ;
2268
+ break ;
2269
+ case EVP_PKEY_EC :
2270
+ ktype = OPENSSL_KEYTYPE_EC ;
2271
+ break ;
2272
+ default :
2273
+ ktype = -1 ;
2274
+ break ;
2275
+ }
2276
+ add_assoc_long (return_value , "type" , ktype );
2277
+
2278
+ BIO_free (out );
2279
+ }
2280
+ /* }}} */
2281
+
2219
2282
/* }}} */
2220
2283
2221
2284
/* {{{ PKCS7 S/MIME functions */
0 commit comments