The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/crypto/rc4/rc4.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*
    2  * rc4.c
    3  *
    4  * Copyright (c) 1996-2000 Whistle Communications, Inc.
    5  * All rights reserved.
    6  * 
    7  * Subject to the following obligations and disclaimer of warranty, use and
    8  * redistribution of this software, in source or object code forms, with or
    9  * without modifications are expressly permitted by Whistle Communications;
   10  * provided, however, that:
   11  * 1. Any and all reproductions of the source or object code must include the
   12  *    copyright notice above and the following disclaimer of warranties; and
   13  * 2. No rights are granted, in any manner or form, to use Whistle
   14  *    Communications, Inc. trademarks, including the mark "WHISTLE
   15  *    COMMUNICATIONS" on advertising, endorsements, or otherwise except as
   16  *    such appears in the above copyright notice or in the software.
   17  * 
   18  * THIS SOFTWARE IS BEING PROVIDED BY WHISTLE COMMUNICATIONS "AS IS", AND
   19  * TO THE MAXIMUM EXTENT PERMITTED BY LAW, WHISTLE COMMUNICATIONS MAKES NO
   20  * REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, REGARDING THIS SOFTWARE,
   21  * INCLUDING WITHOUT LIMITATION, ANY AND ALL IMPLIED WARRANTIES OF
   22  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.
   23  * WHISTLE COMMUNICATIONS DOES NOT WARRANT, GUARANTEE, OR MAKE ANY
   24  * REPRESENTATIONS REGARDING THE USE OF, OR THE RESULTS OF THE USE OF THIS
   25  * SOFTWARE IN TERMS OF ITS CORRECTNESS, ACCURACY, RELIABILITY OR OTHERWISE.
   26  * IN NO EVENT SHALL WHISTLE COMMUNICATIONS BE LIABLE FOR ANY DAMAGES
   27  * RESULTING FROM OR ARISING OUT OF ANY USE OF THIS SOFTWARE, INCLUDING
   28  * WITHOUT LIMITATION, ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
   29  * PUNITIVE, OR CONSEQUENTIAL DAMAGES, PROCUREMENT OF SUBSTITUTE GOODS OR
   30  * SERVICES, LOSS OF USE, DATA OR PROFITS, HOWEVER CAUSED AND UNDER ANY
   31  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   32  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
   33  * THIS SOFTWARE, EVEN IF WHISTLE COMMUNICATIONS IS ADVISED OF THE POSSIBILITY
   34  * OF SUCH DAMAGE.
   35  *
   36  * $FreeBSD: src/sys/crypto/rc4/rc4.c,v 1.6 2008/12/16 13:58:37 mav Exp $
   37  */
   38 
   39 #include <sys/kernel.h>
   40 #include <sys/module.h>
   41 #include <sys/types.h>
   42 #include <crypto/rc4/rc4.h>
   43 
   44 static __inline void
   45 swap_bytes(u_char *a, u_char *b)
   46 {
   47         u_char temp;
   48 
   49         temp = *a;
   50         *a = *b;
   51         *b = temp;
   52 }
   53 
   54 /*
   55  * Initialize an RC4 state buffer using the supplied key,
   56  * which can have arbitrary length.
   57  */
   58 void
   59 rc4_init(struct rc4_state *const state, const u_char *key, int keylen)
   60 {
   61         u_char j;
   62         int i, k;
   63 
   64         /* Initialize state with identity permutation */
   65         for (i = 0; i < 256; i++)
   66                 state->perm[i] = (u_char)i; 
   67         state->index1 = 0;
   68         state->index2 = 0;
   69   
   70         /* Randomize the permutation using key data */
   71         for (j = i = k = 0; i < 256; i++) {
   72                 j += state->perm[i] + key[k];
   73                 swap_bytes(&state->perm[i], &state->perm[j]);
   74                 if (++k >= keylen)
   75                         k = 0;
   76         }
   77 }
   78 
   79 /*
   80  * Encrypt some data using the supplied RC4 state buffer.
   81  * The input and output buffers may be the same buffer.
   82  * Since RC4 is a stream cypher, this function is used
   83  * for both encryption and decryption.
   84  */
   85 void
   86 rc4_crypt(struct rc4_state *const state,
   87         const u_char *inbuf, u_char *outbuf, int buflen)
   88 {
   89         int i;
   90         u_char j;
   91 
   92         for (i = 0; i < buflen; i++) {
   93 
   94                 /* Update modification indicies */
   95                 state->index1++;
   96                 state->index2 += state->perm[state->index1];
   97 
   98                 /* Modify permutation */
   99                 swap_bytes(&state->perm[state->index1],
  100                     &state->perm[state->index2]);
  101 
  102                 /* Encrypt/decrypt next byte */
  103                 j = state->perm[state->index1] + state->perm[state->index2];
  104                 outbuf[i] = inbuf[i] ^ state->perm[j];
  105         }
  106 }
  107 
  108 static int
  109 rc4_modevent(module_t mod, int type, void *unused)
  110 {
  111         switch (type) {
  112         case MOD_LOAD:
  113                 return 0;
  114         case MOD_UNLOAD:
  115                 return 0;
  116         }
  117         return EINVAL;
  118 }
  119 
  120 static moduledata_t rc4_mod = {
  121         "rc4",
  122         rc4_modevent,
  123         0
  124 };
  125 DECLARE_MODULE(rc4, rc4_mod, SI_SUB_DRIVERS, SI_ORDER_FIRST);
  126 MODULE_VERSION(rc4, 1);

Cache object: 5469675942fd113e59c696988e789626


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.