@@ -89,7 +89,6 @@ mysqlnd_run_authentication(
89
89
}
90
90
}
91
91
92
-
93
92
{
94
93
zend_uchar * switch_to_auth_protocol_data = NULL ;
95
94
size_t switch_to_auth_protocol_data_len = 0 ;
@@ -114,11 +113,10 @@ mysqlnd_run_authentication(
114
113
DBG_INF_FMT ("salt(%d)=[%.*s]" , plugin_data_len , plugin_data_len , plugin_data );
115
114
/* The data should be allocated with malloc() */
116
115
if (auth_plugin ) {
117
- scrambled_data = auth_plugin -> methods .get_auth_data (
118
- NULL , & scrambled_data_len , conn , user , passwd ,
119
- passwd_len , plugin_data , plugin_data_len ,
120
- session_options , conn -> protocol_frame_codec -> data ,
121
- mysql_flags );
116
+ scrambled_data =
117
+ auth_plugin -> methods .get_auth_data (NULL , & scrambled_data_len , conn , user , passwd , passwd_len ,
118
+ plugin_data , plugin_data_len , session_options ,
119
+ conn -> protocol_frame_codec -> data , mysql_flags );
122
120
}
123
121
124
122
if (conn -> error_info -> error_no ) {
@@ -129,7 +127,6 @@ mysqlnd_run_authentication(
129
127
charset_no ,
130
128
first_call ,
131
129
requested_protocol ,
132
- auth_plugin , plugin_data , plugin_data_len ,
133
130
scrambled_data , scrambled_data_len ,
134
131
& switch_to_auth_protocol , & switch_to_auth_protocol_len ,
135
132
& switch_to_auth_protocol_data , & switch_to_auth_protocol_data_len
@@ -251,9 +248,6 @@ mysqlnd_auth_handshake(MYSQLND_CONN_DATA * conn,
251
248
unsigned int server_charset_no ,
252
249
zend_bool use_full_blown_auth_packet ,
253
250
const char * const auth_protocol ,
254
- struct st_mysqlnd_authentication_plugin * auth_plugin ,
255
- const zend_uchar * const orig_auth_plugin_data ,
256
- const size_t orig_auth_plugin_data_len ,
257
251
const zend_uchar * const auth_plugin_data ,
258
252
const size_t auth_plugin_data_len ,
259
253
char * * switch_to_auth_protocol ,
@@ -324,11 +318,6 @@ mysqlnd_auth_handshake(MYSQLND_CONN_DATA * conn,
324
318
conn -> charset = mysqlnd_find_charset_nr (auth_packet -> charset_no );
325
319
}
326
320
327
- if (auth_plugin && auth_plugin -> methods .handle_server_response ) {
328
- auth_plugin -> methods .handle_server_response (auth_plugin , conn ,
329
- orig_auth_plugin_data , orig_auth_plugin_data_len , passwd , passwd_len );
330
- }
331
-
332
321
if (FAIL == PACKET_READ (auth_resp_packet ) || auth_resp_packet -> response_code >= 0xFE ) {
333
322
if (auth_resp_packet -> response_code == 0xFE ) {
334
323
/* old authentication with new server !*/
@@ -624,8 +613,7 @@ static struct st_mysqlnd_authentication_plugin mysqlnd_native_auth_plugin =
624
613
}
625
614
},
626
615
{/* methods */
627
- mysqlnd_native_auth_get_auth_data ,
628
- NULL
616
+ mysqlnd_native_auth_get_auth_data
629
617
}
630
618
};
631
619
@@ -674,8 +662,7 @@ static struct st_mysqlnd_authentication_plugin mysqlnd_pam_authentication_plugin
674
662
}
675
663
},
676
664
{/* methods */
677
- mysqlnd_pam_auth_get_auth_data ,
678
- NULL
665
+ mysqlnd_pam_auth_get_auth_data
679
666
}
680
667
};
681
668
@@ -859,283 +846,17 @@ static struct st_mysqlnd_authentication_plugin mysqlnd_sha256_authentication_plu
859
846
}
860
847
},
861
848
{/* methods */
862
- mysqlnd_sha256_auth_get_auth_data ,
863
- NULL
849
+ mysqlnd_sha256_auth_get_auth_data
864
850
}
865
851
};
866
852
#endif
867
853
868
- /*************************************** CACHING SHA2 Password *******************************/
869
-
870
- #undef L64
871
-
872
- #include "ext/hash/php_hash.h"
873
- #include "ext/hash/php_hash_sha.h"
874
-
875
- #define SHA256_LENGTH 32
876
-
877
- /* {{{ php_mysqlnd_scramble_sha2 */
878
- void php_mysqlnd_scramble_sha2 (zend_uchar * const buffer , const zend_uchar * const scramble , const zend_uchar * const password , const size_t password_len )
879
- {
880
- PHP_SHA256_CTX context ;
881
- zend_uchar sha1 [SHA256_LENGTH ];
882
- zend_uchar sha2 [SHA256_LENGTH ];
883
-
884
- /* Phase 1: hash password */
885
- PHP_SHA256Init (& context );
886
- PHP_SHA256Update (& context , password , password_len );
887
- PHP_SHA256Final (sha1 , & context );
888
-
889
- /* Phase 2: hash sha1 */
890
- PHP_SHA256Init (& context );
891
- PHP_SHA256Update (& context , (zend_uchar * )sha1 , SHA256_LENGTH );
892
- PHP_SHA256Final (sha2 , & context );
893
-
894
- /* Phase 3: hash scramble + sha2 */
895
- PHP_SHA256Init (& context );
896
- PHP_SHA256Update (& context , (zend_uchar * )sha2 , SHA256_LENGTH );
897
- PHP_SHA256Update (& context , scramble , SCRAMBLE_LENGTH );
898
- PHP_SHA256Final (buffer , & context );
899
-
900
- /* let's crypt buffer now */
901
- php_mysqlnd_crypt (buffer , (const zend_uchar * )sha1 , (const zend_uchar * )buffer , SHA256_LENGTH );
902
- }
903
- /* }}} */
904
-
905
-
906
- /* {{{ mysqlnd_native_auth_get_auth_data */
907
- static zend_uchar *
908
- mysqlnd_caching_sha2_get_auth_data (struct st_mysqlnd_authentication_plugin * self ,
909
- size_t * auth_data_len ,
910
- MYSQLND_CONN_DATA * conn , const char * const user , const char * const passwd ,
911
- const size_t passwd_len , zend_uchar * auth_plugin_data , size_t auth_plugin_data_len ,
912
- const MYSQLND_SESSION_OPTIONS * const session_options ,
913
- const MYSQLND_PFC_DATA * const pfc_data ,
914
- zend_ulong mysql_flags
915
- )
916
- {
917
- zend_uchar * ret = NULL ;
918
- DBG_ENTER ("mysqlnd_caching_sha2_get_auth_data" );
919
- DBG_INF_FMT ("salt(%d)=[%.*s]" , auth_plugin_data_len , auth_plugin_data_len , auth_plugin_data );
920
- * auth_data_len = 0 ;
921
-
922
- DBG_INF ("First auth step: send hashed password" );
923
- /* copy scrambled pass*/
924
- if (passwd && passwd_len ) {
925
- ret = malloc (SHA256_LENGTH + 1 );
926
- * auth_data_len = SHA256_LENGTH ;
927
- php_mysqlnd_scramble_sha2 ((zend_uchar * )ret , auth_plugin_data , (zend_uchar * )passwd , passwd_len );
928
- ret [SHA256_LENGTH ] = '\0' ;
929
- DBG_INF_FMT ("hash(%d)=[%.*s]" , * auth_data_len , * auth_data_len , ret );
930
- }
931
-
932
- DBG_RETURN (ret );
933
- }
934
- /* }}} */
935
-
936
- #ifdef MYSQLND_HAVE_SSL
937
- static RSA *
938
- mysqlnd_caching_sha2_get_key (MYSQLND_CONN_DATA * conn )
939
- {
940
- RSA * ret = NULL ;
941
- const MYSQLND_PFC_DATA * const pfc_data = conn -> protocol_frame_codec -> data ;
942
- const char * fname = (pfc_data -> sha256_server_public_key && pfc_data -> sha256_server_public_key [0 ] != '\0' )?
943
- pfc_data -> sha256_server_public_key :
944
- MYSQLND_G (sha256_server_public_key );
945
- php_stream * stream ;
946
- DBG_ENTER ("mysqlnd_cached_sha2_get_key" );
947
- DBG_INF_FMT ("options_s256_pk=[%s] MYSQLND_G(sha256_server_public_key)=[%s]" ,
948
- pfc_data -> sha256_server_public_key ? pfc_data -> sha256_server_public_key :"n/a" ,
949
- MYSQLND_G (sha256_server_public_key )? MYSQLND_G (sha256_server_public_key ):"n/a" );
950
- if (!fname || fname [0 ] == '\0' ) {
951
- MYSQLND_PACKET_CACHED_SHA2_RESULT * req_packet = NULL ;
952
- MYSQLND_PACKET_SHA256_PK_REQUEST_RESPONSE * pk_resp_packet = NULL ;
953
-
954
- do {
955
- DBG_INF ("requesting the public key from the server" );
956
- req_packet = conn -> payload_decoder_factory -> m .get_cached_sha2_result_packet (conn -> payload_decoder_factory , FALSE);
957
- pk_resp_packet = conn -> payload_decoder_factory -> m .get_sha256_pk_request_response_packet (conn -> payload_decoder_factory , FALSE);
958
- req_packet -> request = 1 ;
959
-
960
- if (! PACKET_WRITE (req_packet )) {
961
- DBG_ERR_FMT ("Error while sending public key request packet" );
962
- php_error (E_WARNING , "Error while sending public key request packet. PID=%d" , getpid ());
963
- SET_CONNECTION_STATE (& conn -> state , CONN_QUIT_SENT );
964
- break ;
965
- }
966
- if (FAIL == PACKET_READ (pk_resp_packet ) || NULL == pk_resp_packet -> public_key ) {
967
- DBG_ERR_FMT ("Error while receiving public key" );
968
- php_error (E_WARNING , "Error while receiving public key. PID=%d" , getpid ());
969
- SET_CONNECTION_STATE (& conn -> state , CONN_QUIT_SENT );
970
- break ;
971
- }
972
- DBG_INF_FMT ("Public key(%d):\n%s" , pk_resp_packet -> public_key_len , pk_resp_packet -> public_key );
973
- /* now extract the public key */
974
- {
975
- BIO * bio = BIO_new_mem_buf (pk_resp_packet -> public_key , pk_resp_packet -> public_key_len );
976
- ret = PEM_read_bio_RSA_PUBKEY (bio , NULL , NULL , NULL );
977
- BIO_free (bio );
978
- }
979
- } while (0 );
980
- PACKET_FREE (req_packet );
981
- PACKET_FREE (pk_resp_packet );
982
-
983
- DBG_INF_FMT ("ret=%p" , ret );
984
- DBG_RETURN (ret );
985
-
986
- SET_CLIENT_ERROR (conn -> error_info , CR_UNKNOWN_ERROR , UNKNOWN_SQLSTATE ,
987
- "caching_sha2_server_public_key is not set for the connection or as mysqlnd.sha256_server_public_key" );
988
- DBG_ERR ("server_public_key is not set" );
989
- DBG_RETURN (NULL );
990
- } else {
991
- zend_string * key_str ;
992
- DBG_INF_FMT ("Key in a file. [%s]" , fname );
993
- stream = php_stream_open_wrapper ((char * ) fname , "rb" , REPORT_ERRORS , NULL );
994
-
995
- if (stream ) {
996
- if ((key_str = php_stream_copy_to_mem (stream , PHP_STREAM_COPY_ALL , 0 )) != NULL ) {
997
- BIO * bio = BIO_new_mem_buf (ZSTR_VAL (key_str ), ZSTR_LEN (key_str ));
998
- ret = PEM_read_bio_RSA_PUBKEY (bio , NULL , NULL , NULL );
999
- BIO_free (bio );
1000
- DBG_INF ("Successfully loaded" );
1001
- DBG_INF_FMT ("Public key:%*.s" , ZSTR_LEN (key_str ), ZSTR_VAL (key_str ));
1002
- zend_string_release (key_str );
1003
- }
1004
- php_stream_close (stream );
1005
- }
1006
- }
1007
- DBG_RETURN (ret );
1008
-
1009
- }
1010
- #endif
1011
-
1012
-
1013
- /* {{{ mysqlnd_caching_sha2_get_key */
1014
- static size_t
1015
- mysqlnd_caching_sha2_get_and_use_key (MYSQLND_CONN_DATA * conn ,
1016
- const zend_uchar * auth_plugin_data , size_t auth_plugin_data_len ,
1017
- unsigned char * * crypted ,
1018
- const char * const passwd ,
1019
- const size_t passwd_len )
1020
- {
1021
- #ifdef MYSQLND_HAVE_SSL
1022
- static RSA * server_public_key ;
1023
- server_public_key = mysqlnd_caching_sha2_get_key (conn );
1024
-
1025
- DBG_ENTER ("mysqlnd_caching_sha2_get_and_use_key(" );
1026
-
1027
- if (server_public_key ) {
1028
- int server_public_key_len ;
1029
- char xor_str [passwd_len + 1 ];
1030
- memcpy (xor_str , passwd , passwd_len );
1031
- xor_str [passwd_len ] = '\0' ;
1032
- mysqlnd_xor_string (xor_str , passwd_len , (char * ) auth_plugin_data , auth_plugin_data_len );
1033
-
1034
- server_public_key_len = RSA_size (server_public_key );
1035
- /*
1036
- Because RSA_PKCS1_OAEP_PADDING is used there is a restriction on the passwd_len.
1037
- RSA_PKCS1_OAEP_PADDING is recommended for new applications. See more here:
1038
- http://www.openssl.org/docs/crypto/RSA_public_encrypt.html
1039
- */
1040
- if ((size_t ) server_public_key_len - 41 <= passwd_len ) {
1041
- /* password message is to long */
1042
- SET_CLIENT_ERROR (conn -> error_info , CR_UNKNOWN_ERROR , UNKNOWN_SQLSTATE , "password is too long" );
1043
- DBG_ERR ("password is too long" );
1044
- DBG_RETURN (0 );
1045
- }
1046
-
1047
- * crypted = emalloc (server_public_key_len );
1048
- RSA_public_encrypt (passwd_len + 1 , (zend_uchar * ) xor_str , * crypted , server_public_key , RSA_PKCS1_OAEP_PADDING );
1049
- DBG_RETURN (server_public_key_len );
1050
- }
1051
- DBG_RETURN (0 );
1052
- #else
1053
- DBG_ENTER ("mysqlnd_caching_sha2_get_and_use_key(" );
1054
- php_error_docref (NULL , E_WARNING , "PHP was built without openssl extension, can't send password encrypted" );
1055
- DBG_RETURN (0 );
1056
- #endif
1057
- }
1058
- /* }}} */
1059
-
1060
- /* {{{ mysqlnd_native_auth_get_auth_data */
1061
- static void
1062
- mysqlnd_caching_sha2_handle_server_response (struct st_mysqlnd_authentication_plugin * self ,
1063
- MYSQLND_CONN_DATA * conn ,
1064
- const zend_uchar * auth_plugin_data , size_t auth_plugin_data_len ,
1065
- const char * const passwd ,
1066
- const size_t passwd_len )
1067
- {
1068
- DBG_ENTER ("mysqlnd_caching_sha2_handle_server_response" );
1069
- MYSQLND_PACKET_CACHED_SHA2_RESULT * result_packet ;
1070
- result_packet = conn -> payload_decoder_factory -> m .get_cached_sha2_result_packet (conn -> payload_decoder_factory , FALSE);
1071
-
1072
- if (FAIL == PACKET_READ (result_packet )) {
1073
- DBG_VOID_RETURN ;
1074
- }
1075
-
1076
- switch (result_packet -> response_code ) {
1077
- case 3 :
1078
- DBG_INF ("fast path suceeded" );
1079
- PACKET_FREE (result_packet );
1080
- DBG_VOID_RETURN ;
1081
- case 4 :
1082
- if (conn -> vio -> data -> ssl || conn -> unix_socket .s ) {
1083
- DBG_INF ("fast path failed, doing full auth via SSL" );
1084
- result_packet -> password = (zend_uchar * )passwd ;
1085
- result_packet -> password_len = passwd_len + 1 ;
1086
- PACKET_WRITE (result_packet );
1087
- } else {
1088
- DBG_INF ("fast path failed, doing full auth without SSL" );
1089
- result_packet -> password_len = mysqlnd_caching_sha2_get_and_use_key (conn , auth_plugin_data , auth_plugin_data_len , & result_packet -> password , passwd , passwd_len );
1090
- PACKET_WRITE (result_packet );
1091
- efree (result_packet -> password );
1092
- }
1093
- PACKET_FREE (result_packet );
1094
- DBG_VOID_RETURN ;
1095
- case 2 :
1096
- // The server tried to send a key, which we didn't expect
1097
- // fall-through
1098
- default :
1099
- php_error_docref (NULL , E_WARNING , "Unexpected server respose while doing caching_sha2 auth: %i" , result_packet -> response_code );
1100
- }
1101
-
1102
- PACKET_FREE (result_packet );
1103
-
1104
- DBG_VOID_RETURN ;
1105
- }
1106
- /* }}} */
1107
-
1108
- static struct st_mysqlnd_authentication_plugin mysqlnd_caching_sha2_auth_plugin =
1109
- {
1110
- {
1111
- MYSQLND_PLUGIN_API_VERSION ,
1112
- "auth_plugin_caching_sha2_password" ,
1113
- MYSQLND_VERSION_ID ,
1114
- PHP_MYSQLND_VERSION ,
1115
- "PHP License 3.01" ,
1116
- "Johannes Schlüter <[email protected] >" ,
1117
- {
1118
- NULL , /* no statistics , will be filled later if there are some */
1119
- NULL , /* no statistics */
1120
- },
1121
- {
1122
- NULL /* plugin shutdown */
1123
- }
1124
- },
1125
- {/* methods */
1126
- mysqlnd_caching_sha2_get_auth_data ,
1127
- mysqlnd_caching_sha2_handle_server_response
1128
- }
1129
- };
1130
-
1131
-
1132
854
/* {{{ mysqlnd_register_builtin_authentication_plugins */
1133
855
void
1134
856
mysqlnd_register_builtin_authentication_plugins (void )
1135
857
{
1136
858
mysqlnd_plugin_register_ex ((struct st_mysqlnd_plugin_header * ) & mysqlnd_native_auth_plugin );
1137
859
mysqlnd_plugin_register_ex ((struct st_mysqlnd_plugin_header * ) & mysqlnd_pam_authentication_plugin );
1138
- mysqlnd_plugin_register_ex ((struct st_mysqlnd_plugin_header * ) & mysqlnd_caching_sha2_auth_plugin );
1139
860
#ifdef MYSQLND_HAVE_SSL
1140
861
mysqlnd_plugin_register_ex ((struct st_mysqlnd_plugin_header * ) & mysqlnd_sha256_authentication_plugin );
1141
862
#endif
0 commit comments