const u8 *plain_text,
size_t text_size)
{
- if (plain_text != 0) {
- // Align ourselves with a block
- while (ctx->pool_idx % 64 != 0 && text_size > 0) {
- *cipher_text = chacha20_pool_byte(ctx) ^ *plain_text;
+ // Align ourselves with a block
+ while (ctx->pool_idx % 64 != 0 && text_size > 0) {
+ u8 stream = chacha20_pool_byte(ctx);
+ u8 plain = 0;
+ if (plain_text != 0) {
+ plain = *plain_text;
plain_text++;
- cipher_text++;
- text_size--;
}
- // Main processing by 64 byte chunks
- size_t nb_blocks = text_size / 64;
- size_t remainder = text_size % 64;
- FOR (i, 0, nb_blocks) {
- chacha20_refill_pool(ctx);
+ *cipher_text = stream ^ plain;
+ text_size--;
+ cipher_text++;
+ }
+
+ // Main processing by 64 byte chunks
+ size_t nb_blocks = text_size / 64;
+ size_t remainder = text_size % 64;
+ FOR (i, 0, nb_blocks) {
+ chacha20_refill_pool(ctx);
+ if (plain_text != 0) {
FOR (j, 0, 16) {
- store32_le(cipher_text + j * 4,
- ctx->pool[j] ^ load32_le(plain_text));
+ u32 plain = load32_le(plain_text);
+ store32_le(cipher_text + j * 4, ctx->pool[j] ^ plain);
plain_text += 4;
}
- cipher_text += 64;
- }
- if (nb_blocks > 0) {
- ctx->pool_idx = 64;
- }
- // Remaining input, byte by byte
- FOR (i, 0, remainder) {
- if (ctx->pool_idx == 64) {
- chacha20_refill_pool(ctx);
- }
- *cipher_text = chacha20_pool_byte(ctx) ^ *plain_text;
- plain_text++;
- cipher_text++;
- }
- }
- else {
- // Align ourselves with a block
- while (ctx->pool_idx % 64 != 0 && text_size > 0) {
- *cipher_text = chacha20_pool_byte(ctx);
- cipher_text++;
- text_size--;
}
- // Main processing by 64 byte chunks
- size_t nb_blocks = text_size / 64;
- size_t remainder = text_size % 64;
- FOR (i, 0, nb_blocks) {
- chacha20_refill_pool(ctx);
+ else {
FOR (j, 0, 16) {
store32_le(cipher_text + j * 4, ctx->pool[j]);
}
- cipher_text += 64;
}
+ cipher_text += 64;
if (nb_blocks > 0) {
ctx->pool_idx = 64;
}
- // Remaining input, byte by byte
- FOR (i, 0, remainder) {
- if (ctx->pool_idx == 64) {
- chacha20_refill_pool(ctx);
- }
- *cipher_text = chacha20_pool_byte(ctx);
- cipher_text++;
+ }
+ // Remaining input, byte by byte
+ FOR (i, 0, remainder) {
+ if (ctx->pool_idx == 64) {
+ chacha20_refill_pool(ctx);
+ }
+ u8 plain = 0;
+ if (plain_text != 0) {
+ plain = *plain_text;
+ plain_text++;
}
+ *cipher_text = chacha20_pool_byte(ctx) ^ plain;
+ cipher_text++;
}
}