@@ -239,7 +239,7 @@ static void php_openssl_session_free_obj(zend_object *object)
239239
240240PHP_METHOD (OpenSSLSession , export )
241241{
242- zend_long format = ENCODING_DER ;
242+ zend_long format = ENCODING_PEM ;
243243
244244 ZEND_PARSE_PARAMETERS_START (0 , 1 )
245245 Z_PARAM_OPTIONAL
@@ -291,7 +291,7 @@ PHP_METHOD(OpenSSLSession, export)
291291PHP_METHOD (OpenSSLSession , import )
292292{
293293 zend_string * data ;
294- zend_long format = ENCODING_DER ;
294+ zend_long format = ENCODING_PEM ;
295295
296296 ZEND_PARSE_PARAMETERS_START (1 , 2 )
297297 Z_PARAM_STR (data )
@@ -311,7 +311,7 @@ PHP_METHOD(OpenSSLSession, import)
311311 BIO_free (bio );
312312 }
313313 } else {
314- zend_argument_value_error (2 , "must be OPENSSL_ENCODING_DER or OPENSSL_ENCODING_PEM" );
314+ zend_argument_value_error (2 , "must be OPENSSL_ENCODING_DER or OPENSSL_ENCODING_PEM" );
315315 RETURN_THROWS ();
316316 }
317317
@@ -402,26 +402,31 @@ PHP_METHOD(OpenSSLSession, getTicketLifetimeHint)
402402
403403 RETURN_LONG ((zend_long )SSL_SESSION_get_ticket_lifetime_hint (obj -> session ));
404404}
405-
406405PHP_METHOD (OpenSSLSession , __serialize )
407406{
408407 ZEND_PARSE_PARAMETERS_NONE ();
409408
410409 PHP_OPENSSL_SESSION_CHECK ();
411410
412- int len = i2d_SSL_SESSION ( obj -> session , NULL );
413- if (len <= 0 ) {
411+ BIO * bio = BIO_new ( BIO_s_mem () );
412+ if (! bio ) {
414413 zend_throw_exception (php_openssl_exception_ce , "Failed to serialize session" , 0 );
415414 RETURN_THROWS ();
416415 }
417416
418- zend_string * der = zend_string_alloc (len , 0 );
419- unsigned char * p = (unsigned char * )ZSTR_VAL (der );
420- i2d_SSL_SESSION (obj -> session , & p );
421- ZSTR_VAL (der )[len ] = '\0' ;
417+ if (!PEM_write_bio_SSL_SESSION (bio , obj -> session )) {
418+ BIO_free (bio );
419+ zend_throw_exception (php_openssl_exception_ce , "Failed to serialize session" , 0 );
420+ RETURN_THROWS ();
421+ }
422+
423+ char * data ;
424+ long len = BIO_get_mem_data (bio , & data );
425+ zend_string * pem = zend_string_init (data , len , 0 );
426+ BIO_free (bio );
422427
423428 array_init (return_value );
424- add_assoc_str (return_value , "der " , der );
429+ add_assoc_str (return_value , "pem " , pem );
425430}
426431
427432PHP_METHOD (OpenSSLSession , __unserialize )
@@ -432,14 +437,20 @@ PHP_METHOD(OpenSSLSession, __unserialize)
432437 Z_PARAM_ARRAY_HT (data )
433438 ZEND_PARSE_PARAMETERS_END ();
434439
435- zval * der_zv = zend_hash_str_find (data , ZEND_STRL ("der " ));
436- if (!der_zv || Z_TYPE_P (der_zv ) != IS_STRING ) {
440+ zval * pem_zv = zend_hash_str_find (data , ZEND_STRL ("pem " ));
441+ if (!pem_zv || Z_TYPE_P (pem_zv ) != IS_STRING ) {
437442 zend_throw_exception (php_openssl_exception_ce , "Invalid serialization data" , 0 );
438443 RETURN_THROWS ();
439444 }
440445
441- const unsigned char * p = (const unsigned char * )Z_STRVAL_P (der_zv );
442- SSL_SESSION * session = d2i_SSL_SESSION (NULL , & p , Z_STRLEN_P (der_zv ));
446+ BIO * bio = BIO_new_mem_buf (Z_STRVAL_P (pem_zv ), Z_STRLEN_P (pem_zv ));
447+ if (!bio ) {
448+ zend_throw_exception (php_openssl_exception_ce , "Failed to unserialize session" , 0 );
449+ RETURN_THROWS ();
450+ }
451+
452+ SSL_SESSION * session = PEM_read_bio_SSL_SESSION (bio , NULL , NULL , NULL );
453+ BIO_free (bio );
443454
444455 if (!session ) {
445456 zend_throw_exception (php_openssl_exception_ce , "Failed to unserialize session" , 0 );
0 commit comments