Skip to content
Snippets Groups Projects
Select Git revision
  • 5f88305e050a5a5366b51a39a34d9b4a69b1655e
  • master default protected
  • siv-mode
  • delete-des-compat
  • delete-rsa_blind
  • aes-struct-layout
  • master-updates
  • release-3.4-fixes
  • struct-layout
  • attribute-deprecated
  • rename-data-symbols
  • x86_64-sha_ni-sha256
  • ecc-params-tweak
  • delete-old-aes
  • cmac-support
  • x86_64-sha_ni-sha1
  • gcm-ctr-opt
  • ctr-opt
  • skein
  • api-opaque-fix
  • curve448
  • nettle_3.4.1_release_20181204
  • nettle_3.4.1rc1
  • nettle_3.4_release_20171119
  • nettle_3.4rc2
  • nettle_3.4rc1
  • nettle_3.3_release_20161001
  • nettle_3.2_release_20160128
  • nettle_3.1.1_release_20150424
  • nettle_3.1_release_20150407
  • nettle_3.1rc3
  • nettle_3.1rc2
  • nettle_3.1rc1
  • nettle_3.0_release_20140607
  • nettle_2.7.1_release_20130528
  • nettle_2.7_release_20130424
  • nettle_2.6_release_20130116
  • nettle_2.5_release_20120707
  • converted-master-branch-to-git
  • nettle_2.4_release_20110903
  • nettle_2.3_release_20110902
41 results

arcfour.c

Blame
  • Forked from Nettle / nettle
    4727 commits behind the upstream repository.
    Niels Möller's avatar
    Niels Möller authored
    Rev: src/symmetric/arcfour.c:1.3
    60a89fd5
    History
    arcfour.c 1.13 KiB
    /* arcfour.c
     *
     * This implements the Arcfour stream cipher with 128 bit keys. 
     *
     * The Arcfour cipher is believed to be compatible with the RC4 cipher. 
     * RC4 is a registered trademark of RSA Data Security Inc.
     *   
     */
    
    #include "arcfour.h"
    
    #ifdef RCSID
    RCSID("$Id$");
    #endif
    
    #define SWAP(a,b) do { int _t = a; a = b; b = _t; } while(0)
    
    void arcfour_set_key(struct arcfour_ctx *ctx, const UINT8 *key, UINT32 len)
    {
      register UINT8 j; /* Depends on the eight-bitness of these variables. */
      unsigned i;
      UINT32 k;
    
      /* Initialize context */
      i = 0;
      do ctx->S[i] = i; while (++i < 256);
    
      /* Expand key */
      i = j = k = 0;
      do {
        j += ctx->S[i] + key[k];
        SWAP(ctx->S[i], ctx->S[j]);
        k = (k+1) % len; /* Repeat key if needed */
      } while(++i < 256);
      
      ctx->i = ctx->j = 0;
    }
    
    void arcfour_crypt(struct arcfour_ctx *ctx, UINT8 *dest,
    		   const UINT8 *src, UINT32 len)
    {
      register UINT8 i, j;
    
      i = ctx->i; j = ctx->j;
      while(len--)
        {
          i++; i &= 0xff;
          j += ctx->S[i]; j &= 0xff;
          SWAP(ctx->S[i], ctx->S[j]);
          *dest++ = *src++ ^ ctx->S[ (ctx->S[i] + ctx->S[j]) & 0xff ];
        }
      ctx->i = i; ctx->j = j;
    }