1195972f6Sopenharmony_ci/* 2195972f6Sopenharmony_ci * FIPS-180-1 compliant SHA-1 implementation 3195972f6Sopenharmony_ci * 4195972f6Sopenharmony_ci * Based on XySSL: Copyright (C) 2006-2008 Christophe Devine 5195972f6Sopenharmony_ci * 6195972f6Sopenharmony_ci * Copyright (C) 2009 Paul Bakker <polarssl_maintainer at polarssl dot org> 7195972f6Sopenharmony_ci * 8195972f6Sopenharmony_ci * All rights reserved. 9195972f6Sopenharmony_ci * 10195972f6Sopenharmony_ci * Redistribution and use in source and binary forms, with or without 11195972f6Sopenharmony_ci * modification, are permitted provided that the following conditions 12195972f6Sopenharmony_ci * are met: 13195972f6Sopenharmony_ci * 14195972f6Sopenharmony_ci * * Redistributions of source code must retain the above copyright 15195972f6Sopenharmony_ci * notice, this list of conditions and the following disclaimer. 16195972f6Sopenharmony_ci * * Redistributions in binary form must reproduce the above copyright 17195972f6Sopenharmony_ci * notice, this list of conditions and the following disclaimer in the 18195972f6Sopenharmony_ci * documentation and/or other materials provided with the distribution. 19195972f6Sopenharmony_ci * * Neither the names of PolarSSL or XySSL nor the names of its contributors 20195972f6Sopenharmony_ci * may be used to endorse or promote products derived from this software 21195972f6Sopenharmony_ci * without specific prior written permission. 22195972f6Sopenharmony_ci * 23195972f6Sopenharmony_ci * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 24195972f6Sopenharmony_ci * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 25195972f6Sopenharmony_ci * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 26195972f6Sopenharmony_ci * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 27195972f6Sopenharmony_ci * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 28195972f6Sopenharmony_ci * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 29195972f6Sopenharmony_ci * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 30195972f6Sopenharmony_ci * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 31195972f6Sopenharmony_ci * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 32195972f6Sopenharmony_ci * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 33195972f6Sopenharmony_ci * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 34195972f6Sopenharmony_ci */ 35195972f6Sopenharmony_ci/* 36195972f6Sopenharmony_ci * The SHA-1 standard was published by NIST in 1993. 37195972f6Sopenharmony_ci * 38195972f6Sopenharmony_ci * http://www.itl.nist.gov/fipspubs/fip180-1.htm 39195972f6Sopenharmony_ci */ 40195972f6Sopenharmony_ci 41195972f6Sopenharmony_ci#include "netif/ppp/ppp_opts.h" 42195972f6Sopenharmony_ci#if PPP_SUPPORT && LWIP_INCLUDED_POLARSSL_SHA1 43195972f6Sopenharmony_ci 44195972f6Sopenharmony_ci#include "netif/ppp/polarssl/sha1.h" 45195972f6Sopenharmony_ci 46195972f6Sopenharmony_ci#include <string.h> 47195972f6Sopenharmony_ci 48195972f6Sopenharmony_ci/* 49195972f6Sopenharmony_ci * 32-bit integer manipulation macros (big endian) 50195972f6Sopenharmony_ci */ 51195972f6Sopenharmony_ci#ifndef GET_ULONG_BE 52195972f6Sopenharmony_ci#define GET_ULONG_BE(n,b,i) \ 53195972f6Sopenharmony_ci{ \ 54195972f6Sopenharmony_ci (n) = ( (unsigned long) (b)[(i) ] << 24 ) \ 55195972f6Sopenharmony_ci | ( (unsigned long) (b)[(i) + 1] << 16 ) \ 56195972f6Sopenharmony_ci | ( (unsigned long) (b)[(i) + 2] << 8 ) \ 57195972f6Sopenharmony_ci | ( (unsigned long) (b)[(i) + 3] ); \ 58195972f6Sopenharmony_ci} 59195972f6Sopenharmony_ci#endif 60195972f6Sopenharmony_ci 61195972f6Sopenharmony_ci#ifndef PUT_ULONG_BE 62195972f6Sopenharmony_ci#define PUT_ULONG_BE(n,b,i) \ 63195972f6Sopenharmony_ci{ \ 64195972f6Sopenharmony_ci (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \ 65195972f6Sopenharmony_ci (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \ 66195972f6Sopenharmony_ci (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \ 67195972f6Sopenharmony_ci (b)[(i) + 3] = (unsigned char) ( (n) ); \ 68195972f6Sopenharmony_ci} 69195972f6Sopenharmony_ci#endif 70195972f6Sopenharmony_ci 71195972f6Sopenharmony_ci/* 72195972f6Sopenharmony_ci * SHA-1 context setup 73195972f6Sopenharmony_ci */ 74195972f6Sopenharmony_civoid sha1_starts( sha1_context *ctx ) 75195972f6Sopenharmony_ci{ 76195972f6Sopenharmony_ci ctx->total[0] = 0; 77195972f6Sopenharmony_ci ctx->total[1] = 0; 78195972f6Sopenharmony_ci 79195972f6Sopenharmony_ci ctx->state[0] = 0x67452301; 80195972f6Sopenharmony_ci ctx->state[1] = 0xEFCDAB89; 81195972f6Sopenharmony_ci ctx->state[2] = 0x98BADCFE; 82195972f6Sopenharmony_ci ctx->state[3] = 0x10325476; 83195972f6Sopenharmony_ci ctx->state[4] = 0xC3D2E1F0; 84195972f6Sopenharmony_ci} 85195972f6Sopenharmony_ci 86195972f6Sopenharmony_cistatic void sha1_process( sha1_context *ctx, const unsigned char data[64] ) 87195972f6Sopenharmony_ci{ 88195972f6Sopenharmony_ci unsigned long temp, W[16], A, B, C, D, E; 89195972f6Sopenharmony_ci 90195972f6Sopenharmony_ci GET_ULONG_BE( W[ 0], data, 0 ); 91195972f6Sopenharmony_ci GET_ULONG_BE( W[ 1], data, 4 ); 92195972f6Sopenharmony_ci GET_ULONG_BE( W[ 2], data, 8 ); 93195972f6Sopenharmony_ci GET_ULONG_BE( W[ 3], data, 12 ); 94195972f6Sopenharmony_ci GET_ULONG_BE( W[ 4], data, 16 ); 95195972f6Sopenharmony_ci GET_ULONG_BE( W[ 5], data, 20 ); 96195972f6Sopenharmony_ci GET_ULONG_BE( W[ 6], data, 24 ); 97195972f6Sopenharmony_ci GET_ULONG_BE( W[ 7], data, 28 ); 98195972f6Sopenharmony_ci GET_ULONG_BE( W[ 8], data, 32 ); 99195972f6Sopenharmony_ci GET_ULONG_BE( W[ 9], data, 36 ); 100195972f6Sopenharmony_ci GET_ULONG_BE( W[10], data, 40 ); 101195972f6Sopenharmony_ci GET_ULONG_BE( W[11], data, 44 ); 102195972f6Sopenharmony_ci GET_ULONG_BE( W[12], data, 48 ); 103195972f6Sopenharmony_ci GET_ULONG_BE( W[13], data, 52 ); 104195972f6Sopenharmony_ci GET_ULONG_BE( W[14], data, 56 ); 105195972f6Sopenharmony_ci GET_ULONG_BE( W[15], data, 60 ); 106195972f6Sopenharmony_ci 107195972f6Sopenharmony_ci#define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n))) 108195972f6Sopenharmony_ci 109195972f6Sopenharmony_ci#define R(t) \ 110195972f6Sopenharmony_ci( \ 111195972f6Sopenharmony_ci temp = W[(t - 3) & 0x0F] ^ W[(t - 8) & 0x0F] ^ \ 112195972f6Sopenharmony_ci W[(t - 14) & 0x0F] ^ W[ t & 0x0F], \ 113195972f6Sopenharmony_ci ( W[t & 0x0F] = S(temp,1) ) \ 114195972f6Sopenharmony_ci) 115195972f6Sopenharmony_ci 116195972f6Sopenharmony_ci#define P(a,b,c,d,e,x) \ 117195972f6Sopenharmony_ci{ \ 118195972f6Sopenharmony_ci e += S(a,5) + F(b,c,d) + K + x; b = S(b,30); \ 119195972f6Sopenharmony_ci} 120195972f6Sopenharmony_ci 121195972f6Sopenharmony_ci A = ctx->state[0]; 122195972f6Sopenharmony_ci B = ctx->state[1]; 123195972f6Sopenharmony_ci C = ctx->state[2]; 124195972f6Sopenharmony_ci D = ctx->state[3]; 125195972f6Sopenharmony_ci E = ctx->state[4]; 126195972f6Sopenharmony_ci 127195972f6Sopenharmony_ci#define F(x,y,z) (z ^ (x & (y ^ z))) 128195972f6Sopenharmony_ci#define K 0x5A827999 129195972f6Sopenharmony_ci 130195972f6Sopenharmony_ci P( A, B, C, D, E, W[0] ); 131195972f6Sopenharmony_ci P( E, A, B, C, D, W[1] ); 132195972f6Sopenharmony_ci P( D, E, A, B, C, W[2] ); 133195972f6Sopenharmony_ci P( C, D, E, A, B, W[3] ); 134195972f6Sopenharmony_ci P( B, C, D, E, A, W[4] ); 135195972f6Sopenharmony_ci P( A, B, C, D, E, W[5] ); 136195972f6Sopenharmony_ci P( E, A, B, C, D, W[6] ); 137195972f6Sopenharmony_ci P( D, E, A, B, C, W[7] ); 138195972f6Sopenharmony_ci P( C, D, E, A, B, W[8] ); 139195972f6Sopenharmony_ci P( B, C, D, E, A, W[9] ); 140195972f6Sopenharmony_ci P( A, B, C, D, E, W[10] ); 141195972f6Sopenharmony_ci P( E, A, B, C, D, W[11] ); 142195972f6Sopenharmony_ci P( D, E, A, B, C, W[12] ); 143195972f6Sopenharmony_ci P( C, D, E, A, B, W[13] ); 144195972f6Sopenharmony_ci P( B, C, D, E, A, W[14] ); 145195972f6Sopenharmony_ci P( A, B, C, D, E, W[15] ); 146195972f6Sopenharmony_ci P( E, A, B, C, D, R(16) ); 147195972f6Sopenharmony_ci P( D, E, A, B, C, R(17) ); 148195972f6Sopenharmony_ci P( C, D, E, A, B, R(18) ); 149195972f6Sopenharmony_ci P( B, C, D, E, A, R(19) ); 150195972f6Sopenharmony_ci 151195972f6Sopenharmony_ci#undef K 152195972f6Sopenharmony_ci#undef F 153195972f6Sopenharmony_ci 154195972f6Sopenharmony_ci#define F(x,y,z) (x ^ y ^ z) 155195972f6Sopenharmony_ci#define K 0x6ED9EBA1 156195972f6Sopenharmony_ci 157195972f6Sopenharmony_ci P( A, B, C, D, E, R(20) ); 158195972f6Sopenharmony_ci P( E, A, B, C, D, R(21) ); 159195972f6Sopenharmony_ci P( D, E, A, B, C, R(22) ); 160195972f6Sopenharmony_ci P( C, D, E, A, B, R(23) ); 161195972f6Sopenharmony_ci P( B, C, D, E, A, R(24) ); 162195972f6Sopenharmony_ci P( A, B, C, D, E, R(25) ); 163195972f6Sopenharmony_ci P( E, A, B, C, D, R(26) ); 164195972f6Sopenharmony_ci P( D, E, A, B, C, R(27) ); 165195972f6Sopenharmony_ci P( C, D, E, A, B, R(28) ); 166195972f6Sopenharmony_ci P( B, C, D, E, A, R(29) ); 167195972f6Sopenharmony_ci P( A, B, C, D, E, R(30) ); 168195972f6Sopenharmony_ci P( E, A, B, C, D, R(31) ); 169195972f6Sopenharmony_ci P( D, E, A, B, C, R(32) ); 170195972f6Sopenharmony_ci P( C, D, E, A, B, R(33) ); 171195972f6Sopenharmony_ci P( B, C, D, E, A, R(34) ); 172195972f6Sopenharmony_ci P( A, B, C, D, E, R(35) ); 173195972f6Sopenharmony_ci P( E, A, B, C, D, R(36) ); 174195972f6Sopenharmony_ci P( D, E, A, B, C, R(37) ); 175195972f6Sopenharmony_ci P( C, D, E, A, B, R(38) ); 176195972f6Sopenharmony_ci P( B, C, D, E, A, R(39) ); 177195972f6Sopenharmony_ci 178195972f6Sopenharmony_ci#undef K 179195972f6Sopenharmony_ci#undef F 180195972f6Sopenharmony_ci 181195972f6Sopenharmony_ci#define F(x,y,z) ((x & y) | (z & (x | y))) 182195972f6Sopenharmony_ci#define K 0x8F1BBCDC 183195972f6Sopenharmony_ci 184195972f6Sopenharmony_ci P( A, B, C, D, E, R(40) ); 185195972f6Sopenharmony_ci P( E, A, B, C, D, R(41) ); 186195972f6Sopenharmony_ci P( D, E, A, B, C, R(42) ); 187195972f6Sopenharmony_ci P( C, D, E, A, B, R(43) ); 188195972f6Sopenharmony_ci P( B, C, D, E, A, R(44) ); 189195972f6Sopenharmony_ci P( A, B, C, D, E, R(45) ); 190195972f6Sopenharmony_ci P( E, A, B, C, D, R(46) ); 191195972f6Sopenharmony_ci P( D, E, A, B, C, R(47) ); 192195972f6Sopenharmony_ci P( C, D, E, A, B, R(48) ); 193195972f6Sopenharmony_ci P( B, C, D, E, A, R(49) ); 194195972f6Sopenharmony_ci P( A, B, C, D, E, R(50) ); 195195972f6Sopenharmony_ci P( E, A, B, C, D, R(51) ); 196195972f6Sopenharmony_ci P( D, E, A, B, C, R(52) ); 197195972f6Sopenharmony_ci P( C, D, E, A, B, R(53) ); 198195972f6Sopenharmony_ci P( B, C, D, E, A, R(54) ); 199195972f6Sopenharmony_ci P( A, B, C, D, E, R(55) ); 200195972f6Sopenharmony_ci P( E, A, B, C, D, R(56) ); 201195972f6Sopenharmony_ci P( D, E, A, B, C, R(57) ); 202195972f6Sopenharmony_ci P( C, D, E, A, B, R(58) ); 203195972f6Sopenharmony_ci P( B, C, D, E, A, R(59) ); 204195972f6Sopenharmony_ci 205195972f6Sopenharmony_ci#undef K 206195972f6Sopenharmony_ci#undef F 207195972f6Sopenharmony_ci 208195972f6Sopenharmony_ci#define F(x,y,z) (x ^ y ^ z) 209195972f6Sopenharmony_ci#define K 0xCA62C1D6 210195972f6Sopenharmony_ci 211195972f6Sopenharmony_ci P( A, B, C, D, E, R(60) ); 212195972f6Sopenharmony_ci P( E, A, B, C, D, R(61) ); 213195972f6Sopenharmony_ci P( D, E, A, B, C, R(62) ); 214195972f6Sopenharmony_ci P( C, D, E, A, B, R(63) ); 215195972f6Sopenharmony_ci P( B, C, D, E, A, R(64) ); 216195972f6Sopenharmony_ci P( A, B, C, D, E, R(65) ); 217195972f6Sopenharmony_ci P( E, A, B, C, D, R(66) ); 218195972f6Sopenharmony_ci P( D, E, A, B, C, R(67) ); 219195972f6Sopenharmony_ci P( C, D, E, A, B, R(68) ); 220195972f6Sopenharmony_ci P( B, C, D, E, A, R(69) ); 221195972f6Sopenharmony_ci P( A, B, C, D, E, R(70) ); 222195972f6Sopenharmony_ci P( E, A, B, C, D, R(71) ); 223195972f6Sopenharmony_ci P( D, E, A, B, C, R(72) ); 224195972f6Sopenharmony_ci P( C, D, E, A, B, R(73) ); 225195972f6Sopenharmony_ci P( B, C, D, E, A, R(74) ); 226195972f6Sopenharmony_ci P( A, B, C, D, E, R(75) ); 227195972f6Sopenharmony_ci P( E, A, B, C, D, R(76) ); 228195972f6Sopenharmony_ci P( D, E, A, B, C, R(77) ); 229195972f6Sopenharmony_ci P( C, D, E, A, B, R(78) ); 230195972f6Sopenharmony_ci P( B, C, D, E, A, R(79) ); 231195972f6Sopenharmony_ci 232195972f6Sopenharmony_ci#undef K 233195972f6Sopenharmony_ci#undef F 234195972f6Sopenharmony_ci 235195972f6Sopenharmony_ci ctx->state[0] += A; 236195972f6Sopenharmony_ci ctx->state[1] += B; 237195972f6Sopenharmony_ci ctx->state[2] += C; 238195972f6Sopenharmony_ci ctx->state[3] += D; 239195972f6Sopenharmony_ci ctx->state[4] += E; 240195972f6Sopenharmony_ci} 241195972f6Sopenharmony_ci 242195972f6Sopenharmony_ci/* 243195972f6Sopenharmony_ci * SHA-1 process buffer 244195972f6Sopenharmony_ci */ 245195972f6Sopenharmony_civoid sha1_update( sha1_context *ctx, const unsigned char *input, int ilen ) 246195972f6Sopenharmony_ci{ 247195972f6Sopenharmony_ci int fill; 248195972f6Sopenharmony_ci unsigned long left; 249195972f6Sopenharmony_ci 250195972f6Sopenharmony_ci if( ilen <= 0 ) 251195972f6Sopenharmony_ci return; 252195972f6Sopenharmony_ci 253195972f6Sopenharmony_ci left = ctx->total[0] & 0x3F; 254195972f6Sopenharmony_ci fill = 64 - left; 255195972f6Sopenharmony_ci 256195972f6Sopenharmony_ci ctx->total[0] += ilen; 257195972f6Sopenharmony_ci ctx->total[0] &= 0xFFFFFFFF; 258195972f6Sopenharmony_ci 259195972f6Sopenharmony_ci if( ctx->total[0] < (unsigned long) ilen ) 260195972f6Sopenharmony_ci ctx->total[1]++; 261195972f6Sopenharmony_ci 262195972f6Sopenharmony_ci if( left && ilen >= fill ) 263195972f6Sopenharmony_ci { 264195972f6Sopenharmony_ci MEMCPY( (void *) (ctx->buffer + left), 265195972f6Sopenharmony_ci input, fill ); 266195972f6Sopenharmony_ci sha1_process( ctx, ctx->buffer ); 267195972f6Sopenharmony_ci input += fill; 268195972f6Sopenharmony_ci ilen -= fill; 269195972f6Sopenharmony_ci left = 0; 270195972f6Sopenharmony_ci } 271195972f6Sopenharmony_ci 272195972f6Sopenharmony_ci while( ilen >= 64 ) 273195972f6Sopenharmony_ci { 274195972f6Sopenharmony_ci sha1_process( ctx, input ); 275195972f6Sopenharmony_ci input += 64; 276195972f6Sopenharmony_ci ilen -= 64; 277195972f6Sopenharmony_ci } 278195972f6Sopenharmony_ci 279195972f6Sopenharmony_ci if( ilen > 0 ) 280195972f6Sopenharmony_ci { 281195972f6Sopenharmony_ci MEMCPY( (void *) (ctx->buffer + left), 282195972f6Sopenharmony_ci input, ilen ); 283195972f6Sopenharmony_ci } 284195972f6Sopenharmony_ci} 285195972f6Sopenharmony_ci 286195972f6Sopenharmony_cistatic const unsigned char sha1_padding[64] = 287195972f6Sopenharmony_ci{ 288195972f6Sopenharmony_ci 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 289195972f6Sopenharmony_ci 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 290195972f6Sopenharmony_ci 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 291195972f6Sopenharmony_ci 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 292195972f6Sopenharmony_ci}; 293195972f6Sopenharmony_ci 294195972f6Sopenharmony_ci/* 295195972f6Sopenharmony_ci * SHA-1 final digest 296195972f6Sopenharmony_ci */ 297195972f6Sopenharmony_civoid sha1_finish( sha1_context *ctx, unsigned char output[20] ) 298195972f6Sopenharmony_ci{ 299195972f6Sopenharmony_ci unsigned long last, padn; 300195972f6Sopenharmony_ci unsigned long high, low; 301195972f6Sopenharmony_ci unsigned char msglen[8]; 302195972f6Sopenharmony_ci 303195972f6Sopenharmony_ci high = ( ctx->total[0] >> 29 ) 304195972f6Sopenharmony_ci | ( ctx->total[1] << 3 ); 305195972f6Sopenharmony_ci low = ( ctx->total[0] << 3 ); 306195972f6Sopenharmony_ci 307195972f6Sopenharmony_ci PUT_ULONG_BE( high, msglen, 0 ); 308195972f6Sopenharmony_ci PUT_ULONG_BE( low, msglen, 4 ); 309195972f6Sopenharmony_ci 310195972f6Sopenharmony_ci last = ctx->total[0] & 0x3F; 311195972f6Sopenharmony_ci padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last ); 312195972f6Sopenharmony_ci 313195972f6Sopenharmony_ci sha1_update( ctx, sha1_padding, padn ); 314195972f6Sopenharmony_ci sha1_update( ctx, msglen, 8 ); 315195972f6Sopenharmony_ci 316195972f6Sopenharmony_ci PUT_ULONG_BE( ctx->state[0], output, 0 ); 317195972f6Sopenharmony_ci PUT_ULONG_BE( ctx->state[1], output, 4 ); 318195972f6Sopenharmony_ci PUT_ULONG_BE( ctx->state[2], output, 8 ); 319195972f6Sopenharmony_ci PUT_ULONG_BE( ctx->state[3], output, 12 ); 320195972f6Sopenharmony_ci PUT_ULONG_BE( ctx->state[4], output, 16 ); 321195972f6Sopenharmony_ci} 322195972f6Sopenharmony_ci 323195972f6Sopenharmony_ci/* 324195972f6Sopenharmony_ci * output = SHA-1( input buffer ) 325195972f6Sopenharmony_ci */ 326195972f6Sopenharmony_civoid sha1( unsigned char *input, int ilen, unsigned char output[20] ) 327195972f6Sopenharmony_ci{ 328195972f6Sopenharmony_ci sha1_context ctx; 329195972f6Sopenharmony_ci 330195972f6Sopenharmony_ci sha1_starts( &ctx ); 331195972f6Sopenharmony_ci sha1_update( &ctx, input, ilen ); 332195972f6Sopenharmony_ci sha1_finish( &ctx, output ); 333195972f6Sopenharmony_ci} 334195972f6Sopenharmony_ci 335195972f6Sopenharmony_ci#endif /* PPP_SUPPORT && LWIP_INCLUDED_POLARSSL_SHA1 */ 336