static DWORD VerifyWeakSignature( TMPQArchive * ha, PMPQ_SIGNATURE_INFO pSI) { BYTE RevSignature[MPQ_WEAK_SIGNATURE_SIZE]; BYTE Md5Digest[MD5_DIGEST_SIZE]; rsa_key key; int hash_idx = find_hash("md5"); int result = 0; // The signature might be zeroed out. In that case, we ignore it if(!IsValidSignature(pSI->Signature)) return ERROR_WEAK_SIGNATURE_OK; // Calculate hash of the entire archive, skipping the (signature) file if(!CalculateMpqHashMd5(ha, pSI, Md5Digest)) return ERROR_VERIFY_FAILED; // Import the Blizzard key in OpenSSL format if(!decode_base64_key(szBlizzardWeakPublicKey, &key)) return ERROR_VERIFY_FAILED; // Verify the signature memcpy(RevSignature, &pSI->Signature[8], MPQ_WEAK_SIGNATURE_SIZE); memrev(RevSignature, MPQ_WEAK_SIGNATURE_SIZE); rsa_verify_hash_ex(RevSignature, MPQ_WEAK_SIGNATURE_SIZE, Md5Digest, sizeof(Md5Digest), LTC_LTC_PKCS_1_V1_5, hash_idx, 0, &result, &key); rsa_free(&key); // Return the result return result ? ERROR_WEAK_SIGNATURE_OK : ERROR_WEAK_SIGNATURE_ERROR; }
bool PgpManager::handleStanza (const QDomElement& stanza) { const auto& tagName = stanza.tagName (); if ("message" != tagName && "presence" != tagName) return false; const auto& from = stanza.attribute ("from"); // Case 1: signed presence|message const auto& x_element = stanza.firstChildElement ("x"); if (x_element.namespaceURI () == NsSigned) { const auto& status = stanza.firstChildElement ("status"); const auto& message = status.text (); const auto& signature = x_element.text (); const QCA::PGPKey key = PublicKey (from); if (!IsValidSignature (key, message.toUtf8 (), signature.toLatin1 ())) emit invalidSignatureReceived (from); else if (tagName == "message") emit signedMessageReceived (from); else if (tagName == "presence") emit signedPresenceReceived (from); } // Case 2: encrypted message if (x_element.namespaceURI () == NsEncrypted) { const auto& encryptedBodyStr = x_element.text (); const auto& encryptedBody = encryptedBodyStr.toLatin1 (); const auto& decryptedBody = DecryptBody (encryptedBody); if (!decryptedBody.isEmpty ()) emit encryptedMessageReceived (from, QString::fromUtf8 (decryptedBody)); } return false; }