summaryrefslogtreecommitdiff
path: root/src/dkim.cpp
diff options
context:
space:
mode:
authorJannis Hoffmann <jannis@fehcom.de>2024-07-03 15:48:04 +0200
committerJannis Hoffmann <jannis@fehcom.de>2024-07-03 15:48:04 +0200
commit89b7b67a13ebb7965cc7f13ad0595e2194a2d34c (patch)
tree25efd77a90ae87236e6730d8ea3846bbe0fd126f /src/dkim.cpp
add sqmail-4.2.29asqmail-4.2
Diffstat (limited to 'src/dkim.cpp')
-rw-r--r--src/dkim.cpp197
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];
+}