include/crypto/chacha.h

Source file repositories/reference/linux-study-clean/include/crypto/chacha.h

File Facts

System
Linux kernel
Corpus path
include/crypto/chacha.h
Extension
.h
Size
3076 bytes
Lines
103
Domain
Repository Root And Misc
Bucket
include
Inferred role
Repository Root And Misc: implementation source
Status
source implementation candidate

Why This File Exists

Top-level or miscellaneous repository surface. Use this as map coverage unless a later manual pass promotes the file into a deeper subsystem dossier.

Dependency Surface

Detected Declarations

Annotated Snippet

struct chacha_state {
	u32 x[CHACHA_STATE_WORDS];
};

void chacha_block_generic(struct chacha_state *state,
			  u8 out[at_least CHACHA_BLOCK_SIZE], int nrounds);
static inline void chacha20_block(struct chacha_state *state,
				  u8 out[at_least CHACHA_BLOCK_SIZE])
{
	chacha_block_generic(state, out, 20);
}

void hchacha_block_generic(const struct chacha_state *state,
			   u32 out[at_least HCHACHA_OUT_WORDS], int nrounds);

void hchacha_block(const struct chacha_state *state,
		   u32 out[at_least HCHACHA_OUT_WORDS], int nrounds);

enum chacha_constants { /* expand 32-byte k */
	CHACHA_CONSTANT_EXPA = 0x61707865U,
	CHACHA_CONSTANT_ND_3 = 0x3320646eU,
	CHACHA_CONSTANT_2_BY = 0x79622d32U,
	CHACHA_CONSTANT_TE_K = 0x6b206574U
};

static inline void chacha_init_consts(struct chacha_state *state)
{
	state->x[0]  = CHACHA_CONSTANT_EXPA;
	state->x[1]  = CHACHA_CONSTANT_ND_3;
	state->x[2]  = CHACHA_CONSTANT_2_BY;
	state->x[3]  = CHACHA_CONSTANT_TE_K;
}

static inline void chacha_init(struct chacha_state *state,
			       const u32 key[at_least CHACHA_KEY_WORDS],
			       const u8 iv[at_least CHACHA_IV_SIZE])
{
	chacha_init_consts(state);
	state->x[4]  = key[0];
	state->x[5]  = key[1];
	state->x[6]  = key[2];
	state->x[7]  = key[3];
	state->x[8]  = key[4];
	state->x[9]  = key[5];
	state->x[10] = key[6];
	state->x[11] = key[7];
	state->x[12] = get_unaligned_le32(iv +  0);
	state->x[13] = get_unaligned_le32(iv +  4);
	state->x[14] = get_unaligned_le32(iv +  8);
	state->x[15] = get_unaligned_le32(iv + 12);
}

void chacha_crypt(struct chacha_state *state, u8 *dst, const u8 *src,
		  unsigned int bytes, int nrounds);

static inline void chacha20_crypt(struct chacha_state *state,
				  u8 *dst, const u8 *src, unsigned int bytes)
{
	chacha_crypt(state, dst, src, bytes, 20);
}

static inline void chacha_zeroize_state(struct chacha_state *state)
{
	memzero_explicit(state, sizeof(*state));
}

#endif /* _CRYPTO_CHACHA_H */

Annotation

Implementation Notes