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 
   37 #include <sys/cdefs.h>
   38 __FBSDID("$FreeBSD$");
   39 
   40 #include <sys/param.h>
   41 #include <sys/kernel.h>
   42 #include <sys/module.h>
   43 #include <sys/types.h>
   44 #include <crypto/rc4/rc4.h>
   45 
   46 static __inline void
   47 swap_bytes(u_char *a, u_char *b)
   48 {
   49         u_char temp;
   50 
   51         temp = *a;
   52         *a = *b;
   53         *b = temp;
   54 }
   55 
   56 /*
   57  * Initialize an RC4 state buffer using the supplied key,
   58  * which can have arbitrary length.
   59  */
   60 void
   61 rc4_init(struct rc4_state *const state, const u_char *key, int keylen)
   62 {
   63         u_char j;
   64         int i, k;
   65 
   66         /* Initialize state with identity permutation */
   67         for (i = 0; i < 256; i++)
   68                 state->perm[i] = (u_char)i; 
   69         state->index1 = 0;
   70         state->index2 = 0;
   71   
   72         /* Randomize the permutation using key data */
   73         for (j = i = k = 0; i < 256; i++) {
   74                 j += state->perm[i] + key[k]; 
   75                 swap_bytes(&state->perm[i], &state->perm[j]);
   76                 if (++k >= keylen)
   77                         k = 0;
   78         }
   79 }
   80 
   81 /*
   82  * Encrypt some data using the supplied RC4 state buffer.
   83  * The input and output buffers may be the same buffer.
   84  * Since RC4 is a stream cypher, this function is used
   85  * for both encryption and decryption.
   86  */
   87 void
   88 rc4_crypt(struct rc4_state *const state,
   89         const u_char *inbuf, u_char *outbuf, int buflen)
   90 {
   91         int i;
   92         u_char j;
   93 
   94         for (i = 0; i < buflen; i++) {
   95 
   96                 /* Update modification indicies */
   97                 state->index1++;
   98                 state->index2 += state->perm[state->index1];
   99 
  100                 /* Modify permutation */
  101                 swap_bytes(&state->perm[state->index1],
  102                     &state->perm[state->index2]);
  103 
  104                 /* Encrypt/decrypt next byte */
  105                 j = state->perm[state->index1] + state->perm[state->index2];
  106                 outbuf[i] = inbuf[i] ^ state->perm[j];
  107         }
  108 }
  109 
  110 static int
  111 rc4_modevent(module_t mod, int type, void *unused)
  112 {
  113         switch (type) {
  114         case MOD_LOAD:
  115                 return 0;
  116         case MOD_UNLOAD:
  117                 return 0;
  118         }
  119         return EINVAL;
  120 }
  121 
  122 static moduledata_t rc4_mod = {
  123         "rc4",
  124         rc4_modevent,
  125         0
  126 };
  127 DECLARE_MODULE(rc4, rc4_mod, SI_SUB_DRIVERS, SI_ORDER_FIRST);
  128 MODULE_VERSION(rc4, 1);

Cache object: 4485a523079b486b162d8b8a5ab7ae6d


[ 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.