xref: /openbsd-src/lib/libcrypto/evp/m_md5_sha1.c (revision 9bac3682a248384cde711fdda825c3b5960b1005)
1*9bac3682Sbeck /* $OpenBSD: m_md5_sha1.c,v 1.9 2024/04/09 13:52:41 beck Exp $ */
20721f02eSjsing /*
30721f02eSjsing  * Copyright (c) 2017 Joel Sing <jsing@openbsd.org>
40721f02eSjsing  *
50721f02eSjsing  * Permission to use, copy, modify, and distribute this software for any
60721f02eSjsing  * purpose with or without fee is hereby granted, provided that the above
70721f02eSjsing  * copyright notice and this permission notice appear in all copies.
80721f02eSjsing  *
90721f02eSjsing  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
100721f02eSjsing  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
110721f02eSjsing  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
120721f02eSjsing  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
130721f02eSjsing  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
140721f02eSjsing  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
150721f02eSjsing  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
160721f02eSjsing  */
170721f02eSjsing 
180721f02eSjsing #include <openssl/evp.h>
190721f02eSjsing #include <openssl/md5.h>
200721f02eSjsing #include <openssl/objects.h>
210721f02eSjsing #include <openssl/sha.h>
220721f02eSjsing 
2352bc4021Sjsing #ifndef OPENSSL_NO_RSA
2452bc4021Sjsing #include <openssl/rsa.h>
2552bc4021Sjsing #endif
2652bc4021Sjsing 
27c9675a23Stb #include "evp_local.h"
28bc366ef8Stb 
290721f02eSjsing struct md5_sha1_ctx {
300721f02eSjsing 	MD5_CTX md5;
310721f02eSjsing 	SHA_CTX sha1;
320721f02eSjsing };
330721f02eSjsing 
340721f02eSjsing static int
md5_sha1_init(EVP_MD_CTX * ctx)350721f02eSjsing md5_sha1_init(EVP_MD_CTX *ctx)
360721f02eSjsing {
370721f02eSjsing 	struct md5_sha1_ctx *mdctx = ctx->md_data;
380721f02eSjsing 
390721f02eSjsing 	if (!MD5_Init(&mdctx->md5))
400721f02eSjsing 		return 0;
410721f02eSjsing 	if (!SHA1_Init(&mdctx->sha1))
420721f02eSjsing 		return 0;
430721f02eSjsing 
440721f02eSjsing 	return 1;
450721f02eSjsing }
460721f02eSjsing 
470721f02eSjsing static int
md5_sha1_update(EVP_MD_CTX * ctx,const void * data,size_t count)480721f02eSjsing md5_sha1_update(EVP_MD_CTX *ctx, const void *data, size_t count)
490721f02eSjsing {
500721f02eSjsing 	struct md5_sha1_ctx *mdctx = ctx->md_data;
510721f02eSjsing 
520721f02eSjsing 	if (!MD5_Update(&mdctx->md5, data, count))
530721f02eSjsing 		return 0;
540721f02eSjsing 	if (!SHA1_Update(&mdctx->sha1, data, count))
550721f02eSjsing 		return 0;
560721f02eSjsing 
570721f02eSjsing 	return 1;
580721f02eSjsing }
590721f02eSjsing 
600721f02eSjsing static int
md5_sha1_final(EVP_MD_CTX * ctx,unsigned char * out)610721f02eSjsing md5_sha1_final(EVP_MD_CTX *ctx, unsigned char *out)
620721f02eSjsing {
630721f02eSjsing 	struct md5_sha1_ctx *mdctx = ctx->md_data;
640721f02eSjsing 
650721f02eSjsing 	if (!MD5_Final(out, &mdctx->md5))
660721f02eSjsing 		return 0;
670721f02eSjsing 	if (!SHA1_Final(out + MD5_DIGEST_LENGTH, &mdctx->sha1))
680721f02eSjsing 		return 0;
690721f02eSjsing 
700721f02eSjsing 	return 1;
710721f02eSjsing }
720721f02eSjsing 
730721f02eSjsing static const EVP_MD md5_sha1_md = {
740721f02eSjsing         .type = NID_md5_sha1,
750721f02eSjsing         .pkey_type = NID_md5_sha1,
760721f02eSjsing         .md_size = MD5_DIGEST_LENGTH + SHA_DIGEST_LENGTH,
770721f02eSjsing         .flags = 0,
780721f02eSjsing         .init = md5_sha1_init,
790721f02eSjsing         .update = md5_sha1_update,
800721f02eSjsing         .final = md5_sha1_final,
810721f02eSjsing         .block_size = MD5_CBLOCK, /* MD5_CBLOCK == SHA_CBLOCK */
820721f02eSjsing         .ctx_size = sizeof(EVP_MD *) + sizeof(struct md5_sha1_ctx),
830721f02eSjsing };
840721f02eSjsing 
850721f02eSjsing const EVP_MD *
EVP_md5_sha1(void)860721f02eSjsing EVP_md5_sha1(void)
870721f02eSjsing {
880721f02eSjsing 	return &md5_sha1_md;
890721f02eSjsing }
90*9bac3682Sbeck LCRYPTO_ALIAS(EVP_md5_sha1);
91