]>
git.ipfire.org Git - thirdparty/openssl.git/blob - crypto/evp/mac_lib.c
b7bfe8921fcacbbac45ace170ee4feaa5f97c7f0
2 * Copyright 2018-2020 The OpenSSL Project Authors. All Rights Reserved.
4 * Licensed under the Apache License 2.0 (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
12 #include <openssl/evp.h>
13 #include <openssl/err.h>
14 #include <openssl/core.h>
15 #include <openssl/core_names.h>
16 #include <openssl/types.h>
17 #include "internal/nelem.h"
18 #include "crypto/evp.h"
19 #include "internal/provider.h"
20 #include "evp_local.h"
22 EVP_MAC_CTX
*EVP_MAC_CTX_new(EVP_MAC
*mac
)
24 EVP_MAC_CTX
*ctx
= OPENSSL_zalloc(sizeof(EVP_MAC_CTX
));
27 || (ctx
->data
= mac
->newctx(ossl_provider_ctx(mac
->prov
))) == NULL
28 || !EVP_MAC_up_ref(mac
)) {
29 EVPerr(EVP_F_EVP_MAC_CTX_NEW
, ERR_R_MALLOC_FAILURE
);
31 mac
->freectx(ctx
->data
);
40 void EVP_MAC_CTX_free(EVP_MAC_CTX
*ctx
)
43 ctx
->meth
->freectx(ctx
->data
);
46 EVP_MAC_free(ctx
->meth
);
51 EVP_MAC_CTX
*EVP_MAC_CTX_dup(const EVP_MAC_CTX
*src
)
55 if (src
->data
== NULL
)
58 dst
= OPENSSL_malloc(sizeof(*dst
));
60 EVPerr(EVP_F_EVP_MAC_CTX_DUP
, ERR_R_MALLOC_FAILURE
);
65 if (!EVP_MAC_up_ref(dst
->meth
)) {
66 EVPerr(EVP_F_EVP_MAC_CTX_DUP
, ERR_R_MALLOC_FAILURE
);
71 dst
->data
= src
->meth
->dupctx(src
->data
);
72 if (dst
->data
== NULL
) {
73 EVP_MAC_CTX_free(dst
);
80 EVP_MAC
*EVP_MAC_CTX_mac(EVP_MAC_CTX
*ctx
)
85 size_t EVP_MAC_size(EVP_MAC_CTX
*ctx
)
89 if (ctx
->data
!= NULL
) {
90 OSSL_PARAM params
[2] = { OSSL_PARAM_END
, OSSL_PARAM_END
};
92 params
[0] = OSSL_PARAM_construct_size_t(OSSL_MAC_PARAM_SIZE
, &sz
);
93 if (ctx
->meth
->get_ctx_params
!= NULL
) {
94 if (ctx
->meth
->get_ctx_params(ctx
->data
, params
))
96 } else if (ctx
->meth
->get_params
!= NULL
) {
97 if (ctx
->meth
->get_params(params
))
102 * If the MAC hasn't been initialized yet, or there is no size to get,
108 int EVP_MAC_init(EVP_MAC_CTX
*ctx
)
110 return ctx
->meth
->init(ctx
->data
);
113 int EVP_MAC_update(EVP_MAC_CTX
*ctx
, const unsigned char *data
, size_t datalen
)
117 return ctx
->meth
->update(ctx
->data
, data
, datalen
);
120 int EVP_MAC_final(EVP_MAC_CTX
*ctx
,
121 unsigned char *out
, size_t *outl
, size_t outsize
)
123 int l
= EVP_MAC_size(ctx
);
131 return ctx
->meth
->final(ctx
->data
, out
, outl
, outsize
);
135 * The {get,set}_params functions return 1 if there is no corresponding
136 * function in the implementation. This is the same as if there was one,
137 * but it didn't recognise any of the given params, i.e. nothing in the
138 * bag of parameters was useful.
140 int EVP_MAC_get_params(EVP_MAC
*mac
, OSSL_PARAM params
[])
142 if (mac
->get_params
!= NULL
)
143 return mac
->get_params(params
);
147 int EVP_MAC_CTX_get_params(EVP_MAC_CTX
*ctx
, OSSL_PARAM params
[])
149 if (ctx
->meth
->get_ctx_params
!= NULL
)
150 return ctx
->meth
->get_ctx_params(ctx
->data
, params
);
154 int EVP_MAC_CTX_set_params(EVP_MAC_CTX
*ctx
, const OSSL_PARAM params
[])
156 if (ctx
->meth
->set_ctx_params
!= NULL
)
157 return ctx
->meth
->set_ctx_params(ctx
->data
, params
);
161 int EVP_MAC_number(const EVP_MAC
*mac
)
166 int EVP_MAC_is_a(const EVP_MAC
*mac
, const char *name
)
168 return evp_is_a(mac
->prov
, mac
->name_id
, NULL
, name
);
171 void EVP_MAC_names_do_all(const EVP_MAC
*mac
,
172 void (*fn
)(const char *name
, void *data
),
175 if (mac
->prov
!= NULL
)
176 evp_names_do_all(mac
->prov
, mac
->name_id
, fn
, data
);