Version v0.3.37 - Implement ChaCha20 nonce extension to support pads larger than 256GB
This commit is contained in:
@@ -129,8 +129,8 @@ int chacha20_block(const uint8_t key[32], uint32_t counter,
|
||||
return 0;
|
||||
}
|
||||
|
||||
int chacha20_encrypt(const uint8_t key[32], uint32_t counter,
|
||||
const uint8_t nonce[12], const uint8_t* input,
|
||||
int chacha20_encrypt(const uint8_t key[32], uint32_t counter,
|
||||
const uint8_t nonce[12], const uint8_t* input,
|
||||
uint8_t* output, size_t length) {
|
||||
uint8_t keystream[CHACHA20_BLOCK_SIZE];
|
||||
size_t offset = 0;
|
||||
@@ -161,3 +161,45 @@ int chacha20_encrypt(const uint8_t key[32], uint32_t counter,
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int chacha20_encrypt_extended(const uint8_t key[32], uint32_t counter_low,
|
||||
uint32_t counter_high, const uint8_t nonce[8],
|
||||
const uint8_t* input, uint8_t* output, size_t length) {
|
||||
uint8_t keystream[CHACHA20_BLOCK_SIZE];
|
||||
uint8_t extended_nonce[12];
|
||||
size_t offset = 0;
|
||||
|
||||
while (length > 0) {
|
||||
/* Build extended 12-byte nonce: [counter_high (4 bytes)][nonce (8 bytes)] */
|
||||
u32_to_bytes_le(counter_high, extended_nonce);
|
||||
memcpy(extended_nonce + 4, nonce, 8);
|
||||
|
||||
/* Generate keystream block using extended nonce */
|
||||
int ret = chacha20_block(key, counter_low, extended_nonce, keystream);
|
||||
if (ret != 0) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* XOR with input to produce output */
|
||||
size_t block_len = (length < CHACHA20_BLOCK_SIZE) ? length : CHACHA20_BLOCK_SIZE;
|
||||
for (size_t i = 0; i < block_len; i++) {
|
||||
output[offset + i] = input[offset + i] ^ keystream[i];
|
||||
}
|
||||
|
||||
/* Move to next block */
|
||||
offset += block_len;
|
||||
length -= block_len;
|
||||
counter_low++;
|
||||
|
||||
/* Check for counter_low overflow and increment counter_high */
|
||||
if (counter_low == 0) {
|
||||
counter_high++;
|
||||
/* Check for counter_high overflow (extremely unlikely - > 1 exabyte) */
|
||||
if (counter_high == 0) {
|
||||
return -1; /* Extended counter wrapped around */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user