1386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* 2386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * sha1.c 3386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 4386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * an implementation of the Secure Hash Algorithm v.1 (SHA-1), 5386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * specified in FIPS 180-1 6386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 7386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * David A. McGrew 8386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * Cisco Systems, Inc. 9386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 10386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 11386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* 12386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 13386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * Copyright (c) 2001-2006, Cisco Systems, Inc. 14386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * All rights reserved. 15386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 16386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * Redistribution and use in source and binary forms, with or without 17386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * modification, are permitted provided that the following conditions 18386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * are met: 19386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 20386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * Redistributions of source code must retain the above copyright 21386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * notice, this list of conditions and the following disclaimer. 22386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 23386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * Redistributions in binary form must reproduce the above 24386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * copyright notice, this list of conditions and the following 25386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * disclaimer in the documentation and/or other materials provided 26386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * with the distribution. 27386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 28386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * Neither the name of the Cisco Systems, Inc. nor the names of its 29386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * contributors may be used to endorse or promote products derived 30386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * from this software without specific prior written permission. 31386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 32386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 33386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 34386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 35386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 36386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 37386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 38386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 39386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 40386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 41386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 42386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 43386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * OF THE POSSIBILITY OF SUCH DAMAGE. 44386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 45386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 46386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 47386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 48386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#include "sha1.h" 49386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 50386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaridebug_module_t mod_sha1 = { 51386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 0, /* debugging is off by default */ 52386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari "sha-1" /* printable module name */ 53386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}; 54386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 55386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* SN == Rotate left N bits */ 56386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define S1(X) ((X << 1) | (X >> 31)) 57386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define S5(X) ((X << 5) | (X >> 27)) 58386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define S30(X) ((X << 30) | (X >> 2)) 59386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 60386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define f0(B,C,D) ((B & C) | (~B & D)) 61386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define f1(B,C,D) (B ^ C ^ D) 62386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define f2(B,C,D) ((B & C) | (B & D) | (C & D)) 63386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define f3(B,C,D) (B ^ C ^ D) 64386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 65386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* 66386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * nota bene: the variable K0 appears in the curses library, so we 67386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * give longer names to these variables to avoid spurious warnings 68386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * on systems that uses curses 69386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 70386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 71386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariuint32_t SHA_K0 = 0x5A827999; /* Kt for 0 <= t <= 19 */ 72386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariuint32_t SHA_K1 = 0x6ED9EBA1; /* Kt for 20 <= t <= 39 */ 73386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariuint32_t SHA_K2 = 0x8F1BBCDC; /* Kt for 40 <= t <= 59 */ 74386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariuint32_t SHA_K3 = 0xCA62C1D6; /* Kt for 60 <= t <= 79 */ 75386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 76386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid 77386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarisha1(const uint8_t *msg, int octets_in_msg, uint32_t hash_value[5]) { 78386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari sha1_ctx_t ctx; 79386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 80386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari sha1_init(&ctx); 81386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari sha1_update(&ctx, msg, octets_in_msg); 82386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari sha1_final(&ctx, hash_value); 83386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 84386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari} 85386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 86386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* 87386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * sha1_core(M, H) computes the core compression function, where M is 88386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * the next part of the message (in network byte order) and H is the 89386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * intermediate state { H0, H1, ...} (in host byte order) 90386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 91386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * this function does not do any of the padding required in the 92386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * complete SHA1 function 93386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * 94386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * this function is used in the SEAL 3.0 key setup routines 95386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * (crypto/cipher/seal.c) 96386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 97386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 98386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid 99386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarisha1_core(const uint32_t M[16], uint32_t hash_value[5]) { 100386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari uint32_t H0; 101386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari uint32_t H1; 102386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari uint32_t H2; 103386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari uint32_t H3; 104386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari uint32_t H4; 105386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari uint32_t W[80]; 106386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari uint32_t A, B, C, D, E, TEMP; 107386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari int t; 108386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 109386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* copy hash_value into H0, H1, H2, H3, H4 */ 110386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari H0 = hash_value[0]; 111386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari H1 = hash_value[1]; 112386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari H2 = hash_value[2]; 113386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari H3 = hash_value[3]; 114386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari H4 = hash_value[4]; 115386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 116386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* copy/xor message into array */ 117386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 118386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari W[0] = be32_to_cpu(M[0]); 119386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari W[1] = be32_to_cpu(M[1]); 120386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari W[2] = be32_to_cpu(M[2]); 121386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari W[3] = be32_to_cpu(M[3]); 122386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari W[4] = be32_to_cpu(M[4]); 123386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari W[5] = be32_to_cpu(M[5]); 124386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari W[6] = be32_to_cpu(M[6]); 125386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari W[7] = be32_to_cpu(M[7]); 126386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari W[8] = be32_to_cpu(M[8]); 127386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari W[9] = be32_to_cpu(M[9]); 128386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari W[10] = be32_to_cpu(M[10]); 129386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari W[11] = be32_to_cpu(M[11]); 130386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari W[12] = be32_to_cpu(M[12]); 131386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari W[13] = be32_to_cpu(M[13]); 132386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari W[14] = be32_to_cpu(M[14]); 133386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari W[15] = be32_to_cpu(M[15]); 134386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari TEMP = W[13] ^ W[8] ^ W[2] ^ W[0]; W[16] = S1(TEMP); 135386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari TEMP = W[14] ^ W[9] ^ W[3] ^ W[1]; W[17] = S1(TEMP); 136386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari TEMP = W[15] ^ W[10] ^ W[4] ^ W[2]; W[18] = S1(TEMP); 137386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari TEMP = W[16] ^ W[11] ^ W[5] ^ W[3]; W[19] = S1(TEMP); 138386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari TEMP = W[17] ^ W[12] ^ W[6] ^ W[4]; W[20] = S1(TEMP); 139386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari TEMP = W[18] ^ W[13] ^ W[7] ^ W[5]; W[21] = S1(TEMP); 140386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari TEMP = W[19] ^ W[14] ^ W[8] ^ W[6]; W[22] = S1(TEMP); 141386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari TEMP = W[20] ^ W[15] ^ W[9] ^ W[7]; W[23] = S1(TEMP); 142386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari TEMP = W[21] ^ W[16] ^ W[10] ^ W[8]; W[24] = S1(TEMP); 143386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari TEMP = W[22] ^ W[17] ^ W[11] ^ W[9]; W[25] = S1(TEMP); 144386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari TEMP = W[23] ^ W[18] ^ W[12] ^ W[10]; W[26] = S1(TEMP); 145386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari TEMP = W[24] ^ W[19] ^ W[13] ^ W[11]; W[27] = S1(TEMP); 146386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari TEMP = W[25] ^ W[20] ^ W[14] ^ W[12]; W[28] = S1(TEMP); 147386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari TEMP = W[26] ^ W[21] ^ W[15] ^ W[13]; W[29] = S1(TEMP); 148386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari TEMP = W[27] ^ W[22] ^ W[16] ^ W[14]; W[30] = S1(TEMP); 149386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari TEMP = W[28] ^ W[23] ^ W[17] ^ W[15]; W[31] = S1(TEMP); 150386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 151386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* process the remainder of the array */ 152386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari for (t=32; t < 80; t++) { 153386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari TEMP = W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16]; 154386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari W[t] = S1(TEMP); 155386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 156386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 157386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari A = H0; B = H1; C = H2; D = H3; E = H4; 158386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 159386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari for (t=0; t < 20; t++) { 160386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari TEMP = S5(A) + f0(B,C,D) + E + W[t] + SHA_K0; 161386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari E = D; D = C; C = S30(B); B = A; A = TEMP; 162386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 163386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari for ( ; t < 40; t++) { 164386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari TEMP = S5(A) + f1(B,C,D) + E + W[t] + SHA_K1; 165386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari E = D; D = C; C = S30(B); B = A; A = TEMP; 166386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 167386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari for ( ; t < 60; t++) { 168386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari TEMP = S5(A) + f2(B,C,D) + E + W[t] + SHA_K2; 169386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari E = D; D = C; C = S30(B); B = A; A = TEMP; 170386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 171386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari for ( ; t < 80; t++) { 172386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari TEMP = S5(A) + f3(B,C,D) + E + W[t] + SHA_K3; 173386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari E = D; D = C; C = S30(B); B = A; A = TEMP; 174386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 175386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 176386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari hash_value[0] = H0 + A; 177386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari hash_value[1] = H1 + B; 178386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari hash_value[2] = H2 + C; 179386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari hash_value[3] = H3 + D; 180386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari hash_value[4] = H4 + E; 181386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 182386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return; 183386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari} 184386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 185386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid 186386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarisha1_init(sha1_ctx_t *ctx) { 187386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 188386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* initialize state vector */ 189386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari ctx->H[0] = 0x67452301; 190386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari ctx->H[1] = 0xefcdab89; 191386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari ctx->H[2] = 0x98badcfe; 192386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari ctx->H[3] = 0x10325476; 193386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari ctx->H[4] = 0xc3d2e1f0; 194386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 195386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* indicate that message buffer is empty */ 196386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari ctx->octets_in_buffer = 0; 197386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 198386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* reset message bit-count to zero */ 199386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari ctx->num_bits_in_msg = 0; 200386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 201386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari} 202386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 203386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid 204386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarisha1_update(sha1_ctx_t *ctx, const uint8_t *msg, int octets_in_msg) { 205386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari int i; 206386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari uint8_t *buf = (uint8_t *)ctx->M; 207386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 208386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* update message bit-count */ 209386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari ctx->num_bits_in_msg += octets_in_msg * 8; 210386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 211386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* loop over 16-word blocks of M */ 212386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari while (octets_in_msg > 0) { 213386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 214386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (octets_in_msg + ctx->octets_in_buffer >= 64) { 215386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 216386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* 217386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * copy words of M into msg buffer until that buffer is full, 218386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * converting them into host byte order as needed 219386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 220386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari octets_in_msg -= (64 - ctx->octets_in_buffer); 221386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari for (i=ctx->octets_in_buffer; i < 64; i++) 222386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari buf[i] = *msg++; 223386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari ctx->octets_in_buffer = 0; 224386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 225386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* process a whole block */ 226386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 227386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari debug_print(mod_sha1, "(update) running sha1_core()", NULL); 228386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 229386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari sha1_core(ctx->M, ctx->H); 230386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 231386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } else { 232386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 233386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari debug_print(mod_sha1, "(update) not running sha1_core()", NULL); 234386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 235386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari for (i=ctx->octets_in_buffer; 236386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari i < (ctx->octets_in_buffer + octets_in_msg); i++) 237386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari buf[i] = *msg++; 238386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari ctx->octets_in_buffer += octets_in_msg; 239386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari octets_in_msg = 0; 240386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 241386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 242386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 243386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 244386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari} 245386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 246386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* 247386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * sha1_final(ctx, output) computes the result for ctx and copies it 248386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * into the twenty octets located at *output 249386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 250386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 251386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid 252386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarisha1_final(sha1_ctx_t *ctx, uint32_t *output) { 253386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari uint32_t A, B, C, D, E, TEMP; 254386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari uint32_t W[80]; 255386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari int i, t; 256386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 257386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* 258386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * process the remaining octets_in_buffer, padding and terminating as 259386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * necessary 260386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 261386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari { 262386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari int tail = ctx->octets_in_buffer % 4; 263386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 264386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* copy/xor message into array */ 265386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari for (i=0; i < (ctx->octets_in_buffer+3)/4; i++) 266386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari W[i] = be32_to_cpu(ctx->M[i]); 267386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 268386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* set the high bit of the octet immediately following the message */ 269386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari switch (tail) { 270386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari case (3): 271386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari W[i-1] = (be32_to_cpu(ctx->M[i-1]) & 0xffffff00) | 0x80; 272386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari W[i] = 0x0; 273386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari break; 274386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari case (2): 275386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari W[i-1] = (be32_to_cpu(ctx->M[i-1]) & 0xffff0000) | 0x8000; 276386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari W[i] = 0x0; 277386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari break; 278386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari case (1): 279386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari W[i-1] = (be32_to_cpu(ctx->M[i-1]) & 0xff000000) | 0x800000; 280386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari W[i] = 0x0; 281386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari break; 282386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari case (0): 283386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari W[i] = 0x80000000; 284386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari break; 285386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 286386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 287386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* zeroize remaining words */ 288386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari for (i++ ; i < 15; i++) 289386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari W[i] = 0x0; 290386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 291386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* 292386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * if there is room at the end of the word array, then set the 293386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * last word to the bit-length of the message; otherwise, set that 294386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * word to zero and then we need to do one more run of the 295386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * compression algo. 296386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 297386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (ctx->octets_in_buffer < 56) 298386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari W[15] = ctx->num_bits_in_msg; 299386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari else if (ctx->octets_in_buffer < 60) 300386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari W[15] = 0x0; 301386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 302386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* process the word array */ 303386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari for (t=16; t < 80; t++) { 304386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari TEMP = W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16]; 305386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari W[t] = S1(TEMP); 306386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 307386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 308386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari A = ctx->H[0]; 309386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari B = ctx->H[1]; 310386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari C = ctx->H[2]; 311386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari D = ctx->H[3]; 312386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari E = ctx->H[4]; 313386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 314386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari for (t=0; t < 20; t++) { 315386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari TEMP = S5(A) + f0(B,C,D) + E + W[t] + SHA_K0; 316386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari E = D; D = C; C = S30(B); B = A; A = TEMP; 317386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 318386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari for ( ; t < 40; t++) { 319386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari TEMP = S5(A) + f1(B,C,D) + E + W[t] + SHA_K1; 320386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari E = D; D = C; C = S30(B); B = A; A = TEMP; 321386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 322386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari for ( ; t < 60; t++) { 323386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari TEMP = S5(A) + f2(B,C,D) + E + W[t] + SHA_K2; 324386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari E = D; D = C; C = S30(B); B = A; A = TEMP; 325386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 326386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari for ( ; t < 80; t++) { 327386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari TEMP = S5(A) + f3(B,C,D) + E + W[t] + SHA_K3; 328386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari E = D; D = C; C = S30(B); B = A; A = TEMP; 329386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 330386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 331386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari ctx->H[0] += A; 332386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari ctx->H[1] += B; 333386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari ctx->H[2] += C; 334386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari ctx->H[3] += D; 335386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari ctx->H[4] += E; 336386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 337386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 338386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 339386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari debug_print(mod_sha1, "(final) running sha1_core()", NULL); 340386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 341386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari if (ctx->octets_in_buffer >= 56) { 342386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 343386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari debug_print(mod_sha1, "(final) running sha1_core() again", NULL); 344386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 345386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* we need to do one final run of the compression algo */ 346386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 347386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* 348386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * set initial part of word array to zeros, and set the 349386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * final part to the number of bits in the message 350386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */ 351386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari for (i=0; i < 15; i++) 352386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari W[i] = 0x0; 353386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari W[15] = ctx->num_bits_in_msg; 354386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 355386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* process the word array */ 356386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari for (t=16; t < 80; t++) { 357386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari TEMP = W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16]; 358386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari W[t] = S1(TEMP); 359386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 360386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 361386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari A = ctx->H[0]; 362386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari B = ctx->H[1]; 363386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari C = ctx->H[2]; 364386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari D = ctx->H[3]; 365386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari E = ctx->H[4]; 366386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 367386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari for (t=0; t < 20; t++) { 368386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari TEMP = S5(A) + f0(B,C,D) + E + W[t] + SHA_K0; 369386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari E = D; D = C; C = S30(B); B = A; A = TEMP; 370386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 371386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari for ( ; t < 40; t++) { 372386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari TEMP = S5(A) + f1(B,C,D) + E + W[t] + SHA_K1; 373386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari E = D; D = C; C = S30(B); B = A; A = TEMP; 374386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 375386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari for ( ; t < 60; t++) { 376386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari TEMP = S5(A) + f2(B,C,D) + E + W[t] + SHA_K2; 377386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari E = D; D = C; C = S30(B); B = A; A = TEMP; 378386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 379386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari for ( ; t < 80; t++) { 380386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari TEMP = S5(A) + f3(B,C,D) + E + W[t] + SHA_K3; 381386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari E = D; D = C; C = S30(B); B = A; A = TEMP; 382386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 383386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 384386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari ctx->H[0] += A; 385386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari ctx->H[1] += B; 386386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari ctx->H[2] += C; 387386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari ctx->H[3] += D; 388386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari ctx->H[4] += E; 389386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari } 390386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 391386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* copy result into output buffer */ 392386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari output[0] = be32_to_cpu(ctx->H[0]); 393386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari output[1] = be32_to_cpu(ctx->H[1]); 394386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari output[2] = be32_to_cpu(ctx->H[2]); 395386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari output[3] = be32_to_cpu(ctx->H[3]); 396386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari output[4] = be32_to_cpu(ctx->H[4]); 397386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 398386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari /* indicate that message buffer in context is empty */ 399386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari ctx->octets_in_buffer = 0; 400386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 401386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari return; 402386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari} 403386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 404386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 405386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 406