This is a fork of the mbed port of axTLS

Dependents:   TLS_axTLS-Example HTTPSClientExample

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers md2.c Source File

md2.c

00001 /*
00002  * Copyright (c) 2007, Cameron Rich
00003  * 
00004  * All rights reserved.
00005  * 
00006  * Redistribution and use in source and binary forms, with or without 
00007  * modification, are permitted provided that the following conditions are met:
00008  *
00009  * * Redistributions of source code must retain the above copyright notice, 
00010  *   this list of conditions and the following disclaimer.
00011  * * Redistributions in binary form must reproduce the above copyright notice, 
00012  *   this list of conditions and the following disclaimer in the documentation 
00013  *   and/or other materials provided with the distribution.
00014  * * Neither the name of the axTLS project nor the names of its contributors 
00015  *   may be used to endorse or promote products derived from this software 
00016  *   without specific prior written permission.
00017  *
00018  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
00019  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
00020  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
00021  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
00022  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00023  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00024  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00025  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00026  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00027  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00028  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00029  */
00030 
00031 /*
00032  *  RFC 1115/1319 compliant MD2 implementation
00033  *  The MD2 algorithm was designed by Ron Rivest in 1989.
00034  *
00035  *  http://www.ietf.org/rfc/rfc1115.txt
00036  *  http://www.ietf.org/rfc/rfc1319.txt
00037  */
00038 
00039 #include <string.h>
00040 #include <stdio.h>
00041 #include "os_port.h"
00042 #include "crypto.h "
00043 #include "config.h"
00044 
00045 /**
00046  * This code is only here to enable the verification of Verisign root
00047  * certificates. So only enable it for verification mode.
00048  */
00049 #ifdef CONFIG_SSL_CERT_VERIFICATION
00050 
00051 static const uint8_t PI_SUBST[256] =
00052 {
00053     0x29, 0x2E, 0x43, 0xC9, 0xA2, 0xD8, 0x7C, 0x01, 0x3D, 0x36,
00054     0x54, 0xA1, 0xEC, 0xF0, 0x06, 0x13, 0x62, 0xA7, 0x05, 0xF3,
00055     0xC0, 0xC7, 0x73, 0x8C, 0x98, 0x93, 0x2B, 0xD9, 0xBC, 0x4C,
00056     0x82, 0xCA, 0x1E, 0x9B, 0x57, 0x3C, 0xFD, 0xD4, 0xE0, 0x16,
00057     0x67, 0x42, 0x6F, 0x18, 0x8A, 0x17, 0xE5, 0x12, 0xBE, 0x4E,
00058     0xC4, 0xD6, 0xDA, 0x9E, 0xDE, 0x49, 0xA0, 0xFB, 0xF5, 0x8E,
00059     0xBB, 0x2F, 0xEE, 0x7A, 0xA9, 0x68, 0x79, 0x91, 0x15, 0xB2,
00060     0x07, 0x3F, 0x94, 0xC2, 0x10, 0x89, 0x0B, 0x22, 0x5F, 0x21,
00061     0x80, 0x7F, 0x5D, 0x9A, 0x5A, 0x90, 0x32, 0x27, 0x35, 0x3E,
00062     0xCC, 0xE7, 0xBF, 0xF7, 0x97, 0x03, 0xFF, 0x19, 0x30, 0xB3,
00063     0x48, 0xA5, 0xB5, 0xD1, 0xD7, 0x5E, 0x92, 0x2A, 0xAC, 0x56,
00064     0xAA, 0xC6, 0x4F, 0xB8, 0x38, 0xD2, 0x96, 0xA4, 0x7D, 0xB6,
00065     0x76, 0xFC, 0x6B, 0xE2, 0x9C, 0x74, 0x04, 0xF1, 0x45, 0x9D,
00066     0x70, 0x59, 0x64, 0x71, 0x87, 0x20, 0x86, 0x5B, 0xCF, 0x65,
00067     0xE6, 0x2D, 0xA8, 0x02, 0x1B, 0x60, 0x25, 0xAD, 0xAE, 0xB0,
00068     0xB9, 0xF6, 0x1C, 0x46, 0x61, 0x69, 0x34, 0x40, 0x7E, 0x0F,
00069     0x55, 0x47, 0xA3, 0x23, 0xDD, 0x51, 0xAF, 0x3A, 0xC3, 0x5C,
00070     0xF9, 0xCE, 0xBA, 0xC5, 0xEA, 0x26, 0x2C, 0x53, 0x0D, 0x6E,
00071     0x85, 0x28, 0x84, 0x09, 0xD3, 0xDF, 0xCD, 0xF4, 0x41, 0x81,
00072     0x4D, 0x52, 0x6A, 0xDC, 0x37, 0xC8, 0x6C, 0xC1, 0xAB, 0xFA,
00073     0x24, 0xE1, 0x7B, 0x08, 0x0C, 0xBD, 0xB1, 0x4A, 0x78, 0x88,
00074     0x95, 0x8B, 0xE3, 0x63, 0xE8, 0x6D, 0xE9, 0xCB, 0xD5, 0xFE,
00075     0x3B, 0x00, 0x1D, 0x39, 0xF2, 0xEF, 0xB7, 0x0E, 0x66, 0x58,
00076     0xD0, 0xE4, 0xA6, 0x77, 0x72, 0xF8, 0xEB, 0x75, 0x4B, 0x0A,
00077     0x31, 0x44, 0x50, 0xB4, 0x8F, 0xED, 0x1F, 0x1A, 0xDB, 0x99,
00078     0x8D, 0x33, 0x9F, 0x11, 0x83, 0x14
00079 };
00080 
00081 /*
00082  * MD2 context setup
00083  */
00084 EXP_FUNC void STDCALL MD2_Init(MD2_CTX *ctx)
00085 {
00086     memset(ctx, 0, sizeof *ctx);
00087 }
00088 
00089 static void md2_process(MD2_CTX *ctx)
00090 {
00091     int i, j;
00092     uint8_t t = 0;
00093 
00094     for (i = 0; i < 16; i++)
00095     {
00096         ctx->state[i + 16] = ctx->buffer[i];
00097         ctx->state[i + 32] = ctx->buffer[i] ^ ctx->state[i];
00098     }
00099 
00100     for (i = 0; i < 18; i++)
00101     {
00102         for (j = 0; j < 48; j++)
00103             t = (ctx->state[j] ^= PI_SUBST[t]);
00104 
00105         t = (t + i) & 0xFF;
00106     }
00107 
00108     t = ctx->cksum[15];
00109 
00110     for (i = 0; i < 16; i++)
00111         t = (ctx->cksum[i] ^= PI_SUBST[ctx->buffer[i] ^ t]);
00112 }
00113 
00114 /*
00115  * MD2 process buffer
00116  */
00117 EXP_FUNC void STDCALL MD2_Update(MD2_CTX *ctx, const uint8_t *input, int ilen)
00118 {
00119     int fill;
00120 
00121     while (ilen > 0)
00122     {
00123         if (ctx->left + ilen > 16)
00124             fill = 16 - ctx->left;
00125         else
00126             fill = ilen;
00127 
00128         memcpy(ctx->buffer + ctx->left, input, fill);
00129 
00130         ctx->left += fill;
00131         input += fill;
00132         ilen  -= fill;
00133 
00134         if (ctx->left == 16)
00135         {
00136             ctx->left = 0;
00137             md2_process(ctx);
00138         }
00139     }
00140 }
00141 
00142 /*
00143  * MD2 final digest
00144  */
00145 EXP_FUNC void STDCALL MD2_Final(uint8_t *output, MD2_CTX *ctx)
00146 {
00147     int i;
00148     uint8_t x;
00149 
00150     x = (uint8_t)(16 - ctx->left);
00151 
00152     for (i = ctx->left; i < 16; i++)
00153         ctx->buffer[i] = x;
00154 
00155     md2_process(ctx);
00156 
00157     memcpy(ctx->buffer, ctx->cksum, 16);
00158     md2_process(ctx);
00159 
00160     memcpy(output, ctx->state, 16);
00161 }
00162 
00163 #endif
00164 
00165