cyassl re-port with cellular comms, PSK test

Dependencies:   VodafoneUSBModem_bleedingedge2 mbed-rtos mbed-src

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers md2.c Source File

md2.c

00001 /* md2.c
00002  *
00003  * Copyright (C) 2006-2012 Sawtooth Consulting Ltd.
00004  *
00005  * This file is part of CyaSSL.
00006  *
00007  * CyaSSL is free software; you can redistribute it and/or modify
00008  * it under the terms of the GNU General Public License as published by
00009  * the Free Software Foundation; either version 2 of the License, or
00010  * (at your option) any later version.
00011  *
00012  * CyaSSL is distributed in the hope that it will be useful,
00013  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00015  * GNU General Public License for more details.
00016  *
00017  * You should have received a copy of the GNU General Public License
00018  * along with this program; if not, write to the Free Software
00019  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
00020  */
00021 
00022 
00023 #ifdef HAVE_CONFIG_H
00024     #include <config.h>
00025 #endif
00026 
00027 #ifdef CYASSL_MD2
00028 
00029 #include <cyassl/ctaocrypt/md2.h>
00030 #ifdef NO_INLINE
00031     #include <cyassl/ctaocrypt/misc.h>
00032 #else
00033     #include <ctaocrypt/src/misc.c>
00034 #endif
00035 
00036 
00037 void InitMd2(Md2* md2)
00038 {
00039     XMEMSET(md2->X, 0, MD2_X_SIZE);
00040     XMEMSET(md2->C, 0, MD2_BLOCK_SIZE);
00041     XMEMSET(md2->buffer, 0, MD2_BLOCK_SIZE);
00042     md2->count = 0;
00043 }
00044 
00045 
00046 void Md2Update(Md2* md2, const byte* data, word32 len)
00047 {
00048     static const byte S[256] = 
00049     {
00050         41, 46, 67, 201, 162, 216, 124, 1, 61, 54, 84, 161, 236, 240, 6,
00051         19, 98, 167, 5, 243, 192, 199, 115, 140, 152, 147, 43, 217, 188,
00052         76, 130, 202, 30, 155, 87, 60, 253, 212, 224, 22, 103, 66, 111, 24,
00053         138, 23, 229, 18, 190, 78, 196, 214, 218, 158, 222, 73, 160, 251,
00054         245, 142, 187, 47, 238, 122, 169, 104, 121, 145, 21, 178, 7, 63,
00055         148, 194, 16, 137, 11, 34, 95, 33, 128, 127, 93, 154, 90, 144, 50,
00056         39, 53, 62, 204, 231, 191, 247, 151, 3, 255, 25, 48, 179, 72, 165,
00057         181, 209, 215, 94, 146, 42, 172, 86, 170, 198, 79, 184, 56, 210,
00058         150, 164, 125, 182, 118, 252, 107, 226, 156, 116, 4, 241, 69, 157,
00059         112, 89, 100, 113, 135, 32, 134, 91, 207, 101, 230, 45, 168, 2, 27,
00060         96, 37, 173, 174, 176, 185, 246, 28, 70, 97, 105, 52, 64, 126, 15,
00061         85, 71, 163, 35, 221, 81, 175, 58, 195, 92, 249, 206, 186, 197,
00062         234, 38, 44, 83, 13, 110, 133, 40, 132, 9, 211, 223, 205, 244, 65,
00063         129, 77, 82, 106, 220, 55, 200, 108, 193, 171, 250, 36, 225, 123,
00064         8, 12, 189, 177, 74, 120, 136, 149, 139, 227, 99, 232, 109, 233,
00065         203, 213, 254, 59, 0, 29, 57, 242, 239, 183, 14, 102, 88, 208, 228,
00066         166, 119, 114, 248, 235, 117, 75, 10, 49, 68, 80, 180, 143, 237,
00067         31, 26, 219, 153, 141, 51, 159, 17, 131, 20
00068     };
00069 
00070     while (len) {
00071         word32 L = (MD2_PAD_SIZE - md2->count) < len ?
00072                    (MD2_PAD_SIZE - md2->count) : len;
00073         XMEMCPY(md2->buffer + md2->count, data, L);
00074         md2->count += L;
00075         data += L;
00076         len  -= L;
00077 
00078         if (md2->count == MD2_PAD_SIZE) {
00079             int  i;
00080             byte t;
00081 
00082             md2->count = 0;
00083             XMEMCPY(md2->X + MD2_PAD_SIZE, md2->buffer, MD2_PAD_SIZE);
00084             t = md2->C[15];
00085 
00086             for(i = 0; i < MD2_PAD_SIZE; i++) {
00087                 md2->X[32 + i] = md2->X[MD2_PAD_SIZE + i] ^ md2->X[i];
00088                 t = md2->C[i] ^= S[md2->buffer[i] ^ t];
00089             }
00090 
00091             t=0;
00092             for(i = 0; i < 18; i++) {
00093                 int j;
00094                 for(j = 0; j < MD2_X_SIZE; j += 8) {
00095                     t = md2->X[j+0] ^= S[t];
00096                     t = md2->X[j+1] ^= S[t];
00097                     t = md2->X[j+2] ^= S[t];
00098                     t = md2->X[j+3] ^= S[t];
00099                     t = md2->X[j+4] ^= S[t];
00100                     t = md2->X[j+5] ^= S[t];
00101                     t = md2->X[j+6] ^= S[t];
00102                     t = md2->X[j+7] ^= S[t];
00103                 }
00104                 t = (t + i) & 0xFF;
00105             }
00106         }
00107     }
00108 }
00109 
00110 
00111 void Md2Final(Md2* md2, byte* hash)
00112 {
00113     byte   padding[MD2_BLOCK_SIZE];
00114     word32 padLen = MD2_PAD_SIZE - md2->count;
00115     word32 i;
00116 
00117     for (i = 0; i < padLen; i++)
00118         padding[i] = (byte)padLen;
00119 
00120     Md2Update(md2, padding, padLen);
00121     Md2Update(md2, md2->C, MD2_BLOCK_SIZE);
00122 
00123     XMEMCPY(hash, md2->X, MD2_DIGEST_SIZE);
00124 
00125     InitMd2(md2);
00126 }
00127 
00128 
00129 #endif /* CYASSL_MD2 */