/*
 * Copyright (C) 2025. Institute of Information Engineering, CAS
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 * 
 * @file:       zuc256.h
 * @brief:      zuc256模块对外接口声明
 * @author:     QZH <qinzhenghui@iie.ac.cn>
 * @version:    1.0.0
 * @date:       2025-09-01
 * 
 * @attention:  接口使用注意事项
 */
#ifndef __ZUC256_H
#define __ZUC256_H

#include <stdint.h>
#include <stdlib.h>
#include <string.h>

// 类型定义
typedef uint32_t ZUC_UINT31;  // 31位无符号整数
typedef uint8_t  ZUC_UINT7;   // 7位无符号整数
typedef uint8_t  ZUC_UINT6;   // 6位无符号整数
typedef uint32_t ZUC_UINT32;  // 32位无符号整数
// ZUC状态结构体
typedef struct {
    ZUC_UINT31 LFSR[16];  // 线性反馈移位寄存器
    uint32_t R1;          // 寄存器1
    uint32_t R2;          // 寄存器2
} ZUC_STATE;
typedef ZUC_STATE ZUC256_STATE;
// 加密上下文结构体(用于分阶段处理)
typedef struct {
    ZUC_STATE state;   // 基础ZUC状态
    uint8_t buf[4];       // 输入缓冲区(处理非4字节对齐数据)
    size_t buflen;        // 缓冲区中有效字节数
} ZUC256_ENCRYPT_CTX;
// ZUC256 MAC 上下文结构体
typedef struct {
    ZUC_UINT31 LFSR[16];    // ZUC256 线性反馈移位寄存器
    uint32_t R1;             // 非线性函数寄存器R1
    uint32_t R2;             // 非线性函数寄存器R2
    uint8_t buf[4];          // 数据缓存(处理不足4字节的待认证数据)
    size_t buflen;           // 缓存中有效数据长度(0~3)
    uint32_t T[4];           // MAC 累加器(支持最大128位MAC，4个32位字)
    uint32_t K0[4];          // MAC 初始密钥字(与T长度匹配)
    int macbits;             // MAC 输出位数(32/64/128，按32位对齐)
} ZUC256_MAC_CTX;

// 初始化ZUC256状态
void zuc256_init(ZUC_STATE *state, const uint8_t K[32], const uint8_t IV[23]);

// 生成单个密钥字
uint32_t zuc256_generate_keyword(ZUC_STATE *state);

// 生成指定长度的密钥流
void zuc256_generate_keystream(ZUC_STATE *state, size_t nwords, uint32_t *keystream);

// 初始化加密上下文
void zuc256_encrypt_init(ZUC256_ENCRYPT_CTX *ctx, const uint8_t K[32], const uint8_t IV[23]);

// 分阶段处理加密数据(支持流式输入)
void zuc256_encrypt_update(ZUC256_ENCRYPT_CTX *ctx, const uint8_t *in, size_t inlen, uint8_t *out);

// 完成加密处理(处理剩余数据并清理上下文)
void zuc256_encrypt_finish(ZUC256_ENCRYPT_CTX *ctx, uint8_t *out);

// 一次性加密函数
void zuc256_crypt(ZUC_STATE *state, const uint8_t *in, size_t inlen, uint8_t *out);
void extract_iv(const uint8_t *input_25byte, uint8_t *output_23byte);
#endif /*__ZUC256_H */
    