Files
se-algo/ref_c_java/zuc256_c/inc/zuc256.h
2025-09-09 10:36:33 +08:00

89 lines
3.6 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* 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位MAC4个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 */