open5gs/src/ausf/nausf-handler.c

138 lines
4.6 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;
int r;
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, "No AuthenticationInfo", ausf_ue->suci, NULL));
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, "No servingNetworkName", ausf_ue->suci, NULL));
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);
r = ausf_sbi_discover_and_send(
OGS_SBI_SERVICE_TYPE_NUDM_UEAU, NULL,
ausf_nudm_ueau_build_get,
ausf_ue, stream, AuthenticationInfo->resynchronization_info);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
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)];
int r;
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, "No ConfirmationData", ausf_ue->suci, NULL));
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, "No ConfirmationData.resStar", ausf_ue->suci, NULL));
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;
}
r = ausf_sbi_discover_and_send(
OGS_SBI_SERVICE_TYPE_NUDM_UEAU, NULL,
ausf_nudm_ueau_build_result_confirmation_inform,
ausf_ue, stream, NULL);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return true;
}
bool ausf_nausf_auth_handle_authenticate_delete(ausf_ue_t *ausf_ue,
ogs_sbi_stream_t *stream, ogs_sbi_message_t *recvmsg)
{
int r;
ogs_assert(ausf_ue);
ogs_assert(stream);
ogs_assert(recvmsg);
r = ausf_sbi_discover_and_send(
OGS_SBI_SERVICE_TYPE_NUDM_UEAU, NULL,
ausf_nudm_ueau_build_auth_removal_ind,
ausf_ue, stream, NULL);
ogs_expect(r == OGS_OK);
ogs_assert(r != OGS_ERROR);
return true;
}