11b8d9b87Sopenharmony_ci/*
21b8d9b87Sopenharmony_ci * Copyright (C) 2024 Huawei Device Co., Ltd.
31b8d9b87Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
41b8d9b87Sopenharmony_ci * you may not use this file except in compliance with the License.
51b8d9b87Sopenharmony_ci * You may obtain a copy of the License at
61b8d9b87Sopenharmony_ci *
71b8d9b87Sopenharmony_ci *    http://www.apache.org/licenses/LICENSE-2.0
81b8d9b87Sopenharmony_ci *
91b8d9b87Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
101b8d9b87Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
111b8d9b87Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
121b8d9b87Sopenharmony_ci * See the License for the specific language governing permissions and
131b8d9b87Sopenharmony_ci * limitations under the License.
141b8d9b87Sopenharmony_ci */
151b8d9b87Sopenharmony_ci
161b8d9b87Sopenharmony_ci#include "crypto_digest.h"
171b8d9b87Sopenharmony_ci#include "md.h"
181b8d9b87Sopenharmony_ci#include "crypto_common.h"
191b8d9b87Sopenharmony_ci#include "blob.h"
201b8d9b87Sopenharmony_ci#include "object_base.h"
211b8d9b87Sopenharmony_ci#include "result.h"
221b8d9b87Sopenharmony_ci#include "native_common.h"
231b8d9b87Sopenharmony_ci
241b8d9b87Sopenharmony_cistruct OH_CryptoDigest {
251b8d9b87Sopenharmony_ci    HcfObjectBase base;
261b8d9b87Sopenharmony_ci
271b8d9b87Sopenharmony_ci    HcfResult (*update)(HcfMd *self, HcfBlob *input);
281b8d9b87Sopenharmony_ci
291b8d9b87Sopenharmony_ci    HcfResult (*doFinal)(HcfMd *self, HcfBlob *output);
301b8d9b87Sopenharmony_ci
311b8d9b87Sopenharmony_ci    uint32_t (*getMdLength)(HcfMd *self);
321b8d9b87Sopenharmony_ci
331b8d9b87Sopenharmony_ci    const char *(*getAlgoName)(HcfMd *self);
341b8d9b87Sopenharmony_ci};
351b8d9b87Sopenharmony_ci
361b8d9b87Sopenharmony_ciOH_Crypto_ErrCode OH_CryptoDigest_Create(const char *algoName, OH_CryptoDigest **ctx)
371b8d9b87Sopenharmony_ci{
381b8d9b87Sopenharmony_ci    if (ctx == NULL) {
391b8d9b87Sopenharmony_ci        return CRYPTO_INVALID_PARAMS;
401b8d9b87Sopenharmony_ci    }
411b8d9b87Sopenharmony_ci    HcfResult ret = HcfMdCreate(algoName, (HcfMd **)ctx);
421b8d9b87Sopenharmony_ci    return GetOhCryptoErrCode(ret);
431b8d9b87Sopenharmony_ci}
441b8d9b87Sopenharmony_ci
451b8d9b87Sopenharmony_ciOH_Crypto_ErrCode OH_CryptoDigest_Update(OH_CryptoDigest *ctx, Crypto_DataBlob *in)
461b8d9b87Sopenharmony_ci{
471b8d9b87Sopenharmony_ci    if ((ctx == NULL) || (ctx->update == NULL) || (in == NULL)) {
481b8d9b87Sopenharmony_ci        return CRYPTO_INVALID_PARAMS;
491b8d9b87Sopenharmony_ci    }
501b8d9b87Sopenharmony_ci    HcfResult ret = ctx->update((HcfMd *)ctx, (HcfBlob *)in);
511b8d9b87Sopenharmony_ci    return GetOhCryptoErrCode(ret);
521b8d9b87Sopenharmony_ci}
531b8d9b87Sopenharmony_ci
541b8d9b87Sopenharmony_ciOH_Crypto_ErrCode OH_CryptoDigest_Final(OH_CryptoDigest *ctx, Crypto_DataBlob *out)
551b8d9b87Sopenharmony_ci{
561b8d9b87Sopenharmony_ci    if ((ctx == NULL) || (ctx->doFinal == NULL) || (out == NULL)) {
571b8d9b87Sopenharmony_ci        return CRYPTO_INVALID_PARAMS;
581b8d9b87Sopenharmony_ci    }
591b8d9b87Sopenharmony_ci    HcfResult ret = ctx->doFinal((HcfMd *)ctx, (HcfBlob *)out);
601b8d9b87Sopenharmony_ci    return GetOhCryptoErrCode(ret);
611b8d9b87Sopenharmony_ci}
621b8d9b87Sopenharmony_ci
631b8d9b87Sopenharmony_ciuint32_t OH_CryptoDigest_GetLength(OH_CryptoDigest *ctx)
641b8d9b87Sopenharmony_ci{
651b8d9b87Sopenharmony_ci    if ((ctx == NULL) || (ctx->getMdLength == NULL)) {
661b8d9b87Sopenharmony_ci        return CRYPTO_INVALID_PARAMS;
671b8d9b87Sopenharmony_ci    }
681b8d9b87Sopenharmony_ci    return ctx->getMdLength((HcfMd *)ctx);
691b8d9b87Sopenharmony_ci}
701b8d9b87Sopenharmony_ci
711b8d9b87Sopenharmony_ciconst char *OH_CryptoDigest_GetAlgoName(OH_CryptoDigest *ctx)
721b8d9b87Sopenharmony_ci{
731b8d9b87Sopenharmony_ci    if ((ctx == NULL) || (ctx->getAlgoName == NULL)) {
741b8d9b87Sopenharmony_ci        return NULL;
751b8d9b87Sopenharmony_ci    }
761b8d9b87Sopenharmony_ci    return ctx->getAlgoName((HcfMd *)ctx);
771b8d9b87Sopenharmony_ci}
781b8d9b87Sopenharmony_ci
791b8d9b87Sopenharmony_civoid OH_DigestCrypto_Destroy(OH_CryptoDigest *ctx)
801b8d9b87Sopenharmony_ci{
811b8d9b87Sopenharmony_ci    if ((ctx == NULL) || (ctx->base.destroy == NULL)) {
821b8d9b87Sopenharmony_ci        return;
831b8d9b87Sopenharmony_ci    }
841b8d9b87Sopenharmony_ci    ctx->base.destroy((HcfObjectBase *)ctx);
851b8d9b87Sopenharmony_ci}