Blame cbits/cryptonite_rc4.c
|
Packit |
141393 |
/* initial implementation by
|
|
Packit |
141393 |
* Peter White <peter@janrain.com>
|
|
Packit |
141393 |
*/
|
|
Packit |
141393 |
|
|
Packit |
141393 |
/* C Standard includes */
|
|
Packit |
141393 |
#include <stdlib.h>
|
|
Packit |
141393 |
#include <stdio.h>
|
|
Packit |
141393 |
#include <string.h>
|
|
Packit |
141393 |
#include <stdint.h>
|
|
Packit |
141393 |
|
|
Packit |
141393 |
/* Local include */
|
|
Packit |
141393 |
#include "cryptonite_rc4.h"
|
|
Packit |
141393 |
|
|
Packit |
141393 |
/* Swap array elements i=State[i] and b=State[j]. */
|
|
Packit |
141393 |
static void swap(uint8_t *i, uint8_t *j)
|
|
Packit |
141393 |
{
|
|
Packit |
141393 |
uint8_t temp;
|
|
Packit |
141393 |
|
|
Packit |
141393 |
temp = *i;
|
|
Packit |
141393 |
*i = *j;
|
|
Packit |
141393 |
*j = temp;
|
|
Packit |
141393 |
}
|
|
Packit |
141393 |
|
|
Packit |
141393 |
/* Key scheduling algorithm. Swap array elements based on the key. */
|
|
Packit |
141393 |
void cryptonite_rc4_init(uint8_t *key, uint32_t keylen, struct rc4_ctx *ctx)
|
|
Packit |
141393 |
{
|
|
Packit |
141393 |
uint32_t i, j;
|
|
Packit |
141393 |
memset(ctx, 0, sizeof(struct rc4_ctx));
|
|
Packit |
141393 |
|
|
Packit |
141393 |
/* initialize context */
|
|
Packit |
141393 |
for (i = 0; i < 256; i++)
|
|
Packit |
141393 |
ctx->state[i] = i;
|
|
Packit |
141393 |
for (i = j = 0; i < 256; i++) {
|
|
Packit |
141393 |
j = (j + ctx->state[i] + key[i % keylen]) % 256;
|
|
Packit |
141393 |
swap(&ctx->state[i], &ctx->state[j]);
|
|
Packit |
141393 |
}
|
|
Packit |
141393 |
}
|
|
Packit |
141393 |
|
|
Packit |
141393 |
/* Combine the stream generated by the rc4 with some input */
|
|
Packit |
141393 |
void cryptonite_rc4_combine(struct rc4_ctx *ctx, uint8_t *input, uint32_t len, uint8_t *output)
|
|
Packit |
141393 |
{
|
|
Packit |
141393 |
uint32_t i = ctx->i;
|
|
Packit |
141393 |
uint32_t j = ctx->j;
|
|
Packit |
141393 |
uint32_t m;
|
|
Packit |
141393 |
uint8_t si, sj;
|
|
Packit |
141393 |
|
|
Packit |
141393 |
/* The RC4 algorithm */
|
|
Packit |
141393 |
for (m = 0; m < len; m++) {
|
|
Packit |
141393 |
i = (i + 1) & 0xff;
|
|
Packit |
141393 |
si = ctx->state[i];
|
|
Packit |
141393 |
j = (j + si) & 0xff;
|
|
Packit |
141393 |
sj = ctx->state[j];
|
|
Packit |
141393 |
/* swap(&state[i], &state[j]); */
|
|
Packit |
141393 |
ctx->state[i] = sj;
|
|
Packit |
141393 |
ctx->state[j] = si;
|
|
Packit |
141393 |
/* Xor the key stream value into the input */
|
|
Packit |
141393 |
*output++ = *input++ ^ (ctx->state[(si + sj) & 0xff]);
|
|
Packit |
141393 |
}
|
|
Packit |
141393 |
|
|
Packit |
141393 |
/* Output new S-box indices */
|
|
Packit |
141393 |
ctx->i = i;
|
|
Packit |
141393 |
ctx->j = j;
|
|
Packit |
141393 |
}
|