/*
 * @file: 
 * @Author: Lida
 * @Date: 2022-12-28 14:49:28
 * @LastEditors: Lida
 * @LastEditTime: 2023-01-11 09:52:38
 */
#include "svc_cloud_security.h"
#include "../../util/util_md5.h"
#include "svc_cloud_protocol.h"

static Sercurity_Manager_Struct sercurity_manager_struct;

void Svc_Cloud_Sercurity_Init(gw_u8 product_id[16],gw_u8 data[4]){
    gw_u8 src_data[20];
    memcpy(src_data,product_id,16);
    memcpy(&src_data[16],data,4);
    MD5_CTX md5_ctx;
    Util_Md5_Init(&md5_ctx);
    Util_Md5_Update(&md5_ctx,src_data,sizeof(src_data));
    Util_Md5_Final(&md5_ctx,sercurity_manager_struct.sign);
    memcpy(sercurity_manager_struct.sign_temp,sercurity_manager_struct.sign,16);
}

void Svc_Cloud_Sercurity_Get_Req_Sign(gw_u8 out_req_sign[4]){
    memcpy(out_req_sign,&sercurity_manager_struct.sign[REQ_SIGN_INDEX],4);
}

void Svc_Cloud_Sercurity_Get_Rsp_Sign(gw_u8 out_rsq_sign[4]){
    memcpy(out_rsq_sign,&sercurity_manager_struct.sign[RSP_SIGN_INDEX],4);
}

void Svc_Cloud_Sercurity_Get_Sign_Data(gw_u8 out_sign_data[4]){
    memcpy(out_sign_data,&sercurity_manager_struct.sign[SIGN_DATA_INDEX],4);
}

void Svc_Cloud_Sercurity_Get_Req_Sign_Temp(gw_u8 out_req_sign[4]){
    memcpy(out_req_sign,&sercurity_manager_struct.sign_temp[REQ_SIGN_INDEX],4);
}

void Svc_Cloud_Sercurity_Produce_Sign(gw_u8 product_id[16]){
    gw_u8 src_data[20];
    memcpy(src_data,product_id,16);
    memcpy(&src_data[16],&sercurity_manager_struct.sign[SIGN_DATA_INDEX],4);
    MD5_CTX md5_ctx;
    Util_Md5_Init(&md5_ctx);
    Util_Md5_Update(&md5_ctx,src_data,sizeof(src_data));
    Util_Md5_Final(&md5_ctx,sercurity_manager_struct.sign_temp);
}

E_Result_Check Svc_Cloud_Sercurity_Check_Sign(Sercurity_Check_Struct sercurity_check_struct){
    if(sercurity_check_struct.dir==REQUEST){
        if(memcmp(sercurity_check_struct.sign_data,&sercurity_manager_struct.sign[SIGN_DATA_INDEX],4)!=0){
            return E_CHECK_FAIL;
        }
        gw_u8 src_data[20];
        memcpy(src_data,sercurity_check_struct.product_id,16);
        memcpy(&src_data[16],sercurity_check_struct.sign_data,4);
        MD5_CTX md5_ctx;
        Util_Md5_Init(&md5_ctx);
        Util_Md5_Update(&md5_ctx,src_data,sizeof(src_data));
        Util_Md5_Final(&md5_ctx,sercurity_manager_struct.sign_temp);
        if(memcmp(sercurity_check_struct.req_sign,&sercurity_manager_struct.sign_temp[REQ_SIGN_INDEX],4)!=0){
            return E_CHECK_FAIL;
        }
        memcpy(sercurity_manager_struct.sign,sercurity_manager_struct.sign_temp,16);
    }else{
        if(memcmp(sercurity_check_struct.rsp_sign,&sercurity_manager_struct.sign_temp[RSP_SIGN_INDEX],4)!=0){
            return E_CHECK_FAIL;
        }
        memcpy(sercurity_manager_struct.sign,sercurity_manager_struct.sign_temp,16);
    }
    return E_CHECK_OK;
}