xref: /spdk/lib/util/md5.c (revision cfa0a248e28dc42bd51b24c4d4ab64e0b5dd7854)
1 /*   SPDX-License-Identifier: BSD-3-Clause
2  *   Copyright (C) 2008-2012 Daisuke Aoyama <aoyama@peach.ne.jp>.
3  *   Copyright (C) 2016 Intel Corporation.
4  *   All rights reserved.
5  */
6 
7 #include "spdk/stdinc.h"
8 #include "spdk/md5.h"
9 #include "spdk/likely.h"
10 
11 int
12 spdk_md5init(struct spdk_md5ctx *md5ctx)
13 {
14 	int rc;
15 
16 	if (spdk_unlikely(md5ctx == NULL)) {
17 		return -1;
18 	}
19 
20 	md5ctx->md5ctx = EVP_MD_CTX_create();
21 	if (spdk_unlikely(md5ctx->md5ctx == NULL)) {
22 		return -1;
23 	}
24 
25 	rc = EVP_DigestInit_ex(md5ctx->md5ctx, EVP_md5(), NULL);
26 	/* For EVP_DigestInit_ex, 1 == success, 0 == failure. */
27 	if (spdk_unlikely(rc == 0)) {
28 		EVP_MD_CTX_destroy(md5ctx->md5ctx);
29 		md5ctx->md5ctx = NULL;
30 		rc = -1;
31 	}
32 	return rc;
33 }
34 
35 int
36 spdk_md5final(void *md5, struct spdk_md5ctx *md5ctx)
37 {
38 	int rc;
39 
40 	if (spdk_unlikely(md5ctx == NULL || md5 == NULL)) {
41 		return -1;
42 	}
43 	rc = EVP_DigestFinal_ex(md5ctx->md5ctx, md5, NULL);
44 	EVP_MD_CTX_destroy(md5ctx->md5ctx);
45 	md5ctx->md5ctx = NULL;
46 	return rc;
47 }
48 
49 int
50 spdk_md5update(struct spdk_md5ctx *md5ctx, const void *data, size_t len)
51 {
52 	int rc;
53 
54 	if (spdk_unlikely(md5ctx == NULL)) {
55 		return -1;
56 	}
57 	if (spdk_unlikely(data == NULL || len == 0)) {
58 		return 0;
59 	}
60 	rc = EVP_DigestUpdate(md5ctx->md5ctx, data, len);
61 	return rc;
62 }
63