/src/libressl/crypto/evp/m_md5_sha1.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* $OpenBSD: m_md5_sha1.c,v 1.4 2022/01/14 08:38:06 tb Exp $ */ |
2 | | /* |
3 | | * Copyright (c) 2017 Joel Sing <jsing@openbsd.org> |
4 | | * |
5 | | * Permission to use, copy, modify, and distribute this software for any |
6 | | * purpose with or without fee is hereby granted, provided that the above |
7 | | * copyright notice and this permission notice appear in all copies. |
8 | | * |
9 | | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
10 | | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
11 | | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
12 | | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
13 | | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
14 | | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
15 | | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
16 | | */ |
17 | | |
18 | | #include <openssl/evp.h> |
19 | | #include <openssl/md5.h> |
20 | | #include <openssl/objects.h> |
21 | | #include <openssl/sha.h> |
22 | | |
23 | | #ifndef OPENSSL_NO_RSA |
24 | | #include <openssl/rsa.h> |
25 | | #endif |
26 | | |
27 | | #include "evp_locl.h" |
28 | | |
29 | | struct md5_sha1_ctx { |
30 | | MD5_CTX md5; |
31 | | SHA_CTX sha1; |
32 | | }; |
33 | | |
34 | | static int |
35 | | md5_sha1_init(EVP_MD_CTX *ctx) |
36 | 2.02k | { |
37 | 2.02k | struct md5_sha1_ctx *mdctx = ctx->md_data; |
38 | | |
39 | 2.02k | if (!MD5_Init(&mdctx->md5)) |
40 | 0 | return 0; |
41 | 2.02k | if (!SHA1_Init(&mdctx->sha1)) |
42 | 0 | return 0; |
43 | | |
44 | 2.02k | return 1; |
45 | 2.02k | } |
46 | | |
47 | | static int |
48 | | md5_sha1_update(EVP_MD_CTX *ctx, const void *data, size_t count) |
49 | 10.1k | { |
50 | 10.1k | struct md5_sha1_ctx *mdctx = ctx->md_data; |
51 | | |
52 | 10.1k | if (!MD5_Update(&mdctx->md5, data, count)) |
53 | 0 | return 0; |
54 | 10.1k | if (!SHA1_Update(&mdctx->sha1, data, count)) |
55 | 0 | return 0; |
56 | | |
57 | 10.1k | return 1; |
58 | 10.1k | } |
59 | | |
60 | | static int |
61 | | md5_sha1_final(EVP_MD_CTX *ctx, unsigned char *out) |
62 | 676 | { |
63 | 676 | struct md5_sha1_ctx *mdctx = ctx->md_data; |
64 | | |
65 | 676 | if (!MD5_Final(out, &mdctx->md5)) |
66 | 0 | return 0; |
67 | 676 | if (!SHA1_Final(out + MD5_DIGEST_LENGTH, &mdctx->sha1)) |
68 | 0 | return 0; |
69 | | |
70 | 676 | return 1; |
71 | 676 | } |
72 | | |
73 | | static const EVP_MD md5_sha1_md = { |
74 | | .type = NID_md5_sha1, |
75 | | .pkey_type = NID_md5_sha1, |
76 | | .md_size = MD5_DIGEST_LENGTH + SHA_DIGEST_LENGTH, |
77 | | .flags = 0, |
78 | | .init = md5_sha1_init, |
79 | | .update = md5_sha1_update, |
80 | | .final = md5_sha1_final, |
81 | | .block_size = MD5_CBLOCK, /* MD5_CBLOCK == SHA_CBLOCK */ |
82 | | .ctx_size = sizeof(EVP_MD *) + sizeof(struct md5_sha1_ctx), |
83 | | }; |
84 | | |
85 | | const EVP_MD * |
86 | | EVP_md5_sha1(void) |
87 | 2.64k | { |
88 | 2.64k | return &md5_sha1_md; |
89 | 2.64k | } |