1///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2//  LibSha1
3//
4//  Implementation of SHA1 hash function.
5//  Original author:  Steve Reid <sreid@sea-to-sky.net>
6//  Contributions by: James H. Brown <jbrown@burgoyne.com>, Saul Kravitz <Saul.Kravitz@celera.com>,
7//  and Ralph Giles <giles@ghostscript.com>
8//  Modified by WaterJuice retaining Public Domain license.
9//
10//  This is free and unencumbered software released into the public domain - June 2013 waterjuice.org
11///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
12
13#ifndef _sha1_h_
14#define _sha1_h_
15
16///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
17//  IMPORTS
18///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
19
20#include <stdint.h>
21#include <stdio.h>
22
23///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
24//  TYPES
25///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
26
27// Sha1Context - This must be initialised using Sha1Initialised. Do not modify the contents of this structure directly.
28typedef struct
29{
30    uint32_t        State[5];
31    uint32_t        Count[2];
32    uint8_t         Buffer[64];
33} Sha1Context;
34
35#define SHA1_HASH_SIZE           ( 160 / 8 )
36
37typedef struct
38{
39    uint8_t      bytes [SHA1_HASH_SIZE];
40} SHA1_HASH;
41
42///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
43//  PUBLIC FUNCTIONS
44///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
45
46///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
47//  Sha1Initialise
48//
49//  Initialises an SHA1 Context. Use this to initialise/reset a context.
50///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
51void
52    Sha1Initialise
53    (
54        Sha1Context*                Context
55    );
56
57///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
58//  Sha1Update
59//
60//  Adds data to the SHA1 context. This will process the data and update the internal state of the context. Keep on
61//  calling this function until all the data has been added. Then call Sha1Finalise to calculate the hash.
62///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
63void
64    Sha1Update
65    (
66        Sha1Context*        Context,
67        void*               Buffer,
68        uint32_t            BufferSize
69    );
70
71///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
72//  Sha1Finalise
73//
74//  Performs the final calculation of the hash and returns the digest (20 byte buffer containing 160bit hash). After
75//  calling this, Sha1Initialised must be used to reuse the context.
76///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
77void
78    Sha1Finalise
79    (
80        Sha1Context*                Context,
81        SHA1_HASH*                  Digest
82    );
83
84///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
85#endif //_sha1_h_
86