Files
mimajingsai_3/ChaCha20_DRBG.h
2024-01-09 15:39:29 +08:00

111 lines
3.8 KiB
C
Raw 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.

#include <ctype.h>
#include <math.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#ifndef CHACHA20_DRBG_H
#define CHACHA20_DRBG_H
#define SUCCESS 0
#define ERROR -1
// 为ChaCha20设置适当的长度。
#define KEYLEN 32 // ChaCha20的密钥长度字节
#define COUNTERLEN 4 // ChaCha20的计数器长度字节
#define NONCELEN 12 // ChaCha20的nonce长度字节
#define OUTLEN 64 // 输出长度是64字节512位
#define SEEDLEN 96 // KEYLEN + OUTLEN字节
// for Instantiate
#define MAX_PERSONALIZATION_STRING_LEN 800 // (字节)
#define min_entropy_input_length 32 // (字节)
#define max_entropy_input_length pow(2, 35) / 8 // (字节)
// for handles
#define MAX_STATES 100
#define INVALID_HANDLE -1
// for get_entropy_input
#define reseed_interval_in_counter pow(2, 10) // (次)
#define reseed_interval_in_time 60 //(秒)
#define MAX_NUMBER_OF_BITS 1024 // (比特)
// for entropy
#define BLOCK_SIZE 64
#define HASH_SIZE 32
/*----------------熵源的相关定义与函数----------------*/
typedef struct {
uint8_t data[BLOCK_SIZE];
uint32_t datalen;
uint64_t bitlen;
uint32_t state[8];
} SHA256_CTX;
void sha256_transform(SHA256_CTX *ctx, const uint8_t data[]);
void sha256_init(SHA256_CTX *ctx);
void sha256_update(SHA256_CTX *ctx, const uint8_t data[], size_t len);
void sha256_final(SHA256_CTX *ctx, uint8_t hash[]);
void get_entropy_source(uint8_t *entropy_source);
void get_entropy_input(const uint8_t *data, size_t len, uint8_t *entropy);
/*----------------------------------------------*/
/*--------------------卡方检验相关定义与函数---------------------------*/
#define RANDOM_BITS_NUMBER 100
#define RANDOM_BITS_SIZE 128
int test_randomness(const unsigned char *bits);
/*-------------------------------------------------------*/
/*----------------ChaCha20的相关定义与函数------------------*/
#define ROTL32(v, n) (((v) << (n)) | ((v) >> (32 - (n))))
#define U32TO8_LITTLE(p, v) \
{ \
(p)[0] = (uint8_t)((v)); \
(p)[1] = (uint8_t)((v) >> 8); \
(p)[2] = (uint8_t)((v) >> 16); \
(p)[3] = (uint8_t)((v) >> 24); \
}
#define U8TO32_LITTLE(p) \
(((uint32_t)((p)[0])) | ((uint32_t)((p)[1]) << 8) | \
((uint32_t)((p)[2]) << 16) | ((uint32_t)((p)[3]) << 24))
// ChaCha的轮函数
#define QUARTERROUND(x, a, b, c, d) \
x[a] += x[b]; \
x[d] = ROTL32(x[d] ^ x[a], 16); \
x[c] += x[d]; \
x[b] = ROTL32(x[b] ^ x[c], 12); \
x[a] += x[b]; \
x[d] = ROTL32(x[d] ^ x[a], 8); \
x[c] += x[d]; \
x[b] = ROTL32(x[b] ^ x[c], 7);
void ChaCha20_block(uint32_t state[16], uint32_t output[16]);
void ChaCha20_setup(uint32_t state[16], const uint8_t key[32],
const uint8_t nonce[12], uint8_t counter[4]);
void ChaCha20_encrypt(uint32_t state[16], const uint8_t *in, uint8_t *out,
size_t length, bool increment_flag);
/*----------------------------------------------------*/
#endif