This is a fork of the mbed port of axTLS
Dependents: TLS_axTLS-Example HTTPSClientExample
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
Generated on Wed Jul 13 2022 19:30:07 by 1.7.2