diff --git a/modules/service/vpn/dap_chain_net_srv_vpn_cdb_auth.c b/modules/service/vpn/dap_chain_net_srv_vpn_cdb_auth.c index 3b0d69bef95f83923c07ffa8b496d7df1dc52bf8..587121d1ab83328fc9c6c1fd73491333bb675ea5 100644 --- a/modules/service/vpn/dap_chain_net_srv_vpn_cdb_auth.c +++ b/modules/service/vpn/dap_chain_net_srv_vpn_cdb_auth.c @@ -282,46 +282,56 @@ int dap_chain_net_srv_vpn_cdb_auth_activate_serial(const char * a_serial_raw, co int l_res = 0; byte_t *l_pkey_raw = NULL; size_t l_pkey_raw_size = 0; + dap_enc_key_type_t l_key_type; { - // deserealize pkey + // verify sign + byte_t *l_sign_raw = NULL; + size_t l_sign_length = dap_strlen(a_sign); + l_sign_raw = DAP_NEW_Z_SIZE(byte_t, l_sign_length * 2); + size_t l_sign_raw_size = dap_enc_base64_decode(a_sign, l_sign_length, l_sign_raw, DAP_ENC_DATA_TYPE_B64_URLSAFE); + dap_sign_t *l_sign = (dap_sign_t*) l_sign_raw; //dap_sign_pack(l_client_key, l_sign_raw, l_sign_raw_size, l_pkey_raw, l_pkey_length); + //get key type for pkey + dap_sign_type_t l_chain_sign_type; + l_chain_sign_type.raw = l_sign_raw_size > 0 ? l_sign->header.type.raw : SIG_TYPE_NULL; + l_key_type = dap_sign_type_to_key_type(l_chain_sign_type); + size_t l_serial_len = dap_strlen(a_serial_raw); + l_res = dap_sign_verify(l_sign, a_serial_raw, l_serial_len); + if(!l_res){ + DAP_DELETE(l_sign_raw); + return -2;//OP_CODE_LOGIN_INCORRECT_SIGN + } + + // deserialize pkey dap_enc_key_t *l_client_key = NULL; size_t l_pkey_length = dap_strlen(a_pkey); l_pkey_raw = DAP_NEW_Z_SIZE(byte_t, l_pkey_length); memset(l_pkey_raw, 0, l_pkey_length); l_pkey_raw_size = dap_enc_base64_decode(a_pkey, l_pkey_length, l_pkey_raw, DAP_ENC_DATA_TYPE_B64_URLSAFE); - l_client_key = dap_enc_key_new(DAP_ENC_KEY_TYPE_SIG_TESLA); + l_client_key = dap_enc_key_new(l_key_type); //DAP_ENC_KEY_TYPE_SIG_TESLA l_res = dap_enc_key_deserealize_pub_key(l_client_key, l_pkey_raw, l_pkey_raw_size); - // verify sign - if(!l_res) { - byte_t *l_sign_raw = NULL; - size_t l_sign_length = dap_strlen(a_sign); - l_sign_raw = DAP_NEW_Z_SIZE(byte_t, l_sign_length*2); - size_t l_sign_raw_size = dap_enc_base64_decode(a_sign, l_sign_length, l_sign_raw, DAP_ENC_DATA_TYPE_B64_URLSAFE); - dap_sign_t *l_sign = (dap_sign_t*)l_sign_raw;//dap_sign_pack(l_client_key, l_sign_raw, l_sign_raw_size, l_pkey_raw, l_pkey_length); - size_t l_serial_len = dap_strlen(a_serial_raw); - l_res = dap_sign_verify(l_sign, a_serial_raw, l_serial_len); - DAP_DELETE(l_sign_raw); - } - //dap_enc_key_deserealize_sign - } - - // activate serial key - if(l_res==1) { - // added pkey to serial - l_serial_key->header.ext_size = l_pkey_raw_size; - l_serial_key = DAP_REALLOC(l_serial_key,dap_serial_key_len(l_serial_key)); - l_serial_key->header.activated = time(NULL); - memcpy(l_serial_key->ext, l_pkey_raw, l_pkey_raw_size); - // save updated serial - if(dap_chain_global_db_gr_set(dap_strdup(l_serial_key->header.serial), l_serial_key, - dap_serial_key_len(l_serial_key), - s_group_serials_activated)) { - dap_chain_global_db_gr_del(l_serial_key->header.serial, s_group_serials); - l_ret = 0;// OK + // pkey from sign + size_t l_pkey_sign_size = 0; + uint8_t *l_pkey_sign = dap_sign_get_pkey(l_sign, &l_pkey_sign_size); + // activate serial key + if(l_pkey_sign_size == l_pkey_raw_size && !memcmp(l_pkey_sign, l_pkey_raw, l_pkey_sign_size)) { + // added pkey to serial + l_serial_key->header.ext_size = l_pkey_raw_size; + l_serial_key = DAP_REALLOC(l_serial_key, dap_serial_key_len(l_serial_key)); + l_serial_key->header.activated = time(NULL); + l_serial_key->header.os = l_key_type; + memcpy(l_serial_key->ext, l_pkey_raw, l_pkey_raw_size); + // save updated serial + if(dap_chain_global_db_gr_set(dap_strdup(l_serial_key->header.serial), l_serial_key, + dap_serial_key_len(l_serial_key), + s_group_serials_activated)) { + dap_chain_global_db_gr_del(l_serial_key->header.serial, s_group_serials); + l_ret = 0; // OK + } } - } - else{ - return -2;//OP_CODE_LOGIN_INCORRECT_SIGN + // bad pkey + else + l_ret = -2;//OP_CODE_LOGIN_INCORRECT_SIGN + DAP_DELETE(l_sign_raw); } DAP_DELETE(l_pkey_raw); } @@ -351,7 +361,20 @@ int dap_chain_net_srv_vpn_cdb_auth_check_serial(const char * a_serial, const cha if((l_serial_key->header.activated + l_serial_key->header.expired) < time(NULL)) l_ret = -4; } - DAP_DELETE(l_serial_key); + // check pkey + dap_enc_key_t *l_client_key = NULL; + size_t l_pkey_length = dap_strlen(a_pkey_b64); + byte_t *l_pkey_raw = DAP_NEW_Z_SIZE(byte_t, l_pkey_length); + memset(l_pkey_raw, 0, l_pkey_length); + size_t l_pkey_raw_size = dap_enc_base64_decode(a_pkey_b64, l_pkey_length, l_pkey_raw, DAP_ENC_DATA_TYPE_B64_URLSAFE); + // pkey from sign + size_t l_pkey_sign_size = l_serial_key->header.ext_size; + uint8_t *l_pkey_sign = l_serial_key->ext; + // compare pkeys + if(l_pkey_sign_size != l_pkey_raw_size || memcmp(l_pkey_sign, l_pkey_raw, l_pkey_sign_size)) { + l_ret = -2; + } + DAP_DELETE(l_pkey_raw); return l_ret; } @@ -1090,10 +1113,10 @@ static void s_http_enc_proc(enc_http_delegate_t *a_delegate, void * a_arg) enc_http_reply_f(a_delegate, OP_CODE_NOT_FOUND_LOGIN_IN_DB); *l_return_code = Http_Status_OK; break; - /*case -2: - enc_http_reply_f(a_delegate, OP_CODE_LOGIN_INCORRECT_PSWD); + case -2: + enc_http_reply_f(a_delegate, OP_CODE_LOGIN_INCORRECT_SIGN);// incorrect pkey *l_return_code = Http_Status_OK; - break;*/ + break; case -3: enc_http_reply_f(a_delegate, OP_CODE_LOGIN_INACTIVE); *l_return_code = Http_Status_OK;