root/maint/gnulib/lib/arcfour.c

/* [previous][next][first][last][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. arcfour_stream
  2. arcfour_setkey

   1 /* arcfour.c --- The arcfour stream cipher
   2  * Copyright (C) 2000-2003, 2005-2006, 2009-2021 Free Software Foundation, Inc.
   3  *
   4  * This file is free software: you can redistribute it and/or modify
   5  * it under the terms of the GNU Lesser General Public License as
   6  * published by the Free Software Foundation; either version 2.1 of the
   7  * License, or (at your option) any later version.
   8  *
   9  * This file is distributed in the hope that it will be useful,
  10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12  * GNU Lesser General Public License for more details.
  13  *
  14  * You should have received a copy of the GNU Lesser General Public License
  15  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  16  *
  17  */
  18 
  19 /* Code from Libgcrypt adapted for gnulib by Simon Josefsson. */
  20 
  21 /*
  22  * For a description of the algorithm, see:
  23  *   Bruce Schneier: Applied Cryptography. John Wiley & Sons, 1996.
  24  *   ISBN 0-471-11709-9. Pages 397 ff.
  25  */
  26 
  27 #include <config.h>
  28 
  29 #include "arcfour.h"
  30 
  31 void
  32 arcfour_stream (arcfour_context * context, const char *inbuf, char *outbuf,
     /* [previous][next][first][last][top][bottom][index][help] */
  33                 size_t length)
  34 {
  35   uint8_t i = context->idx_i;
  36   uint8_t j = context->idx_j;
  37   char *sbox = context->sbox;
  38 
  39   for (; length > 0; length--)
  40     {
  41       char t;
  42 
  43       i++;
  44       j += sbox[i];
  45       t = sbox[i];
  46       sbox[i] = sbox[j];
  47       sbox[j] = t;
  48       *outbuf++ = (*inbuf++
  49                    ^ sbox[(0U + sbox[i] + sbox[j]) % ARCFOUR_SBOX_SIZE]);
  50     }
  51 
  52   context->idx_i = i;
  53   context->idx_j = j;
  54 }
  55 
  56 void
  57 arcfour_setkey (arcfour_context * context, const char *key, size_t keylen)
     /* [previous][next][first][last][top][bottom][index][help] */
  58 {
  59   size_t i, j, k;
  60   char *sbox = context->sbox;
  61 
  62   context->idx_i = context->idx_j = 0;
  63   for (i = 0; i < ARCFOUR_SBOX_SIZE; i++)
  64     sbox[i] = i;
  65   for (i = j = k = 0; i < ARCFOUR_SBOX_SIZE; i++)
  66     {
  67       char t;
  68       j = (j + sbox[i] + key[k]) % ARCFOUR_SBOX_SIZE;
  69       t = sbox[i];
  70       sbox[i] = sbox[j];
  71       sbox[j] = t;
  72       if (++k == keylen)
  73         k = 0;
  74     }
  75 }

/* [previous][next][first][last][top][bottom][index][help] */