download arctwo.c
Language: C
License: GPL
Copyright: (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
LOC: 164
Project Info
gnulib - portability library(gnulib)
Server: Savannah GNU
Type: cvs
...g\gnulib\gnulib\gnulib\lib\
   .cppi-disable
   .cvsignore
   __fpending.c
   __fpending.h
   acl-internal.h
   acl.c
   acl.h
   acl_entries.c
   acosl.c
   alloca.c
   alloca_.h
   arcfour.c
   arcfour.h
   arctwo.c
   arctwo.h
   areadlink-with-size.c
   areadlink.h
   argmatch.c
   argmatch.h
   argp-ba.c
   argp-eexst.c
   argp-fmtstream.c
   argp-fmtstream.h
   argp-fs-xinl.c
   argp-help.c
   argp-namefrob.h
   argp-parse.c
   argp-pin.c
   argp-pv.c
   argp-pvh.c
   argp-xinl.c
   argp.h
   argz.c
   argz_.h
   asinl.c
   asnprintf.c
   asprintf.c
   at-func.c
   atanl.c
   atexit.c
   backupfile.c
   backupfile.h
   base64.c
   base64.h
   basename.c
   bcopy.c
   binary-io.h
   byteswap_.h
   c-ctype.c
   c-ctype.h
   c-stack.c
   c-stack.h
   c-strcase.h
   c-strcasecmp.c
   c-strcaseeq.h
   c-strcasestr.c
   c-strcasestr.h
   c-strncasecmp.c
   c-strstr.c
   c-strstr.h
   c-strtod.c
   c-strtod.h
   c-strtold.c
   calloc.c
   canon-host.c
   canon-host.h
   canonicalize-lgpl.c
   canonicalize.c
   canonicalize.h
   ceill.c
   chdir-long.c
   chdir-long.h
   chdir-safer.c
   chdir-safer.h
   check-version.c
   check-version.h
   chown.c
   classpath.c
   classpath.h
   clean-temp.c
   clean-temp.h
   cloexec.c
   cloexec.h
   close-stream.c
   close-stream.h
   closein.c
   closein.h
   closeout.c
   closeout.h
   concat-filename.c
   config.charset
   copy-file.c
   copy-file.h
   cosl.c
   count-one-bits.h
   crc.c
   crc.h
   creat-safer.c
   csharpcomp.c
   csharpcomp.h
   csharpexec.c
   csharpexec.h
   cycle-check.c
   cycle-check.h
   des.c
   des.h
   dev-ino.h
   diacrit.c
   diacrit.h
   diffseq.h
   dirchownmod.c
   dirchownmod.h
   dirent_.h
   dirfd.c
   dirfd.h
   dirname.c
   dirname.h
   dummy.c
   dup-safer.c
   dup2.c
   eealloc.h
   error.c
   error.h
   euidaccess.c
   euidaccess.h
   exclude.c
   exclude.h
   execute.c
   execute.h
   exitfail.c
   exitfail.h
   expl.c
   fatal-signal.c
   fatal-signal.h
   fbufmode.c
   fbufmode.h
   fchdir.c
   fchmodat.c
   fchown-stub.c
   fchownat.c
   fcntl--.h
   fcntl-safer.h
   fcntl_.h
   fd-safer.c
   fflush.c
   file-has-acl.c
   file-type.c
   file-type.h
   fileblocks.c
   filemode.c
   filemode.h
   filename.h
   filenamecat.c
   filenamecat.h
   findprog.c
   findprog.h
   float+.h
   float_.h
   floorl.c
   fnmatch.c
   fnmatch_.h
   fnmatch_loop.c
   fopen-safer.c
   fprintf.c
   fprintftime.c
   fprintftime.h
   fpucw.h
   fpurge.c
   fpurge.h
   freadable.c
   freadable.h
   freadahead.c
   freadahead.h
   freading.c
   freading.h
   free.c
   frexp.c
   frexpl.c
   fseek.c
   fseeko.c
   fseterr.c
   fseterr.h
   fstatat.c
   fstrcmp.c
   fstrcmp.h
   fsusage.c
   fsusage.h
   ftell.c
   ftello.c
   ftruncate.c
   fts-cycle.c
   fts.c
   fts_.h
   full-read.c
   full-read.h
   full-write.c
   full-write.h
   fwritable.c
   fwritable.h
   fwriteerror.c
   fwriteerror.h
   fwriting.c
   fwriting.h
   gai_strerror.c
   gc-gnulib.c
   gc-libgcrypt.c
   gc-pbkdf2-sha1.c
   gc.h
   gcd.c
   gcd.h
   getaddrinfo.c
   getaddrinfo.h
   getcwd.c
   getdate.h
   getdate.y
   getdelim.c
   getdomainname.c
   getdomainname.h
   getgroups.c
   gethostname.c
   gethrxtime.c
   gethrxtime.h
   getline.c
   getloadavg.c
   getlogin_r.c
   getndelim2.c
   getndelim2.h
   getnline.c
   getnline.h
   getopt.c
   getopt_.h
   getopt_int.h
   getopt1.c
   getpagesize.h
   getpass.c
   getpass.h
   getsubopt.c
   gettext.h
   gettime.c
   gettimeofday.c
   getugroups.c
   getugroups.h
   getusershell.c
   gl_anyavltree_list1.h
   gl_anyavltree_list2.h
   gl_anyhash_list1.h
   gl_anyhash_list2.h
   gl_anylinked_list1.h
   gl_anylinked_list2.h
   gl_anyrbtree_list1.h
   gl_anyrbtree_list2.h
   gl_anytree_list1.h
   gl_anytree_list2.h
   gl_anytree_oset.h
   gl_anytreehash_list1.h
   gl_anytreehash_list2.h
   gl_array_list.c
   gl_array_list.h
   gl_array_oset.c
   gl_array_oset.h
   gl_avltree_list.c
   gl_avltree_list.h
   gl_avltree_oset.c
   gl_avltree_oset.h
   gl_avltreehash_list.c
   gl_avltreehash_list.h
   gl_carray_list.c
   gl_carray_list.h
   gl_linked_list.c
   gl_linked_list.h
   gl_linkedhash_list.c
   gl_linkedhash_list.h
   gl_list.c
   gl_list.h
   gl_oset.c
   gl_oset.h
   gl_rbtree_list.c
   gl_rbtree_list.h
   gl_rbtree_oset.c
   gl_rbtree_oset.h
   gl_rbtreehash_list.c
   gl_rbtreehash_list.h
   gl_sublist.c
   gl_sublist.h
   glob-libc.h
   glob.c
   glob_.h
   group-member.c
   group-member.h
   hard-locale.c
   hard-locale.h
   hash-pjw.c
   hash-pjw.h
   hash.c
   hash.h
   hmac-md5.c
   hmac-sha1.c
   hmac.h
   human.c
   human.h
   i-ring-test.c
   i-ring.c
   i-ring.h
   iconv_.h
   iconv_open-aix.gperf
   iconv_open-hpux.gperf
   iconv_open-irix.gperf
   iconv_open-osf.gperf
   iconv_open.c
   idcache.c
   idcache.h
   imaxabs.c
   imaxdiv.c
   imaxtostr.c
   inet_ntop.c
   inet_ntop.h
   inet_pton.c
   inet_pton.h
   intprops.h
   inttostr.c
   inttostr.h
   inttypes_.h
   isapipe.c
   isapipe.h
   isdir.c
   isnan.c
   isnan.h
   isnanf.c
   isnanf.h
   isnanl-nolibm.h
   isnanl.c
   isnanl.h
   javacomp.c
   javacomp.h
   javaexec.c
   javaexec.h
   javaversion.c
   javaversion.h
   javaversion.java
   lbrkprop.h
   lchmod.h
   lchown.c
   ldexpl.c
   linebreak.c
   linebreak.h
   linebuffer.c
   linebuffer.h
   localcharset.c
   localcharset.h
   locale_.h
   localename.c
   localename.h
   lock.c
   lock.h
   logl.c
   long-options.c
   long-options.h
   lseek.c
   lstat.c
   lstat.h
   malloc.c
   malloca.c
   malloca.h
   malloca.valgrind
   math_.h
   mbchar.c
   mbchar.h
   mbfile.h
   mbiter.h
   mbscasecmp.c
   mbscasestr.c
   mbschr.c
   mbscspn.c
   mbslen.c
   mbsncasecmp.c
   mbsnlen.c
   mbspbrk.c
   mbspcasecmp.c
   mbsrchr.c
   mbssep.c
   mbsspn.c
   mbsstr.c
   mbstok_r.c
   mbswidth.c
   mbswidth.h
   mbuiter.h
   md2.c
   md2.h
   md4.c
   md4.h
   md5.c
   md5.h
   memcasecmp.c
   memcasecmp.h
   memchr.c
   memcmp.c
   memcoll.c
   memcoll.h
   memcpy.c
   memmem.c
   memmove.c
   mempcpy.c
   memrchr.c
   memset.c
   memxor.c
   memxor.h
   minmax.h
   mkancesdirs.c
   mkancesdirs.h
   mkdir-p.c
   mkdir-p.h
   mkdir.c
   mkdirat.c
   mkdtemp.c
   mkstemp-safer.c
   mkstemp.c
   mktime.c
   modechange.c
   modechange.h
   mountlist.c
   mountlist.h
   mpsort.c
   mpsort.h
   nanosleep.c
   netinet_in_.h
   obstack.c
   obstack.h
   offtostr.c
   open-safer.c
   openat-die.c
   openat-priv.h
   openat-proc.c
   openat.c
   openat.h
   pagealign_alloc.c
   pagealign_alloc.h
   pathmax.h
   physmem.c
   physmem.h
   pipe-safer.c
   pipe.c
   pipe.h
   poll.c
   poll_.h
   posixtm.c
   posixtm.h
   posixver.c
   posixver.h
   printf-args.c
   printf-args.h
   printf-frexp.c
   printf-frexp.h
   printf-frexpl.c
   printf-frexpl.h
   printf-parse.c
   printf-parse.h
   printf.c
   progname.c
   progname.h
   progreloc.c
   putenv.c
   quote.c
   quote.h
   quotearg.c
   quotearg.h
   raise.c
   read-file.c
   read-file.h
   readline.c
   readline.h
   readlink.c
   readtokens.c
   readtokens.h
   readtokens0.c
   readtokens0.h
   readutmp.c
   readutmp.h
   realloc.c
   ref-add.sin
   ref-del.sin
   regcomp.c
   regex.c
   regex.h
   regex_internal.c
   regex_internal.h
   regexec.c
   relocatable.c
   relocatable.h
   relocwrapper.c
   rename-dest-slash.c
   rename.c
   rijndael-alg-fst.c
   rijndael-alg-fst.h
   rijndael-api-fst.c
   rijndael-api-fst.h
   rmdir.c
   rpmatch.c
   safe-read.c
   safe-read.h
   safe-write.c
   safe-write.h
   same-inode.h
   same.c
   same.h
   save-cwd.c
   save-cwd.h
   savedir.c
   savedir.h
   savewd.c
   savewd.h
   search_.h
   setenv.c
   setenv.h
   settime.c
   sh-quote.c
   sh-quote.h
   sha1.c
   sha1.h
   sig2str.c
   sig2str.h
   signal_.h
   signbitd.c
   signbitf.c
   signbitl.c
   sigprocmask.c
   sincosl.c
   sinl.c
   size_max.h
   sleep.c
   snprintf.c
   sprintf.c
   sqrtl.c
   stat-macros.h
   stat-time.h
   stdbool_.h
   stdint_.h
   stdio--.h
   stdio-safer.h
   stdio_.h
   stdlib--.h
   stdlib-safer.h
   stdlib_.h
   stpcpy.c
   stpncpy.c
   strcasecmp.c
   strcasestr.c
   strchrnul.c
   strcspn.c
   strdup.c
   streq.h
   strerror.c
   strftime.c
   strftime.h
   striconv.c
   striconv.h
   striconveh.c
   striconveh.h
   striconveha.c
   striconveha.h
   string_.h
   stripslash.c
   strncasecmp.c
   strndup.c
   strnlen.c
   strnlen1.c
   strnlen1.h
   strpbrk.c
   strptime.c
   strsep.c
   strtod.c
   strtoimax.c
   strtok_r.c
   strtol.c
   strtoll.c
   strtoul.c
   strtoull.c
   strtoumax.c
   strverscmp.c
   strverscmp.h
   sys_select_.h
   sys_socket_.h
   sys_stat_.h
   sys_time_.h
   sysexits_.h
   tanl.c
   tempname.c
   tempname.h
   time_.h
   time_r.c
   timegm.c
   timespec.h
   tls.c
   tls.h
   tmpdir.c
   tmpdir.h
   tmpfile-safer.c
   tmpfile.c
   trigl.c
   trigl.h
   trim.c
   trim.h
   tsearch.c
   uinttostr.c
   umaxtostr.c
   unicodeio.c
   unicodeio.h
   uniconv.h
   uniname.h
   unistd--.h
   unistd-safer.h
   unistd_.h
   unistdio.h
   unistr.h
   unitypes.h
   uniwidth.h
   unlinkdir.c
   unlinkdir.h
   unlocked-io.h
   unsetenv.c
   userspec.c
   userspec.h
   utime.c
   utimecmp.c
   utimecmp.h
   utimens.c
   utimens.h
   vasnprintf.c
   vasnprintf.h
   vasprintf.c
   verify.h
   verror.c
   verror.h
   version-etc-fsf.c
   version-etc.c
   version-etc.h
   vfprintf.c
   vprintf.c
   vsnprintf.c
   vsprintf.c
   w32spawn.h
   wait-process.c
   wait-process.h
   wchar_.h
   wctype_.h
   wcwidth.c
   write-any-file.c
   write-any-file.h
   xalloc-die.c
   xalloc.h
   xasprintf.c
   xgetcwd.c
   xgetcwd.h
   xgetdomainname.c
   xgetdomainname.h
   xgethostname.c
   xgethostname.h
   xmalloc.c
   xmalloca.c
   xmalloca.h
   xmemcoll.c
   xmemcoll.h
   xnanosleep.c
   xnanosleep.h
   xreadlink.c
   xreadlink.h
   xsetenv.c
   xsetenv.h
   xsize.h
   xstriconv.c
   xstriconv.h
   xstrndup.c
   xstrndup.h
   xstrtod.c
   xstrtod.h
   xstrtoimax.c
   xstrtol-error.c
   xstrtol.c
   xstrtol.h
   xstrtold.c
   xstrtoul.c
   xstrtoumax.c
   xtime.h
   xvasprintf.c
   xvasprintf.h
   yesno.c
   yesno.h

/* arctwo.c --- The RC2 cipher as described in RFC 2268.
 * Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
 *
 * This file is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published
 * by the Free Software Foundation; either version 2, or (at your
 * option) any later version.
 *
 * This file is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this file; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 * 02110-1301, USA.
 */

/* Code from GnuTLS/Libgcrypt adapted for gnulib by Simon Josefsson. */

/* This implementation was written by Nikos Mavroyanopoulos for GNUTLS
 * as a Libgcrypt module (gnutls/lib/x509/rc2.c) and later adapted for
 * direct use by Libgcrypt by Werner Koch.  This implementation is
 * only useful for pkcs#12 decryption.
 *
 * The implementation here is based on Peter Gutmann's RRC.2 paper.
 */

#include <config.h>

#include "arctwo.h"

static const uint8_t arctwo_sbox[] = {
  217, 120, 249, 196, 25, 221, 181, 237,
  40, 233, 253, 121, 74, 160, 216, 157,
  198, 126, 55, 131, 43, 118, 83, 142,
  98, 76, 100, 136, 68, 139, 251, 162,
  23, 154, 89, 245, 135, 179, 79, 19,
  97, 69, 109, 141, 9, 129, 125, 50,
  189, 143, 64, 235, 134, 183, 123, 11,
  240, 149, 33, 34, 92, 107, 78, 130,
  84, 214, 101, 147, 206, 96, 178, 28,
  115, 86, 192, 20, 167, 140, 241, 220,
  18, 117, 202, 31, 59, 190, 228, 209,
  66, 61, 212, 48, 163, 60, 182, 38,
  111, 191, 14, 218, 70, 105, 7, 87,
  39, 242, 29, 155, 188, 148, 67, 3,
  248, 17, 199, 246, 144, 239, 62, 231,
  6, 195, 213, 47, 200, 102, 30, 215,
  8, 232, 234, 222, 128, 82, 238, 247,
  132, 170, 114, 172, 53, 77, 106, 42,
  150, 26, 210, 113, 90, 21, 73, 116,
  75, 159, 208, 94, 4, 24, 164, 236,
  194, 224, 65, 110, 15, 81, 203, 204,
  36, 145, 175, 80, 161, 244, 112, 57,
  153, 124, 58, 133, 35, 184, 180, 122,
  252, 2, 54, 91, 37, 85, 151, 49,
  45, 93, 250, 152, 227, 138, 146, 174,
  5, 223, 41, 16, 103, 108, 186, 201,
  211, 0, 230, 207, 225, 158, 168, 44,
  99, 22, 1, 63, 88, 226, 137, 169,
  13, 56, 52, 27, 171, 51, 255, 176,
  187, 72, 12, 95, 185, 177, 205, 46,
  197, 243, 219, 71, 229, 165, 156, 119,
  10, 166, 32, 104, 254, 127, 193, 173
};

#define rotl16(x,n)   (((x) << ((uint16_t)(n))) | ((x) >> (16 - (uint16_t)(n))))
#define rotr16(x,n)   (((x) >> ((uint16_t)(n))) | ((x) << (16 - (uint16_t)(n))))

/* C89 compliant way to cast 'char' to 'unsigned char'. */
static inline unsigned char
to_uchar (char ch)
{
  return ch;
}

void
arctwo_encrypt (arctwo_context *context, const char *inbuf,
		char *outbuf, size_t length)
{
  for (; length >= ARCTWO_BLOCK_SIZE; length -= ARCTWO_BLOCK_SIZE,
	 inbuf += ARCTWO_BLOCK_SIZE, outbuf += ARCTWO_BLOCK_SIZE)
    {
      size_t i, j;
      uint16_t word0 = 0, word1 = 0, word2 = 0, word3 = 0;

      word0 = (word0 << 8) | to_uchar (inbuf[1]);
      word0 = (word0 << 8) | to_uchar (inbuf[0]);
      word1 = (word1 << 8) | to_uchar (inbuf[3]);
      word1 = (word1 << 8) | to_uchar (inbuf[2]);
      word2 = (word2 << 8) | to_uchar (inbuf[5]);
      word2 = (word2 << 8) | to_uchar (inbuf[4]);
      word3 = (word3 << 8) | to_uchar (inbuf[7]);
      word3 = (word3 << 8) | to_uchar (inbuf[6]);

      for (i = 0; i < 16; i++)
	{
	  j = i * 4;
	  /* For some reason I cannot combine those steps. */
	  word0 += (word1 & ~word3) + (word2 & word3) + context->S[j];
	  word0 = rotl16 (word0, 1);

	  word1 += (word2 & ~word0) + (word3 & word0) + context->S[j + 1];
	  word1 = rotl16 (word1, 2);

	  word2 += (word3 & ~word1) + (word0 & word1) + context->S[j + 2];
	  word2 = rotl16 (word2, 3);

	  word3 += (word0 & ~word2) + (word1 & word2) + context->S[j + 3];
	  word3 = rotl16 (word3, 5);

	  if (i == 4 || i == 10)
	    {
	      word0 += context->S[word3 & 63];
	      word1 += context->S[word0 & 63];
	      word2 += context->S[word1 & 63];
	      word3 += context->S[word2 & 63];
	    }
	}

      outbuf[0] = word0 & 255;
      outbuf[1] = word0 >> 8;
      outbuf[2] = word1 & 255;
      outbuf[3] = word1 >> 8;
      outbuf[4] = word2 & 255;
      outbuf[5] = word2 >> 8;
      outbuf[6] = word3 & 255;
      outbuf[7] = word3 >> 8;
    }
}

void
arctwo_decrypt (arctwo_context *context, const char *inbuf,
		char *outbuf, size_t length)
{
  for (; length >= ARCTWO_BLOCK_SIZE; length -= ARCTWO_BLOCK_SIZE,
	 inbuf += ARCTWO_BLOCK_SIZE, outbuf += ARCTWO_BLOCK_SIZE)
    {
      size_t i, j;
      uint16_t word0 = 0, word1 = 0, word2 = 0, word3 = 0;

      word0 = (word0 << 8) | to_uchar (inbuf[1]);
      word0 = (word0 << 8) | to_uchar (inbuf[0]);
      word1 = (word1 << 8) | to_uchar (inbuf[3]);
      word1 = (word1 << 8) | to_uchar (inbuf[2]);
      word2 = (word2 << 8) | to_uchar (inbuf[5]);
      word2 = (word2 << 8) | to_uchar (inbuf[4]);
      word3 = (word3 << 8) | to_uchar (inbuf[7]);
      word3 = (word3 << 8) | to_uchar (inbuf[6]);

      for (i = 16; i > 0; i--)
	{
	  j = (i - 1) * 4;

	  word3 = rotr16 (word3, 5);
	  word3 -= (word0 & ~word2) + (word1 & word2) + context->S[j + 3];

	  word2 = rotr16 (word2, 3);
	  word2 -= (word3 & ~word1) + (word0 & word1) + context->S[j + 2];

	  word1 = rotr16 (word1, 2);
	  word1 -= (word2 & ~word0) + (word3 & word0) + context->S[j + 1];

	  word0 = rotr16 (word0, 1);
	  word0 -= (word1 & ~word3) + (word2 & word3) + context->S[j];

	  if (i == 6 || i == 12)
	    {
	      word3 = word3 - context->S[word2 & 63];
	      word2 = word2 - context->S[word1 & 63];
	  word1 = word1 - context->S[word0 & 63];
	  word0 = word0 - context->S[word3 & 63];
	    }
	}

      outbuf[0] = word0 & 255;
      outbuf[1] = word0 >> 8;
      outbuf[2] = word1 & 255;
      outbuf[3] = word1 >> 8;
      outbuf[4] = word2 & 255;
      outbuf[5] = word2 >> 8;
      outbuf[6] = word3 & 255;
      outbuf[7] = word3 >> 8;
    }
}

void
arctwo_setkey_ekb (arctwo_context *context,
		   size_t keylen, const char *key, size_t effective_keylen)
{
  size_t i;
  uint8_t *S, x;

  if (keylen < 40 / 8 || effective_keylen > 1024)
    return;

  S = (uint8_t *) context->S;

  for (i = 0; i < keylen; i++)
    S[i] = (uint8_t) key[i];

  for (i = keylen; i < 128; i++)
    S[i] = arctwo_sbox[(S[i - keylen] + S[i - 1]) & 255];

  S[0] = arctwo_sbox[S[0]];

  /* Phase 2 - reduce effective key size to "bits". This was not
   * discussed in Gutmann's paper. I've copied that from the public
   * domain code posted in sci.crypt. */
  if (effective_keylen)
    {
      size_t len = (effective_keylen + 7) >> 3;
      i = 128 - len;
      x = arctwo_sbox[S[i] & (255 >> (7 & -effective_keylen))];
      S[i] = x;

      while (i--)
	{
	  x = arctwo_sbox[x ^ S[i + len]];
	  S[i] = x;
	}
    }

  /* Make the expanded key, endian independent. */
  for (i = 0; i < 64; i++)
    context->S[i] = ((uint16_t) S[i * 2] | (((uint16_t) S[i * 2 + 1]) << 8));
}

About Koders | Resources | Downloads | Support | Black Duck | Submit Project | Terms of Service | DMCA | Privacy Policy | Site Map| Contact Us