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}