1 /*
2 * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
3 *
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
9 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10 * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
11 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
12 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
13 * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14 * PERFORMANCE OF THIS SOFTWARE.
15 */
16
17 /* $Id: sha1.c,v 1.5 2020/02/25 05:00:43 jsg Exp $ */
18
19 /* $NetBSD: sha1.c,v 1.5 2000/01/22 22:19:14 mycroft Exp $ */
20 /* $OpenBSD: sha1.c,v 1.5 2020/02/25 05:00:43 jsg Exp $ */
21
22 /*! \file
23 * SHA-1 in C
24 * \author By Steve Reid <steve@edmweb.com>
25 * 100% Public Domain
26 * \verbatim
27 * Test Vectors (from FIPS PUB 180-1)
28 * "abc"
29 * A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D
30 * "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
31 * 84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1
32 * A million repetitions of "a"
33 * 34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F
34 * \endverbatim
35 */
36
37 #include <isc/sha1.h>
38 #include <string.h>
39 #include <isc/util.h>
40
41 void
isc_sha1_init(isc_sha1_t * context)42 isc_sha1_init(isc_sha1_t *context)
43 {
44 INSIST(context != NULL);
45
46 context->ctx = EVP_MD_CTX_new();
47 RUNTIME_CHECK(context->ctx != NULL);
48 if (EVP_DigestInit(context->ctx, EVP_sha1()) != 1) {
49 FATAL_ERROR(__FILE__, __LINE__, "Cannot initialize SHA1.");
50 }
51 }
52
53 void
isc_sha1_update(isc_sha1_t * context,const unsigned char * data,unsigned int len)54 isc_sha1_update(isc_sha1_t *context, const unsigned char *data,
55 unsigned int len)
56 {
57 INSIST(context != 0);
58 INSIST(context->ctx != 0);
59 INSIST(data != 0);
60
61 RUNTIME_CHECK(EVP_DigestUpdate(context->ctx,
62 (const void *) data,
63 (size_t) len) == 1);
64 }
65
66 void
isc_sha1_final(isc_sha1_t * context,unsigned char * digest)67 isc_sha1_final(isc_sha1_t *context, unsigned char *digest) {
68 INSIST(digest != 0);
69 INSIST(context != 0);
70 INSIST(context->ctx != 0);
71
72 RUNTIME_CHECK(EVP_DigestFinal(context->ctx, digest, NULL) == 1);
73 EVP_MD_CTX_free(context->ctx);
74 context->ctx = NULL;
75 }
76