AnsiString DKIM::_SignHash(AnsiString &privateKey, AnsiString &canonicalizedHeader, HashCreator::HashType hashType) { // Sign the hash. BIO *private_bio = BIO_new_mem_buf(privateKey.GetBuffer(), -1); if(private_bio == NULL) { ErrorManager::Instance()->ReportError(ErrorManager::Medium, 5309, "DKIM::_SignHash", "Unable to read the private key file into memory."); return ""; } EVP_PKEY *private_key = PEM_read_bio_PrivateKey(private_bio, NULL, NULL, NULL); if(private_key == NULL) { BIO_free(private_bio); ErrorManager::Instance()->ReportError(ErrorManager::Medium, 5310, "DKIM::_SignHash", "Unable to parse the private key file."); return ""; } BIO_free(private_bio); unsigned int siglen = EVP_PKEY_size(private_key); unsigned char *sig = (unsigned char*) OPENSSL_malloc(siglen); EVP_MD_CTX headerSigningContext; EVP_SignInit( &headerSigningContext, hashType == HashCreator::SHA256 ? EVP_sha256() : EVP_sha1()); String result; if (EVP_SignUpdate( &headerSigningContext, canonicalizedHeader.GetBuffer(), canonicalizedHeader.GetLength() ) == 1) { if (EVP_SignFinal( &headerSigningContext, sig, &siglen, private_key) == 1) { result = Base64::Encode((const char*) sig, siglen); } else { ErrorManager::Instance()->ReportError(ErrorManager::Medium, 5311, "DKIM::_SignHash", "Call to EVP_SignFinal failed."); } } else { ErrorManager::Instance()->ReportError(ErrorManager::Medium, 5312, "DKIM::_SignHash", "Call to EVP_SignUpdate failed."); } EVP_PKEY_free(private_key); EVP_MD_CTX_cleanup( &headerSigningContext ); OPENSSL_free(sig); return result; }
bool File::Write(const AnsiString &sWrite) { AnsiString sTmp = sWrite; DWORD dwWritten = 0; return Write((const unsigned char*) sTmp.GetBuffer(), sTmp.GetLength(), dwWritten); }
/* Returns one of the following Neutral - Undecided Pass - Signature verified properly. TempFail - Failed to verify signature, potentially a local problem. PermFail - Failed to verify signature. */ DKIM::Result DKIM::Verify(const String &fileName) { if (FileUtilities::FileSize(fileName) > MaxFileSize) return Neutral; AnsiString messageHeader = PersistentMessage::LoadHeader(fileName); MimeHeader mimeHeader; mimeHeader.Load(messageHeader.GetBuffer(), messageHeader.GetLength(), false); vector<pair<AnsiString, AnsiString> > signatureFields = GetSignatureFields(mimeHeader); if (signatureFields.size() == 0) { // No signatures in message. return Neutral; } Result result = Neutral; typedef pair<AnsiString, AnsiString> HeaderField; boost_foreach (HeaderField signatureField, signatureFields) { result = _VerifySignature(fileName, messageHeader, signatureField); if (result == Pass) return Pass; };
void Base64Tester::Test() { String s; AnsiString input = "Test"; s = Base64::Encode(input.GetBuffer(), input.GetLength()); if (s.Compare(_T("VGVzdA==")) != 0) throw; input = "Test test test test test test test!!!!"; s = Base64::Encode(input, input.GetLength()); if (s.Compare(_T("VGVzdCB0ZXN0IHRlc3QgdGVzdCB0ZXN0IHRlc3QgdGVzdCEhISE=")) != 0) throw; input = "hMailServer is a free e-mail server for Microsoft Windows. It's used by Internet service providers, companies, governments, schools and enthusiasts in all parts of the world. It supports the common e-mail protocols (IMAP, SMTP and POP3) and can easily be integrated with many existing web mail systems. It has flexible score-based spam protection and can attach to your virus scanner to scan all incoming and outgoing email."; s = Base64::Encode(input, input.GetLength()); if (s.Compare(_T("aE1haWxTZXJ2ZXIgaXMgYSBmcmVlIGUtbWFpbCBzZXJ2ZXIgZm9yIE1pY3Jvc29mdCBXaW5kb3dzLiBJdCdzIHVzZWQgYnkgSW50ZXJuZXQgc2VydmljZSBwcm92aWRlcnMsIGNvbXBhbmllcywgZ292ZXJubWVudHMsIHNjaG9vbHMgYW5kIGVudGh1c2lhc3RzIGluIGFsbCBwYXJ0cyBvZiB0aGUgd29ybGQuIEl0IHN1cHBvcnRzIHRoZSBjb21tb24gZS1tYWlsIHByb3RvY29scyAoSU1BUCwgU01UUCBhbmQgUE9QMykgYW5kIGNhbiBlYXNpbHkgYmUgaW50ZWdyYXRlZCB3aXRoIG1hbnkgZXhpc3Rpbmcgd2ViIG1haWwgc3lzdGVtcy4gSXQgaGFzIGZsZXhpYmxlIHNjb3JlLWJhc2VkIHNwYW0gcHJvdGVjdGlvbiBhbmQgY2FuIGF0dGFjaCB0byB5b3VyIHZpcnVzIHNjYW5uZXIgdG8gc2NhbiBhbGwgaW5jb21pbmcgYW5kIG91dGdvaW5nIGVtYWlsLg==")) != 0) throw; input = "VGVzdA=="; s = Base64::Decode(input, input.GetLength()); if (s.Compare(_T("Test")) != 0) throw; input = "VGVzdCB0ZXN0IHRlc3QgdGVzdCB0ZXN0IHRlc3QgdGVzdCEhISE="; s = Base64::Decode(input, input.GetLength()); if (s.Compare(_T("Test test test test test test test!!!!")) != 0) throw; input = "aE1haWxTZXJ2ZXIgaXMgYSBmcmVlIGUtbWFpbCBzZXJ2ZXIgZm9yIE1pY3Jvc29mdCBXaW5kb3dzLiBJdCdzIHVzZWQgYnkgSW50ZXJuZXQgc2VydmljZSBwcm92aWRlcnMsIGNvbXBhbmllcywgZ292ZXJubWVudHMsIHNjaG9vbHMgYW5kIGVudGh1c2lhc3RzIGluIGFsbCBwYXJ0cyBvZiB0aGUgd29ybGQuIEl0IHN1cHBvcnRzIHRoZSBjb21tb24gZS1tYWlsIHByb3RvY29scyAoSU1BUCwgU01UUCBhbmQgUE9QMykgYW5kIGNhbiBlYXNpbHkgYmUgaW50ZWdyYXRlZCB3aXRoIG1hbnkgZXhpc3Rpbmcgd2ViIG1haWwgc3lzdGVtcy4gSXQgaGFzIGZsZXhpYmxlIHNjb3JlLWJhc2VkIHNwYW0gcHJvdGVjdGlvbiBhbmQgY2FuIGF0dGFjaCB0byB5b3VyIHZpcnVzIHNjYW5uZXIgdG8gc2NhbiBhbGwgaW5jb21pbmcgYW5kIG91dGdvaW5nIGVtYWlsLg=="; s = Base64::Decode(input, input.GetLength()); if (s.Compare(_T("hMailServer is a free e-mail server for Microsoft Windows. It's used by Internet service providers, companies, governments, schools and enthusiasts in all parts of the world. It supports the common e-mail protocols (IMAP, SMTP and POP3) and can easily be integrated with many existing web mail systems. It has flexible score-based spam protection and can attach to your virus scanner to scan all incoming and outgoing email.")) != 0) throw; }
void SslContextInitializer::SetCipherList_(boost::asio::ssl::context& context) { AnsiString cipher_list = Configuration::Instance()->GetSslCipherList(); cipher_list.Replace("\r", ""); cipher_list.Replace("\n", ""); cipher_list.Replace(" ", ""); if (cipher_list.Trim().IsEmpty()) return; // Asio does not expose cipher list. Access underlaying layer (OpenSSL) directly. SSL_CTX* ssl = context.native_handle(); int result = SSL_CTX_set_cipher_list(ssl, cipher_list.c_str()); if (result == 0) { // Unable to set the SSL cipher list. Collect the error code from OpenSSL so that // we can include that in the error message we log. int errorCode = ERR_get_error(); const int bufferSize = 150; AnsiString message; ERR_error_string_n(errorCode, message.GetBuffer(bufferSize), bufferSize); ErrorManager::Instance()->ReportError(ErrorManager::Medium, 5511, "SslContextInitializer::SetCipherList_", Formatter::Format("Failed to set SSL ciphers. Message: {0}", message)); } }
// helper. EVP_PKEY* _GetPublicKey(const AnsiString &keyData) { // base64 decode the public key. AnsiString publicKeyData = Base64::Decode(keyData, keyData.GetLength()); const unsigned char * publicKeyDataPointer = (const unsigned char*) publicKeyData.GetBuffer(); EVP_PKEY *publicKey = d2i_PUBKEY(NULL, &publicKeyDataPointer, publicKeyData.GetLength()); return publicKey; }
bool File::ReadLine(AnsiString &sLine) { if (file_ == nullptr) throw std::logic_error("Attempt to read to file which has not been opened."); const int buffer_size = 10000; char *line_buffer = sLine.GetBuffer(buffer_size); bool result = fgets(line_buffer, buffer_size, file_) != 0; sLine.ReleaseBuffer(); return result; }
void POP3ClientConnection::PrependHeaders_() //---------------------------------------------------------------------------() // DESCRIPTION: // Adds headers to the beginning of the message. //---------------------------------------------------------------------------() { // Add a header with the name of the external account, so that // we can check where we downloaded it from later on. String sHeader; sHeader.Format(_T("X-hMailServer-ExternalAccount: %s\r\n"), account_->GetName().c_str()); AnsiString sAnsiHeader = sHeader; transmission_buffer_->Append((BYTE*) sAnsiHeader.GetBuffer(), sAnsiHeader.GetLength()); }
void TCPConnection::EnqueueWrite(const AnsiString &sData) { AnsiString sTemp = sData; char *pBuf = sTemp.GetBuffer(); std::shared_ptr<ByteBuffer> pBuffer = std::shared_ptr<ByteBuffer>(new ByteBuffer()); pBuffer->Add((BYTE*) pBuf, sData.GetLength()); #ifdef _DEBUG String sDebugOutput; sDebugOutput.Format(_T("SENT: %s"), String(sTemp).c_str()); OutputDebugString(sDebugOutput); #endif EnqueueWrite(pBuffer); }
AnsiString HashCreator::_GetHash(const AnsiString &sInputString, HashCreator::RequestedEncoding encoding) { AnsiString temp = sInputString; return _GetHashRaw((unsigned char*) temp.GetBuffer(), temp.GetLength(), encoding); }