xref: /netbsd/external/mpl/bind/dist/lib/isc/include/isc/md.h (revision c0b5d9fb)
1 /*	$NetBSD: md.h,v 1.5 2022/09/23 12:15:33 christos Exp $	*/
2 
3 /*
4  * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
5  *
6  * SPDX-License-Identifier: MPL-2.0
7  *
8  * This Source Code Form is subject to the terms of the Mozilla Public
9  * License, v. 2.0. If a copy of the MPL was not distributed with this
10  * file, you can obtain one at https://mozilla.org/MPL/2.0/.
11  *
12  * See the COPYRIGHT file distributed with this work for additional
13  * information regarding copyright ownership.
14  */
15 
16 /*!
17  * \file isc/md.h
18  * \brief This is the header file for message digest algorithms.
19  */
20 
21 #pragma once
22 
23 #include <isc/lang.h>
24 #include <isc/platform.h>
25 #include <isc/result.h>
26 #include <isc/types.h>
27 
28 typedef void isc_md_t;
29 
30 /**
31  * isc_md_type_t:
32  * @ISC_MD_MD5: MD5
33  * @ISC_MD_SHA1: SHA-1
34  * @ISC_MD_SHA224: SHA-224
35  * @ISC_MD_SHA256: SHA-256
36  * @ISC_MD_SHA384: SHA-384
37  * @ISC_MD_SHA512: SHA-512
38  *
39  * Enumeration of supported message digest algorithms.
40  */
41 typedef void isc_md_type_t;
42 
43 #define ISC_MD_MD5    isc__md_md5()
44 #define ISC_MD_SHA1   isc__md_sha1()
45 #define ISC_MD_SHA224 isc__md_sha224()
46 #define ISC_MD_SHA256 isc__md_sha256()
47 #define ISC_MD_SHA384 isc__md_sha384()
48 #define ISC_MD_SHA512 isc__md_sha512()
49 
50 const isc_md_type_t *
51 isc__md_md5(void);
52 const isc_md_type_t *
53 isc__md_sha1(void);
54 const isc_md_type_t *
55 isc__md_sha224(void);
56 const isc_md_type_t *
57 isc__md_sha256(void);
58 const isc_md_type_t *
59 isc__md_sha384(void);
60 const isc_md_type_t *
61 isc__md_sha512(void);
62 
63 #define ISC_MD5_DIGESTLENGTH	isc_md_type_get_size(ISC_MD_MD5)
64 #define ISC_MD5_BLOCK_LENGTH	isc_md_type_get_block_size(ISC_MD_MD5)
65 #define ISC_SHA1_DIGESTLENGTH	isc_md_type_get_size(ISC_MD_SHA1)
66 #define ISC_SHA1_BLOCK_LENGTH	isc_md_type_get_block_size(ISC_MD_SHA1)
67 #define ISC_SHA224_DIGESTLENGTH isc_md_type_get_size(ISC_MD_SHA224)
68 #define ISC_SHA224_BLOCK_LENGTH isc_md_type_get_block_size(ISC_MD_SHA224)
69 #define ISC_SHA256_DIGESTLENGTH isc_md_type_get_size(ISC_MD_SHA256)
70 #define ISC_SHA256_BLOCK_LENGTH isc_md_type_get_block_size(ISC_MD_SHA256)
71 #define ISC_SHA384_DIGESTLENGTH isc_md_type_get_size(ISC_MD_SHA384)
72 #define ISC_SHA384_BLOCK_LENGTH isc_md_type_get_block_size(ISC_MD_SHA384)
73 #define ISC_SHA512_DIGESTLENGTH isc_md_type_get_size(ISC_MD_SHA512)
74 #define ISC_SHA512_BLOCK_LENGTH isc_md_type_get_block_size(ISC_MD_SHA512)
75 
76 #define ISC_MAX_MD_SIZE	   64U	/* EVP_MAX_MD_SIZE */
77 #define ISC_MAX_BLOCK_SIZE 128U /* ISC_SHA512_BLOCK_LENGTH */
78 
79 /**
80  * isc_md:
81  * @type: the digest type
82  * @buf: the data to hash
83  * @len: the length of the data to hash
84  * @digest: the output buffer
85  * @digestlen: the length of the data written to @digest
86  *
87  * This function hashes @len bytes of data at @buf and places the result in
88  * @digest.  If the @digestlen parameter is not NULL then the number of bytes of
89  * data written (i.e. the length of the digest) will be written to the integer
90  * at @digestlen, at most ISC_MAX_MD_SIZE bytes will be written.
91  */
92 isc_result_t
93 isc_md(const isc_md_type_t *type, const unsigned char *buf, const size_t len,
94        unsigned char *digest, unsigned int *digestlen);
95 
96 /**
97  * isc_md_new:
98  *
99  * This function allocates, initializes and returns a digest context.
100  */
101 isc_md_t *
102 isc_md_new(void);
103 
104 /**
105  * isc_md_free:
106  * @md: message digest context
107  *
108  * This function cleans up digest context ctx and frees up the space allocated
109  * to it.
110  */
111 void
112 isc_md_free(isc_md_t *);
113 
114 /**
115  * isc_md_init:
116  * @md: message digest context
117  * @type: digest type
118  *
119  * This function sets up digest context @md to use a digest @type. @md must be
120  * initialized before calling this function.
121  */
122 isc_result_t
123 isc_md_init(isc_md_t *, const isc_md_type_t *md_type);
124 
125 /**
126  * isc_md_reset:
127  * @md: message digest context
128  *
129  * This function resets the digest context ctx. This can be used to reuse an
130  * already existing context.
131  */
132 isc_result_t
133 isc_md_reset(isc_md_t *md);
134 
135 /**
136  * isc_md_update:
137  * @md: message digest context
138  * @buf: data to hash
139  * @len: length of the data to hash
140  *
141  * This function hashes @len bytes of data at @buf into the digest context @md.
142  * This function can be called several times on the same @md to hash additional
143  * data.
144  */
145 isc_result_t
146 isc_md_update(isc_md_t *md, const unsigned char *buf, const size_t len);
147 
148 /**
149  * isc_md_final:
150  * @md: message digest context
151  * @digest: the output buffer
152  * @digestlen: the length of the data written to @digest
153  *
154  * This function retrieves the digest value from @md and places it in @digest.
155  * If the @digestlen parameter is not NULL then the number of bytes of data
156  * written (i.e. the length of the digest) will be written to the integer at
157  * @digestlen, at most ISC_MAX_MD_SIZE bytes will be written.  After calling
158  * this function no additional calls to isc_md_update() can be made.
159  */
160 isc_result_t
161 isc_md_final(isc_md_t *md, unsigned char *digest, unsigned int *digestlen);
162 
163 /**
164  * isc_md_get_type:
165  * @md: message digest contezt
166  *
167  * This function return the isc_md_type_t previously set for the supplied
168  * message digest context or NULL if no isc_md_type_t has been set.
169  */
170 const isc_md_type_t *
171 isc_md_get_md_type(isc_md_t *md);
172 
173 /**
174  * isc_md_size:
175  *
176  * This function return the size of the message digest when passed an isc_md_t
177  * structure, i.e. the size of the hash.
178  */
179 size_t
180 isc_md_get_size(isc_md_t *md);
181 
182 /**
183  * isc_md_block_size:
184  *
185  * This function return the block size of the message digest when passed an
186  * isc_md_t structure.
187  */
188 size_t
189 isc_md_get_block_size(isc_md_t *md);
190 
191 /**
192  * isc_md_size:
193  *
194  * This function return the size of the message digest when passed an
195  * isc_md_type_t , i.e. the size of the hash.
196  */
197 size_t
198 isc_md_type_get_size(const isc_md_type_t *md_type);
199 
200 /**
201  * isc_md_block_size:
202  *
203  * This function return the block size of the message digest when passed an
204  * isc_md_type_t.
205  */
206 size_t
207 isc_md_type_get_block_size(const isc_md_type_t *md_type);
208