From 0c4c5a5da5ff4e4e77196f4eaa1fc45d1aac4826 Mon Sep 17 00:00:00 2001 From: Rainer Kottenhoff Date: Sun, 6 Nov 2016 16:15:36 +0100 Subject: [PATCH] fixing 64bit issue XhmikosR/notepad2-mod#37 fixing crypto issue "passphrase longer than plaintext" --- crypto/crypto.c | 18 ++++++++++-------- crypto/rijndael-alg-fst.c | 8 ++++---- crypto/rijndael-alg-fst.h | 8 ++++---- src/Edit.c | 35 ++++++++++++++++++----------------- 4 files changed, 36 insertions(+), 33 deletions(-) diff --git a/crypto/crypto.c b/crypto/crypto.c index fde092b3c..36eb0654b 100644 --- a/crypto/crypto.c +++ b/crypto/crypto.c @@ -361,17 +361,19 @@ BOOL ReadAndDecryptFile(HWND hwnd, HANDLE hFile, DWORD size, void** result, DWOR AES_bin_setup(&fileDecode, AES_DIR_DECRYPT, KEY_BYTES * 8, binFileKey); AES_bin_cipherInit(&fileCypher, AES_MODE_CBC, &rawdata[PREAMBLE_SIZE]); // IV is next { // finally, decrypt the actual data - int nbb = 0; - int nbp = 0; - if ((readsize - code_offset) > PAD_SLOP) { + int nbb = BAD_CIPHER_STATE; + int nbp = BAD_CIPHER_STATE; + if ((readsize - code_offset) >= PAD_SLOP) { nbb = AES_blockDecrypt(&fileCypher, &fileDecode, &rawdata[code_offset], readsize - code_offset - PAD_SLOP, rawdata); } + if (nbb >= 0) { nbp = AES_padDecrypt(&fileCypher, &fileDecode, &rawdata[code_offset + nbb], readsize - code_offset - nbb, rawdata + nbb); - if (nbp > 0) { - nbb += nbp; - rawdata[nbb] = (char)0; - rawdata[nbb + 1] = (char)0; // two zeros in case it's multi-byte - *resultlen = (DWORD)nbb; + } + if (nbp >= 0) { + int nb = nbb + nbp; + rawdata[nb] = (char)0; + rawdata[nb + 1] = (char)0; // two zeros in case it's multi-byte + *resultlen = (DWORD)nb; bReadSuccess = TRUE; } else { diff --git a/crypto/rijndael-alg-fst.c b/crypto/rijndael-alg-fst.c index d0fc792fb..366be184c 100644 --- a/crypto/rijndael-alg-fst.c +++ b/crypto/rijndael-alg-fst.c @@ -853,7 +853,7 @@ int rijndaelKeySetupDec(u32 rk[/*4*(Nr + 1)*/], const u8 cipherKey[], int keyBit return Nr; } -void rijndaelEncrypt(u32 rk[/*4*(Nr + 1)*/], int Nr, const u8 pt[16], u8 ct[16]) { +void rijndaelEncrypt(const u32 rk[/*4*(Nr + 1)*/], int Nr, const u8 pt[16], u8 ct[16]) { u32 s0, s1, s2, s3, t0, t1, t2, t3; #ifndef FULL_UNROLL int r; @@ -1034,7 +1034,7 @@ void rijndaelEncrypt(u32 rk[/*4*(Nr + 1)*/], int Nr, const u8 pt[16], u8 ct[16]) PUTU32(ct + 12, s3); } -void rijndaelDecrypt(u32 rk[/*4*(Nr + 1)*/], int Nr, const u8 ct[16], u8 pt[16]) { +void rijndaelDecrypt(const u32 rk[/*4*(Nr + 1)*/], int Nr, const u8 ct[16], u8 pt[16]) { u32 s0, s1, s2, s3, t0, t1, t2, t3; #ifndef FULL_UNROLL int r; @@ -1217,7 +1217,7 @@ void rijndaelDecrypt(u32 rk[/*4*(Nr + 1)*/], int Nr, const u8 ct[16], u8 pt[16]) #ifdef INTERMEDIATE_VALUE_KAT -void rijndaelEncryptRound(u32 rk[/*4*(Nr + 1)*/], int Nr, u8 block[16], int rounds) { +void rijndaelEncryptRound(const u32 rk[/*4*(Nr + 1)*/], int Nr, u8 block[16], int rounds) { int r; u32 s0, s1, s2, s3, t0, t1, t2, t3; @@ -1310,7 +1310,7 @@ void rijndaelEncryptRound(u32 rk[/*4*(Nr + 1)*/], int Nr, u8 block[16], int roun PUTU32(block + 12, s3); } -void rijndaelDecryptRound(u32 rk[/*4*(Nr + 1)*/], int Nr, u8 block[16], int rounds) { +void rijndaelDecryptRound(const u32 rk[/*4*(Nr + 1)*/], int Nr, u8 block[16], int rounds) { int r; u32 s0, s1, s2, s3, t0, t1, t2, t3; diff --git a/crypto/rijndael-alg-fst.h b/crypto/rijndael-alg-fst.h index b4477dbe5..d3f5d839e 100644 --- a/crypto/rijndael-alg-fst.h +++ b/crypto/rijndael-alg-fst.h @@ -37,12 +37,12 @@ typedef unsigned int u32; int rijndaelKeySetupEnc(u32 rk[/*4*(Nr + 1)*/], const u8 cipherKey[], int keyBits); int rijndaelKeySetupDec(u32 rk[/*4*(Nr + 1)*/], const u8 cipherKey[], int keyBits); -void rijndaelEncrypt(u32 rk[/*4*(Nr + 1)*/], int Nr, const u8 pt[16], u8 ct[16]); -void rijndaelDecrypt(u32 rk[/*4*(Nr + 1)*/], int Nr, const u8 ct[16], u8 pt[16]); +void rijndaelEncrypt(const u32 rk[/*4*(Nr + 1)*/], int Nr, const u8 pt[16], u8 ct[16]); +void rijndaelDecrypt(const u32 rk[/*4*(Nr + 1)*/], int Nr, const u8 ct[16], u8 pt[16]); #ifdef INTERMEDIATE_VALUE_KAT -void rijndaelEncryptRound(u32 rk[/*4*(Nr + 1)*/], int Nr, u8 block[16], int rounds); -void rijndaelDecryptRound(u32 rk[/*4*(Nr + 1)*/], int Nr, u8 block[16], int rounds); +void rijndaelEncryptRound(const u32 rk[/*4*(Nr + 1)*/], int Nr, u8 block[16], int rounds); +void rijndaelDecryptRound(const u32 rk[/*4*(Nr + 1)*/], int Nr, u8 block[16], int rounds); #endif /* INTERMEDIATE_VALUE_KAT */ #endif /* __RIJNDAEL_ALG_FST_H */ diff --git a/src/Edit.c b/src/Edit.c index 90172ffbe..0c653636c 100644 --- a/src/Edit.c +++ b/src/Edit.c @@ -542,7 +542,8 @@ BOOL EditCopyAppend(HWND hwnd) (int)SendMessage(hwnd,SCI_GETSELECTIONEND,0,0) - (int)SendMessage(hwnd,SCI_GETSELECTIONSTART,0,0); - pszText = LocalAlloc(LPTR,iSelCount + 1); + // fixing 64bit issue #37 + pszText = LocalAlloc(LPTR,iSelCount + 4); (int)SendMessage(hwnd,SCI_GETSELTEXT,0,(LPARAM)pszText); } } @@ -1651,8 +1652,8 @@ void EditInvertCase(HWND hwnd) int iSelCount = (int)SendMessage(hwnd,SCI_GETSELECTIONEND,0,0) - (int)SendMessage(hwnd,SCI_GETSELECTIONSTART,0,0); - char* pszText = GlobalAlloc(GPTR,(iSelCount)+2); - LPWSTR pszTextW = GlobalAlloc(GPTR,(iSelCount*2)+2); + char* pszText = GlobalAlloc(GPTR,(iSelCount)+4); + LPWSTR pszTextW = GlobalAlloc(GPTR,(iSelCount*2)+8); if (pszText == NULL || pszTextW == NULL) { GlobalFree(pszText); @@ -1727,8 +1728,8 @@ void EditTitleCase(HWND hwnd) int iSelCount = (int)SendMessage(hwnd,SCI_GETSELECTIONEND,0,0) - (int)SendMessage(hwnd,SCI_GETSELECTIONSTART,0,0); - char* pszText = GlobalAlloc(GPTR,(iSelCount)+2); - LPWSTR pszTextW = GlobalAlloc(GPTR,(iSelCount*2)+2); + char* pszText = GlobalAlloc(GPTR,(iSelCount)+4); + LPWSTR pszTextW = GlobalAlloc(GPTR,(iSelCount*2)+8); if (pszText == NULL || pszTextW == NULL) { GlobalFree(pszText); @@ -1839,8 +1840,8 @@ void EditSentenceCase(HWND hwnd) int iSelCount = (int)SendMessage(hwnd,SCI_GETSELECTIONEND,0,0) - (int)SendMessage(hwnd,SCI_GETSELECTIONSTART,0,0); - char* pszText = GlobalAlloc(GPTR,(iSelCount)+2); - LPWSTR pszTextW = GlobalAlloc(GPTR,(iSelCount*2)+2); + char* pszText = GlobalAlloc(GPTR,(iSelCount)+4); + LPWSTR pszTextW = GlobalAlloc(GPTR,(iSelCount*2)+8); if (pszText == NULL || pszTextW == NULL) { GlobalFree(pszText); @@ -1926,12 +1927,12 @@ void EditURLEncode(HWND hwnd) DWORD cchEscapedW; LPWSTR pszEscapedW; - pszText = LocalAlloc(LPTR,(iSelCount)+2); + pszText = LocalAlloc(LPTR,(iSelCount)+4); if (pszText == NULL) { return; } - pszTextW = LocalAlloc(LPTR,(iSelCount*2)+2); + pszTextW = LocalAlloc(LPTR,(iSelCount*2)+8); if (pszTextW == NULL) { LocalFree(pszText); return; @@ -2012,12 +2013,12 @@ void EditURLDecode(HWND hwnd) DWORD cchUnescapedW; LPWSTR pszUnescapedW; - pszText = LocalAlloc(LPTR,(iSelCount)+2); + pszText = LocalAlloc(LPTR,(iSelCount)+4); if (pszText == NULL) { return; } - pszTextW = LocalAlloc(LPTR,(iSelCount*2)+2); + pszTextW = LocalAlloc(LPTR,(iSelCount*2)+8); if (pszTextW == NULL) { LocalFree(pszText); return; @@ -5810,23 +5811,23 @@ void EditMarkAll(HWND hwnd, int iMarkOccurrences, BOOL bMarkOccurrencesMatchCase (int)SendMessage(hwnd, SCI_LINEFROMPOSITION, iSelEnd, 0)) return; - - pszText = LocalAlloc(LPTR,iSelCount + 1); + // fixing 64bit issue #37 + pszText = LocalAlloc(LPTR,iSelCount + 4); (int)SendMessage(hwnd,SCI_GETSELTEXT,0,(LPARAM)pszText); // exit if selection is not a word and Match whole words only is enabled if (bMarkOccurrencesMatchWords) { - iSelStart = 0; - while (pszText[iSelStart]) + int i = 0; + while ((i <= iSelCount) && pszText[i]) { - if (StrChrIA(" \t\r\n@#$%^&*~-=+()[]{}\\/:;'\"", pszText[iSelStart])) + if (StrChrIA(" \t\r\n@#$%^&*~-=+()[]{}\\/:;'\"", pszText[i])) { LocalFree(pszText); return; } - iSelStart++; + i++; } }