forked from acouzens/open5gs
112 lines
3.9 KiB
C
112 lines
3.9 KiB
C
/*
|
|
* Copyright (C) 2019,2020 by Sukchan Lee <acetcom@gmail.com>
|
|
*
|
|
* This file is part of Open5GS.
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU Affero General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include "sbi-path.h"
|
|
#include "nnrf-handler.h"
|
|
#include "nausf-handler.h"
|
|
|
|
bool ausf_nausf_auth_handle_authenticate(ausf_ue_t *ausf_ue,
|
|
ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg)
|
|
{
|
|
OpenAPI_authentication_info_t *AuthenticationInfo = NULL;
|
|
char *serving_network_name = NULL;
|
|
|
|
ogs_assert(ausf_ue);
|
|
ogs_assert(stream);
|
|
ogs_assert(recvmsg);
|
|
|
|
AuthenticationInfo = recvmsg->AuthenticationInfo;
|
|
if (!AuthenticationInfo) {
|
|
ogs_error("[%s] No AuthenticationInfo", ausf_ue->suci);
|
|
ogs_assert(true ==
|
|
ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST,
|
|
recvmsg, "[%s] No AuthenticationInfo", ausf_ue->suci));
|
|
return false;
|
|
}
|
|
|
|
serving_network_name = AuthenticationInfo->serving_network_name;
|
|
if (!serving_network_name) {
|
|
ogs_error("[%s] No servingNetworkName", ausf_ue->suci);
|
|
ogs_assert(true ==
|
|
ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST,
|
|
recvmsg, "[%s] No servingNetworkName", ausf_ue->suci));
|
|
return false;
|
|
}
|
|
|
|
if (ausf_ue->serving_network_name)
|
|
ogs_free(ausf_ue->serving_network_name);
|
|
ausf_ue->serving_network_name = ogs_strdup(serving_network_name);
|
|
ogs_assert(ausf_ue->serving_network_name);
|
|
|
|
ogs_assert(true ==
|
|
ausf_sbi_discover_and_send(OpenAPI_nf_type_UDM, ausf_ue, stream,
|
|
AuthenticationInfo->resynchronization_info,
|
|
ausf_nudm_ueau_build_get));
|
|
|
|
return true;
|
|
}
|
|
|
|
bool ausf_nausf_auth_handle_authenticate_confirmation(ausf_ue_t *ausf_ue,
|
|
ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg)
|
|
{
|
|
OpenAPI_confirmation_data_t *ConfirmationData = NULL;
|
|
char *res_star_string = NULL;
|
|
uint8_t res_star[OGS_KEYSTRLEN(OGS_MAX_RES_LEN)];
|
|
|
|
ogs_assert(ausf_ue);
|
|
ogs_assert(stream);
|
|
ogs_assert(recvmsg);
|
|
|
|
ConfirmationData = recvmsg->ConfirmationData;
|
|
if (!ConfirmationData) {
|
|
ogs_error("[%s] No ConfirmationData", ausf_ue->suci);
|
|
ogs_assert(true ==
|
|
ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST,
|
|
recvmsg, "[%s] No ConfirmationData", ausf_ue->suci));
|
|
return false;
|
|
}
|
|
|
|
res_star_string = ConfirmationData->res_star;
|
|
if (!res_star_string) {
|
|
ogs_error("[%s] No ConfirmationData.resStar", ausf_ue->suci);
|
|
ogs_assert(true ==
|
|
ogs_sbi_server_send_error(stream, OGS_SBI_HTTP_STATUS_BAD_REQUEST,
|
|
recvmsg, "[%s] No ConfirmationData.resStar", ausf_ue->suci));
|
|
return false;
|
|
}
|
|
|
|
ogs_ascii_to_hex(res_star_string, strlen(res_star_string),
|
|
res_star, sizeof(res_star));
|
|
|
|
if (memcmp(res_star, ausf_ue->xres_star, OGS_MAX_RES_LEN) != 0) {
|
|
ogs_log_hexdump(OGS_LOG_WARN, res_star, OGS_MAX_RES_LEN);
|
|
ogs_log_hexdump(OGS_LOG_WARN, ausf_ue->xres_star, OGS_MAX_RES_LEN);
|
|
|
|
ausf_ue->auth_result = OpenAPI_auth_result_AUTHENTICATION_FAILURE;
|
|
} else {
|
|
ausf_ue->auth_result = OpenAPI_auth_result_AUTHENTICATION_SUCCESS;
|
|
}
|
|
|
|
ogs_assert(true ==
|
|
ausf_sbi_discover_and_send(OpenAPI_nf_type_UDM, ausf_ue, stream, NULL,
|
|
ausf_nudm_ueau_build_result_confirmation_inform));
|
|
|
|
return true;
|
|
}
|