xref: /openbsd/usr.bin/dig/lib/isc/sha1.c (revision b9558d14)
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