5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome/* -*- Mode: C; tab-width: 4 -*-
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome *
cda73f64f20b8a0afc4909f5ea1f055ec7913856Toomas Soome * Copyright (c) 2011-2012 Apple Inc. All rights reserved.
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome *
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome * Licensed under the Apache License, Version 2.0 (the "License");
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome * you may not use this file except in compliance with the License.
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome * You may obtain a copy of the License at
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome *
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome * http://www.apache.org/licenses/LICENSE-2.0
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome *
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome * Unless required by applicable law or agreed to in writing, software
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome * distributed under the License is distributed on an "AS IS" BASIS,
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome * See the License for the specific language governing permissions and
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome * limitations under the License.
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome */
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// ***************************************************************************
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// CryptoAlg.c:
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// Interface to DNSSEC cryptographic algorithms. The crypto support itself is
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// provided by the platform and the functions in this file just provide an
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// interface to access them in a more generic way.
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome// ***************************************************************************
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome#include "mDNSEmbeddedAPI.h"
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome#include "CryptoAlg.h"
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas SoomeAlgFuncs *DigestAlgFuncs[DIGEST_TYPE_MAX];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas SoomeAlgFuncs *CryptoAlgFuncs[CRYPTO_ALG_MAX];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas SoomeAlgFuncs *EncAlgFuncs[ENC_ALG_MAX];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas SoomemDNSexport mStatus DigestAlgInit(mDNSu8 digestType, AlgFuncs *func)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (digestType >= DIGEST_TYPE_MAX)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome LogMsg("DigestAlgInit: digestType %d exceeds bounds", digestType);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome return mStatus_BadParamErr;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome // As digestTypes may not be consecutive, check for specific digest types
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome // that we support
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (digestType != SHA1_DIGEST_TYPE &&
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome digestType != SHA256_DIGEST_TYPE)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome LogMsg("DigestAlgInit: digestType %d not supported", digestType);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome return mStatus_BadParamErr;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome DigestAlgFuncs[digestType] = func;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome return mStatus_NoError;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas SoomemDNSexport mStatus CryptoAlgInit(mDNSu8 alg, AlgFuncs *func)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (alg >= CRYPTO_ALG_MAX)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome LogMsg("CryptoAlgInit: alg %d exceeds bounds", alg);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome return mStatus_BadParamErr;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome // As algs may not be consecutive, check for specific algorithms
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome // that we support
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (alg != CRYPTO_RSA_SHA1 && alg != CRYPTO_RSA_SHA256 && alg != CRYPTO_RSA_SHA512 &&
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome alg != CRYPTO_DSA_NSEC3_SHA1 && alg != CRYPTO_RSA_NSEC3_SHA1)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome LogMsg("CryptoAlgInit: alg %d not supported", alg);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome return mStatus_BadParamErr;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome CryptoAlgFuncs[alg] = func;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome return mStatus_NoError;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas SoomemDNSexport mStatus EncAlgInit(mDNSu8 alg, AlgFuncs *func)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (alg >= ENC_ALG_MAX)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome LogMsg("EncAlgInit: alg %d exceeds bounds", alg);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome return mStatus_BadParamErr;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome // As algs may not be consecutive, check for specific algorithms
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome // that we support
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (alg != ENC_BASE32 && alg != ENC_BASE64)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome LogMsg("EncAlgInit: alg %d not supported", alg);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome return mStatus_BadParamErr;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome EncAlgFuncs[alg] = func;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome return mStatus_NoError;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas SoomemDNSexport AlgContext *AlgCreate(AlgType type, mDNSu8 alg)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome AlgFuncs *func = mDNSNULL;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome AlgContext *ctx;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (type == CRYPTO_ALG)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (alg >= CRYPTO_ALG_MAX) return mDNSNULL;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome func = CryptoAlgFuncs[alg];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome else if (type == DIGEST_ALG)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (alg >= DIGEST_TYPE_MAX) return mDNSNULL;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome func = DigestAlgFuncs[alg];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome else if (type == ENC_ALG)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (alg >= ENC_ALG_MAX) return mDNSNULL;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome func = EncAlgFuncs[alg];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (!func)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome // If there is no support from the platform, this case can happen.
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome LogInfo("AlgCreate: func is NULL");
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome return mDNSNULL;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (func->Create)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome mStatus err;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome ctx = mDNSPlatformMemAllocate(sizeof(AlgContext));
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (!ctx) return mDNSNULL;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome // Create expects ctx->alg to be initialized
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome ctx->alg = alg;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome err = func->Create(ctx);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (err == mStatus_NoError)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome ctx->type = type;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome return ctx;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome mDNSPlatformMemFree(ctx);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome return mDNSNULL;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas SoomemDNSexport mStatus AlgDestroy(AlgContext *ctx)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome AlgFuncs *func = mDNSNULL;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (ctx->type == CRYPTO_ALG)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome func = CryptoAlgFuncs[ctx->alg];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome else if (ctx->type == DIGEST_ALG)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome func = DigestAlgFuncs[ctx->alg];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome else if (ctx->type == ENC_ALG)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome func = EncAlgFuncs[ctx->alg];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (!func)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome LogMsg("AlgDestroy: ERROR!! func is NULL");
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome mDNSPlatformMemFree(ctx);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome return mStatus_BadParamErr;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (func->Destroy)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome func->Destroy(ctx);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome mDNSPlatformMemFree(ctx);
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome return mStatus_NoError;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas SoomemDNSexport mDNSu32 AlgLength(AlgContext *ctx)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome AlgFuncs *func = mDNSNULL;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (ctx->type == CRYPTO_ALG)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome func = CryptoAlgFuncs[ctx->alg];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome else if (ctx->type == DIGEST_ALG)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome func = DigestAlgFuncs[ctx->alg];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome else if (ctx->type == ENC_ALG)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome func = EncAlgFuncs[ctx->alg];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome // This should never happen as AlgCreate would have failed
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (!func)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome LogMsg("AlgLength: ERROR!! func is NULL");
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome return 0;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (func->Length)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome return (func->Length(ctx));
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome else
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome return 0;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas SoomemDNSexport mStatus AlgAdd(AlgContext *ctx, const void *data, mDNSu32 len)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome AlgFuncs *func = mDNSNULL;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (ctx->type == CRYPTO_ALG)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome func = CryptoAlgFuncs[ctx->alg];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome else if (ctx->type == DIGEST_ALG)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome func = DigestAlgFuncs[ctx->alg];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome else if (ctx->type == ENC_ALG)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome func = EncAlgFuncs[ctx->alg];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome // This should never happen as AlgCreate would have failed
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (!func)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome LogMsg("AlgAdd: ERROR!! func is NULL");
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome return mStatus_BadParamErr;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (func->Add)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome return (func->Add(ctx, data, len));
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome else
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome return mStatus_BadParamErr;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas SoomemDNSexport mStatus AlgVerify(AlgContext *ctx, mDNSu8 *key, mDNSu32 keylen, mDNSu8 *signature, mDNSu32 siglen)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome AlgFuncs *func = mDNSNULL;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (ctx->type == CRYPTO_ALG)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome func = CryptoAlgFuncs[ctx->alg];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome else if (ctx->type == DIGEST_ALG)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome func = DigestAlgFuncs[ctx->alg];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome else if (ctx->type == ENC_ALG)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome func = EncAlgFuncs[ctx->alg];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome // This should never happen as AlgCreate would have failed
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (!func)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome LogMsg("AlgVerify: ERROR!! func is NULL");
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome return mStatus_BadParamErr;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (func->Verify)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome return (func->Verify(ctx, key, keylen, signature, siglen));
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome else
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome return mStatus_BadParamErr;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas SoomemDNSexport mDNSu8* AlgEncode(AlgContext *ctx)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome AlgFuncs *func = mDNSNULL;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (ctx->type == CRYPTO_ALG)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome func = CryptoAlgFuncs[ctx->alg];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome else if (ctx->type == DIGEST_ALG)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome func = DigestAlgFuncs[ctx->alg];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome else if (ctx->type == ENC_ALG)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome func = EncAlgFuncs[ctx->alg];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome // This should never happen as AlgCreate would have failed
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (!func)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome LogMsg("AlgEncode: ERROR!! func is NULL");
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome return mDNSNULL;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (func->Encode)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome return (func->Encode(ctx));
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome else
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome return mDNSNULL;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas SoomemDNSexport mStatus AlgFinal(AlgContext *ctx, void *data, mDNSu32 len)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome{
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome AlgFuncs *func = mDNSNULL;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (ctx->type == CRYPTO_ALG)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome func = CryptoAlgFuncs[ctx->alg];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome else if (ctx->type == DIGEST_ALG)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome func = DigestAlgFuncs[ctx->alg];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome else if (ctx->type == ENC_ALG)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome func = EncAlgFuncs[ctx->alg];
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome // This should never happen as AlgCreate would have failed
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (!func)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome {
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome LogMsg("AlgEncode: ERROR!! func is NULL");
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome return mDNSNULL;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome }
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome if (func->Final)
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome return (func->Final(ctx, data, len));
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome else
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome return mStatus_BadParamErr;
5ffb0c9b03b5149ff4f5821a62be4a52408ada2aToomas Soome}