@@ -169,7 +169,76 @@ static void php_openssl_pkey_free_obj(zend_object *object)
169169 zend_object_std_dtor (& key_object -> std );
170170}
171171
172- /* OpenSSLSession class */
172+ /* Openssl\Psk class */
173+
174+ zend_class_entry * php_openssl_psk_ce ;
175+
176+ static zend_object_handlers php_openssl_psk_object_handlers ;
177+
178+ bool php_openssl_is_psk_ce (zval * val )
179+ {
180+ return Z_TYPE_P (val ) == IS_OBJECT && Z_OBJCE_P (val ) == php_openssl_psk_ce ;
181+ }
182+
183+ zend_string * php_openssl_psk_get_psk (zval * psk_zv )
184+ {
185+ zval rv ;
186+ zval * prop = zend_read_property (php_openssl_psk_ce , Z_OBJ_P (psk_zv ), ZEND_STRL ("psk" ), 0 , & rv );
187+ if (UNEXPECTED (Z_TYPE_P (prop ) != IS_STRING )) {
188+ return NULL ;
189+ }
190+ return Z_STR_P (prop );
191+ }
192+
193+ zend_string * php_openssl_psk_get_identity (zval * psk_zv )
194+ {
195+ zval rv ;
196+ zval * prop = zend_read_property (php_openssl_psk_ce , Z_OBJ_P (psk_zv ),
197+ ZEND_STRL ("identity" ), 0 , & rv );
198+ if (Z_TYPE_P (prop ) == IS_NULL ) {
199+ return NULL ;
200+ }
201+ if (UNEXPECTED (Z_TYPE_P (prop ) != IS_STRING )) {
202+ return NULL ;
203+ }
204+ return Z_STR_P (prop );
205+ }
206+
207+ PHP_METHOD (Openssl_Psk , __construct )
208+ {
209+ zend_string * psk ;
210+ zend_string * identity = NULL ;
211+
212+ ZEND_PARSE_PARAMETERS_START (1 , 2 )
213+ Z_PARAM_STR (psk )
214+ Z_PARAM_OPTIONAL
215+ Z_PARAM_STR_OR_NULL (identity )
216+ ZEND_PARSE_PARAMETERS_END ();
217+
218+ if (ZSTR_LEN (psk ) == 0 ) {
219+ zend_argument_value_error (1 , "must not be empty" );
220+ RETURN_THROWS ();
221+ }
222+ if (ZSTR_LEN (psk ) > PHP_OPENSSL_PSK_MAX_PSK_LEN ) {
223+ zend_argument_value_error (1 , "must not exceed %d bytes" , PHP_OPENSSL_PSK_MAX_PSK_LEN );
224+ RETURN_THROWS ();
225+ }
226+ if (identity != NULL && ZSTR_LEN (identity ) > PHP_OPENSSL_PSK_MAX_IDENTITY_LEN ) {
227+ zend_argument_value_error (2 , "must not exceed %d bytes" , PHP_OPENSSL_PSK_MAX_IDENTITY_LEN );
228+ RETURN_THROWS ();
229+ }
230+
231+ zend_update_property_str (php_openssl_psk_ce , Z_OBJ_P (ZEND_THIS ), ZEND_STRL ("psk" ), psk );
232+
233+ if (identity != NULL ) {
234+ zend_update_property_str (php_openssl_psk_ce , Z_OBJ_P (ZEND_THIS ),
235+ ZEND_STRL ("identity" ), identity );
236+ } else {
237+ zend_update_property_null (php_openssl_psk_ce , Z_OBJ_P (ZEND_THIS ), ZEND_STRL ("identity" ));
238+ }
239+ }
240+
241+ /* Openssl\Session class */
173242
174243zend_class_entry * php_openssl_session_ce ;
175244
@@ -716,6 +785,11 @@ PHP_MINIT_FUNCTION(openssl)
716785 php_openssl_pkey_object_handlers .clone_obj = NULL ;
717786 php_openssl_pkey_object_handlers .compare = zend_objects_not_comparable ;
718787
788+ php_openssl_psk_ce = register_class_Openssl_Psk ();
789+ php_openssl_psk_ce -> default_object_handlers = & php_openssl_psk_object_handlers ;
790+
791+ memcpy (& php_openssl_psk_object_handlers , & std_object_handlers , sizeof (zend_object_handlers ));
792+
719793 php_openssl_session_ce = register_class_Openssl_Session ();
720794 php_openssl_session_ce -> create_object = php_openssl_session_create_object ;
721795 php_openssl_session_ce -> default_object_handlers = & php_openssl_session_object_handlers ;
0 commit comments