os/ossrv/ssl/libcrypto/src/crypto/des/ede_cbcm_enc.c
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 /* ede_cbcm_enc.c */
     2 /* Written by Ben Laurie <ben@algroup.co.uk> for the OpenSSL
     3  * project 13 Feb 1999.
     4  */
     5 /* ====================================================================
     6  * Copyright (c) 1999 The OpenSSL Project.  All rights reserved.
     7  *
     8  * Redistribution and use in source and binary forms, with or without
     9  * modification, are permitted provided that the following conditions
    10  * are met:
    11  *
    12  * 1. Redistributions of source code must retain the above copyright
    13  *    notice, this list of conditions and the following disclaimer. 
    14  *
    15  * 2. Redistributions in binary form must reproduce the above copyright
    16  *    notice, this list of conditions and the following disclaimer in
    17  *    the documentation and/or other materials provided with the
    18  *    distribution.
    19  *
    20  * 3. All advertising materials mentioning features or use of this
    21  *    software must display the following acknowledgment:
    22  *    "This product includes software developed by the OpenSSL Project
    23  *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
    24  *
    25  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
    26  *    endorse or promote products derived from this software without
    27  *    prior written permission. For written permission, please contact
    28  *    licensing@OpenSSL.org.
    29  *
    30  * 5. Products derived from this software may not be called "OpenSSL"
    31  *    nor may "OpenSSL" appear in their names without prior written
    32  *    permission of the OpenSSL Project.
    33  *
    34  * 6. Redistributions of any form whatsoever must retain the following
    35  *    acknowledgment:
    36  *    "This product includes software developed by the OpenSSL Project
    37  *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
    38  *
    39  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
    40  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    41  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
    42  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
    43  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    44  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
    45  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
    46  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    47  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
    48  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    49  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
    50  * OF THE POSSIBILITY OF SUCH DAMAGE.
    51  * ====================================================================
    52  *
    53  * This product includes cryptographic software written by Eric Young
    54  * (eay@cryptsoft.com).  This product includes software written by Tim
    55  * Hudson (tjh@cryptsoft.com).
    56  *
    57  */
    58 
    59 /*
    60 
    61 This is an implementation of Triple DES Cipher Block Chaining with Output
    62 Feedback Masking, by Coppersmith, Johnson and Matyas, (IBM and Certicom).
    63 
    64 Note that there is a known attack on this by Biham and Knudsen but it takes
    65 a lot of work:
    66 
    67 http://www.cs.technion.ac.il/users/wwwb/cgi-bin/tr-get.cgi/1998/CS/CS0928.ps.gz
    68 
    69 */
    70 
    71 #include <openssl/opensslconf.h> /* To see if OPENSSL_NO_DESCBCM is defined */
    72 
    73 #ifndef OPENSSL_NO_DESCBCM
    74 #include "des_locl.h"
    75 
    76 EXPORT_C void DES_ede3_cbcm_encrypt(const unsigned char *in, unsigned char *out,
    77 	     long length, DES_key_schedule *ks1, DES_key_schedule *ks2,
    78 	     DES_key_schedule *ks3, DES_cblock *ivec1, DES_cblock *ivec2,
    79 	     int enc)
    80     {
    81     register DES_LONG tin0,tin1;
    82     register DES_LONG tout0,tout1,xor0,xor1,m0,m1;
    83     register long l=length;
    84     DES_LONG tin[2];
    85     unsigned char *iv1,*iv2;
    86 
    87     iv1 = &(*ivec1)[0];
    88     iv2 = &(*ivec2)[0];
    89 
    90     if (enc)
    91 	{
    92 	c2l(iv1,m0);
    93 	c2l(iv1,m1);
    94 	c2l(iv2,tout0);
    95 	c2l(iv2,tout1);
    96 	for (l-=8; l>=-7; l-=8)
    97 	    {
    98 	    tin[0]=m0;
    99 	    tin[1]=m1;
   100 	    DES_encrypt1(tin,ks3,1);
   101 	    m0=tin[0];
   102 	    m1=tin[1];
   103 
   104 	    if(l < 0)
   105 		{
   106 		c2ln(in,tin0,tin1,l+8);
   107 		}
   108 	    else
   109 		{
   110 		c2l(in,tin0);
   111 		c2l(in,tin1);
   112 		}
   113 	    tin0^=tout0;
   114 	    tin1^=tout1;
   115 
   116 	    tin[0]=tin0;
   117 	    tin[1]=tin1;
   118 	    DES_encrypt1(tin,ks1,1);
   119 	    tin[0]^=m0;
   120 	    tin[1]^=m1;
   121 	    DES_encrypt1(tin,ks2,0);
   122 	    tin[0]^=m0;
   123 	    tin[1]^=m1;
   124 	    DES_encrypt1(tin,ks1,1);
   125 	    tout0=tin[0];
   126 	    tout1=tin[1];
   127 
   128 	    l2c(tout0,out);
   129 	    l2c(tout1,out);
   130 	    }
   131 	iv1=&(*ivec1)[0];
   132 	l2c(m0,iv1);
   133 	l2c(m1,iv1);
   134 
   135 	iv2=&(*ivec2)[0];
   136 	l2c(tout0,iv2);
   137 	l2c(tout1,iv2);
   138 	}
   139     else
   140 	{
   141 	register DES_LONG t0,t1;
   142 
   143 	c2l(iv1,m0);
   144 	c2l(iv1,m1);
   145 	c2l(iv2,xor0);
   146 	c2l(iv2,xor1);
   147 	for (l-=8; l>=-7; l-=8)
   148 	    {
   149 	    tin[0]=m0;
   150 	    tin[1]=m1;
   151 	    DES_encrypt1(tin,ks3,1);
   152 	    m0=tin[0];
   153 	    m1=tin[1];
   154 
   155 	    c2l(in,tin0);
   156 	    c2l(in,tin1);
   157 
   158 	    t0=tin0;
   159 	    t1=tin1;
   160 
   161 	    tin[0]=tin0;
   162 	    tin[1]=tin1;
   163 	    DES_encrypt1(tin,ks1,0);
   164 	    tin[0]^=m0;
   165 	    tin[1]^=m1;
   166 	    DES_encrypt1(tin,ks2,1);
   167 	    tin[0]^=m0;
   168 	    tin[1]^=m1;
   169 	    DES_encrypt1(tin,ks1,0);
   170 	    tout0=tin[0];
   171 	    tout1=tin[1];
   172 
   173 	    tout0^=xor0;
   174 	    tout1^=xor1;
   175 	    if(l < 0)
   176 		{
   177 		l2cn(tout0,tout1,out,l+8);
   178 		}
   179 	    else
   180 		{
   181 		l2c(tout0,out);
   182 		l2c(tout1,out);
   183 		}
   184 	    xor0=t0;
   185 	    xor1=t1;
   186 	    }
   187 
   188 	iv1=&(*ivec1)[0];
   189 	l2c(m0,iv1);
   190 	l2c(m1,iv1);
   191 
   192 	iv2=&(*ivec2)[0];
   193 	l2c(xor0,iv2);
   194 	l2c(xor1,iv2);
   195 	}
   196     tin0=tin1=tout0=tout1=xor0=xor1=0;
   197     tin[0]=tin[1]=0;
   198     }
   199 #endif