diff options
Diffstat (limited to 'src/dkim.cpp')
-rw-r--r-- | src/dkim.cpp | 197 |
1 files changed, 197 insertions, 0 deletions
diff --git a/src/dkim.cpp b/src/dkim.cpp new file mode 100644 index 0000000..8f36644 --- /dev/null +++ b/src/dkim.cpp @@ -0,0 +1,197 @@ +/***************************************************************************** +* Copyright 2005 Alt-N Technologies, Ltd. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* This code incorporates intellectual property owned by Yahoo! and licensed +* pursuant to the Yahoo! DomainKeys Patent License Agreement. +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +* Changes done by ¢feh@fehcom.de obeying the above license +* +*****************************************************************************/ +#include <string.h> +#include "dkim.h" +#include "dkimsign.h" +#include "dkimverify.h" + +#define DKIMID ('D' | 'K'<<8 | 'I'<<16 | 'M'<<24) +/* taken from removed file "ressource.h" */ +#ifdef VERSION +#define VERSION_STRING VERSION +#else +#define VERSION_STRING "1.4.0" +#endif + +static void InitContext(DKIMContext* pContext,bool bSign,void* pObject) +{ + pContext->reserved1 = DKIMID; + pContext->reserved2 = bSign ? 1 : 0; + pContext->reserved3 = pObject; +} + +static void* ValidateContext(DKIMContext* pContext,bool bSign) +{ + if (pContext->reserved1 != DKIMID) + return NULL; + + if (pContext->reserved2 != (unsigned int)(bSign ? 1 : 0)) + return NULL; + + return pContext->reserved3; +} + +int DKIM_CALL DKIMSignInit(DKIMContext* pSignContext,DKIMSignOptions* pOptions) +{ + int nRet = DKIM_OUT_OF_MEMORY; + + CDKIMSign* pSign = new CDKIMSign; + + if (pSign) { + nRet = pSign->Init(pOptions); + if (nRet != DKIM_SUCCESS) + delete pSign; + } + + if (nRet == DKIM_SUCCESS) { InitContext(pSignContext,true,pSign); } + return nRet; +} + +int DKIM_CALL DKIMSignProcess(DKIMContext* pSignContext,char* szBuffer,int nBufLength) +{ + CDKIMSign* pSign = (CDKIMSign*)ValidateContext(pSignContext,true); + + if (pSign) { return pSign->Process(szBuffer,nBufLength,false); } + return DKIM_INVALID_CONTEXT; +} + +int DKIM_CALL DKIMSignGetSig2(DKIMContext* pSignContext,char* szRSAPrivKey,char* szECCPrivKey,char** pszSignature) +{ + CDKIMSign* pSign = (CDKIMSign*)ValidateContext(pSignContext,true); + + if (pSign) { return pSign->GetSig2(szRSAPrivKey,szECCPrivKey,pszSignature); } + return DKIM_INVALID_CONTEXT; +} + +void DKIM_CALL DKIMSignFree(DKIMContext* pSignContext) +{ + CDKIMSign* pSign = (CDKIMSign*)ValidateContext(pSignContext,true); + + if (pSign) { + delete pSign; + pSignContext->reserved3 = NULL; + } +} + +int DKIM_CALL DKIMVerifyInit(DKIMContext* pVerifyContext,DKIMVerifyOptions* pOptions) +{ + int nRet = DKIM_OUT_OF_MEMORY; + + CDKIMVerify* pVerify = new CDKIMVerify; + + if (pVerify) { + nRet = pVerify->Init(pOptions); + if (nRet != DKIM_SUCCESS) + delete pVerify; + } + + if (nRet == DKIM_SUCCESS) { + InitContext(pVerifyContext,false,pVerify); + } + + return nRet; +} + + +int DKIM_CALL DKIMVerifyProcess(DKIMContext* pVerifyContext,const char* const szBuffer,int nBufLength) +{ + CDKIMVerify* pVerify = (CDKIMVerify*)ValidateContext(pVerifyContext,false); + + if (pVerify) { + return pVerify->Process(szBuffer,nBufLength,false); + } + + return DKIM_INVALID_CONTEXT; +} + +int DKIM_CALL DKIMVerifyResults(DKIMContext* pVerifyContext) +{ + CDKIMVerify* pVerify = (CDKIMVerify*)ValidateContext(pVerifyContext,false); + + if (pVerify) { + return pVerify->GetResults(); + } + return DKIM_INVALID_CONTEXT; +} + +int DKIM_CALL DKIMVerifyGetDetails(DKIMContext* pVerifyContext,int* nSigCount,DKIMVerifyDetails** pDetails,char* szPractices) +{ + szPractices[0] = '\0'; + + CDKIMVerify* pVerify = (CDKIMVerify*)ValidateContext(pVerifyContext,false); + + if (pVerify) { + strcpy(szPractices,pVerify->GetPractices()); + return pVerify->GetDetails(nSigCount,pDetails); + } + + return DKIM_INVALID_CONTEXT; +} + + +void DKIM_CALL DKIMVerifyFree(DKIMContext* pVerifyContext) +{ + CDKIMVerify* pVerify = (CDKIMVerify*)ValidateContext(pVerifyContext,false); + + if (pVerify) { + delete pVerify; + pVerifyContext->reserved3 = NULL; + } +} + +const char* DKIM_CALL DKIMVersion() +{ + return VERSION_STRING; +} + +static const char* DKIMErrorStrings[-1-DKIM_MAX_ERROR] = { + "DKIM_FAIL", + "DKIM_BAD_SYNTAX", + "DKIM_SIGNATURE_BAD", + "DKIM_SIGNATURE_BAD_BUT_TESTING", + "DKIM_SIGNATURE_EXPIRED", + "DKIM_SELECTOR_INVALID", + "DKIM_SELECTOR_GRANULARITY_MISMATCH", + "DKIM_SELECTOR_KEY_REVOKED", + "DKIM_SELECTOR_DOMAIN_NAME_TOO_LONG", + "DKIM_SELECTOR_DNS_TEMP_FAILURE", + "DKIM_SELECTOR_DNS_PERM_FAILURE", + "DKIM_SELECTOR_PUBLIC_KEY_INVALID", + "DKIM_NO_SIGNATURES", + "DKIM_NO_VALID_SIGNATURES", + "DKIM_BODY_HASH_MISMATCH", + "DKIM_SELECTOR_ALGORITHM_MISMATCH", + "DKIM_STAT_INCOMPAT", + "DKIM_UNSIGNED_FROM", + "DKIM_OUT_OF_MEMORY", + "DKIM_INVALID_CONTEXT", + "DKIM_NO_SENDER", + "DKIM_BAD_PRIVATE_KEY", + "DKIM_BUFFER_TOO_SMALL", +}; + +const char* DKIM_CALL DKIMGetErrorString(int ErrorCode) { + if (ErrorCode >= 0 || ErrorCode <= DKIM_MAX_ERROR) + return "Unknown"; + else + return DKIMErrorStrings[-1-ErrorCode]; +} |