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