ZUC祖冲之序列密码

ZUC算法

# define ZUC_KEY_SIZE	16
# define ZUC_IV_SIZE	16
# define ZUC_MAC_SIZE	4

定义了ZUC算法的密钥长度、初始向量长度、MAC长度等信息。

typedef uint32_t ZUC_BIT;
typedef uint32_t ZUC_UINT5;
typedef uint8_t  ZUC_UINT6;
typedef uint32_t ZUC_UINT15;
typedef uint32_t ZUC_UINT31;
typedef uint32_t ZUC_UINT32;

定义了ZUC算法中使用的变量数据结构大小。

typedef struct {
	ZUC_UINT31 LFSR[16];
	ZUC_UINT32 R1;
	ZUC_UINT32 R2;
} ZUC_STATE;

ZUC_STATE结构包含16个31比特的线性反馈移位寄存器寄存器变量LFSR,以及非线性函数的2个32比特记忆单元变量R1R2

void zuc_init(ZUC_STATE *state, const uint8_t key[ZUC_KEY_SIZE], const uint8_t iv[ZUC_IV_SIZE]);

以128比特(以大小为16的字节数组表示)的初始密钥key和128比特(同上)的初始向量iv为输入,初始化ZUC_STATE结构state(即执行密钥装入、置R1R2为全0并运行初始化算法)。

void zuc_generate_keystream(ZUC_STATE *state, size_t nwords, ZUC_UINT32 *words);

以当前的ZUC_STATE结构state为基础,产生nwordsZUC_UINT32类型的值并将其存放到words指向的数组中。

ZUC_UINT32 zuc_generate_keyword(ZUC_STATE *state);

以当前的ZUC_STATE结构state为基础,产生1个ZUC_UINT32类型的值并返回该值。

ZUC MAC

typedef struct ZUC_MAC_CTX_st {
	ZUC_UINT31 LFSR[16];
	ZUC_UINT32 R1;
	ZUC_UINT32 R2;
	ZUC_UINT32 T;
	ZUC_UINT32 K0;
	uint8_t buf[4];
	size_t buflen;
} ZUC_MAC_CTX;

ZUC_MAC_CTX结构包含16个31比特的线性反馈移位寄存器寄存器变量LFSR、非线性函数的2个32比特记忆单元变量R1R2、32比特字变量TK0、计数器字节数组buf和整数buflen

void zuc_mac_init(ZUC_MAC_CTX *ctx, const uint8_t key[ZUC_KEY_SIZE], const uint8_t iv[ZUC_IV_SIZE]);

以128比特(以大小为16的字节数组表示)的初始密钥key和128比特(同上)的初始向量iv为输入,初始化ZUC_MAC_CTX结构ctx

void zuc_mac_update(ZUC_MAC_CTX *ctx, const uint8_t *data, size_t len);

用长度为len的字节数组data更新ZUC_MAC_CTX结构ctx

void zuc_mac_finish(ZUC_MAC_CTX *ctx, const uint8_t *data, size_t nbits, uint8_t mac[ZUC_MAC_SIZE]);

用长度为nbits的字节数组data更新ZUC_MAC_CTX结构ctx,并输出使用ZUC完整性算法计算出的32比特消息认证码,将其存放到数组mac中。

ZUC-EEA

void zuc_eea_encrypt(const ZUC_UINT32 *in, ZUC_UINT32 *out, size_t nbits,
	const uint8_t key[ZUC_KEY_SIZE], ZUC_UINT32 count, ZUC_UINT5 bearer,
	ZUC_BIT direction);

使用ZUC机密性算法对长度为nbits的输入明文in进行加密,并将结果存放到数组out中。其他需要提供的参数包括:128比特(以大小为16的字节数组表示)的初始密钥key、计数器count、承载层标识bearer和传输方向标识direction

ZUC-EIA

ZUC_UINT32 zuc_eia_generate_mac(const ZUC_UINT32 *data, size_t nbits,
	const uint8_t key[ZUC_KEY_SIZE], ZUC_UINT32 count, ZUC_UINT5 bearer,
	ZUC_BIT direction);

使用ZUC完整性算法对长度为nbits的输入数据data计算消息认证码并输出。其他需要提供的参数包括:128比特(以大小为16的字节数组表示)的初始密钥key、计数器count、承载层标识bearer和传输方向标识direction