FX_BOOL CPDF_SecurityHandler::OnInit(CPDF_Parser* pParser, CPDF_Dictionary* pEncryptDict) { m_pParser = pParser; if (!LoadDict(pEncryptDict)) { return FALSE; } if (m_Cipher == FXCIPHER_NONE) { return TRUE; } return CheckSecurity(m_KeyLen); }
/* main encoder */ void Encode (void) { unsigned int dictpos, deleteflag, sectorlen; unsigned long bytescompressed; InitEncode(); dictpos = deleteflag = 0; bytescompressed = 0; while (1) { /* delete old data from dictionary */ if (deleteflag) DeleteData(dictpos); /* grab more data to compress */ if ((sectorlen = LoadDict(dictpos)) == 0) break; /* hash the data */ HashData(dictpos, sectorlen); /* find dictionary matches */ DictSearch(dictpos, sectorlen); bytescompressed += sectorlen; printf("\r%ld", bytescompressed); dictpos += SECTORLEN; /* wrap back to beginning of dictionary when its full */ if (dictpos == DICTSIZE) { dictpos = 0; deleteflag = 1; /* ok to delete now */ } } /* Send EOF flag */ SendMatch(MAXMATCH + 1, 0); /* Flush bit buffer */ if (bitsin) SendBits(0, 8 - bitsin); return; }
void CPDF_SecurityHandler::OnCreate(CPDF_Dictionary* pEncryptDict, CPDF_Array* pIdArray, const uint8_t* user_pass, uint32_t user_size, const uint8_t* owner_pass, uint32_t owner_size, FX_BOOL bDefault, uint32_t type) { int cipher = 0, key_len = 0; if (!LoadDict(pEncryptDict, type, cipher, key_len)) { return; } if (bDefault && (!owner_pass || owner_size == 0)) { owner_pass = user_pass; owner_size = user_size; } if (m_Revision >= 5) { int t = (int)time(nullptr); uint8_t sha[128]; CRYPT_SHA256Start(sha); CRYPT_SHA256Update(sha, (uint8_t*)&t, sizeof t); CRYPT_SHA256Update(sha, m_EncryptKey, 32); CRYPT_SHA256Update(sha, (uint8_t*)"there", 5); CRYPT_SHA256Finish(sha, m_EncryptKey); AES256_SetPassword(pEncryptDict, user_pass, user_size, FALSE, m_EncryptKey); if (bDefault) { AES256_SetPassword(pEncryptDict, owner_pass, owner_size, TRUE, m_EncryptKey); AES256_SetPerms(pEncryptDict, m_Permissions, pEncryptDict->GetBooleanBy("EncryptMetadata", true), m_EncryptKey); } return; } if (bDefault) { uint8_t passcode[32]; for (uint32_t i = 0; i < 32; i++) { passcode[i] = i < owner_size ? owner_pass[i] : defpasscode[i - owner_size]; } uint8_t digest[16]; CRYPT_MD5Generate(passcode, 32, digest); if (m_Revision >= 3) { for (uint32_t i = 0; i < 50; i++) CRYPT_MD5Generate(digest, 16, digest); } uint8_t enckey[32]; FXSYS_memcpy(enckey, digest, key_len); for (uint32_t i = 0; i < 32; i++) { passcode[i] = i < user_size ? user_pass[i] : defpasscode[i - user_size]; } CRYPT_ArcFourCryptBlock(passcode, 32, enckey, key_len); uint8_t tempkey[32]; if (m_Revision >= 3) { for (uint8_t i = 1; i <= 19; i++) { for (int j = 0; j < key_len; j++) tempkey[j] = enckey[j] ^ i; CRYPT_ArcFourCryptBlock(passcode, 32, tempkey, key_len); } } pEncryptDict->SetAtString("O", CFX_ByteString(passcode, 32)); } CalcEncryptKey(m_pEncryptDict, (uint8_t*)user_pass, user_size, m_EncryptKey, key_len, FALSE, pIdArray); if (m_Revision < 3) { uint8_t tempbuf[32]; FXSYS_memcpy(tempbuf, defpasscode, 32); CRYPT_ArcFourCryptBlock(tempbuf, 32, m_EncryptKey, key_len); pEncryptDict->SetAtString("U", CFX_ByteString(tempbuf, 32)); } else { uint8_t md5[100]; CRYPT_MD5Start(md5); CRYPT_MD5Update(md5, defpasscode, 32); if (pIdArray) { CFX_ByteString id = pIdArray->GetStringAt(0); CRYPT_MD5Update(md5, (uint8_t*)id.c_str(), id.GetLength()); } uint8_t digest[32]; CRYPT_MD5Finish(md5, digest); CRYPT_ArcFourCryptBlock(digest, 16, m_EncryptKey, key_len); uint8_t tempkey[32]; for (uint8_t i = 1; i <= 19; i++) { for (int j = 0; j < key_len; j++) { tempkey[j] = m_EncryptKey[j] ^ i; } CRYPT_ArcFourCryptBlock(digest, 16, tempkey, key_len); } CRYPT_MD5Generate(digest, 16, digest + 16); pEncryptDict->SetAtString("U", CFX_ByteString(digest, 32)); } }
void CPDF_StandardSecurityHandler::OnCreate(CPDF_Dictionary* pEncryptDict, CPDF_Array* pIdArray, FX_LPCBYTE user_pass, FX_DWORD user_size, FX_LPCBYTE owner_pass, FX_DWORD owner_size, FX_BOOL bDefault, FX_DWORD type) { int cipher = 0, key_len = 0; if (!LoadDict(pEncryptDict, type, cipher, key_len)) { return; } if (bDefault && (owner_pass == NULL || owner_size == 0)) { owner_pass = user_pass; owner_size = user_size; } if (m_Revision >= 5) { int t = (int)time(NULL); FX_BYTE sha[128]; CRYPT_SHA256Start(sha); CRYPT_SHA256Update(sha, (FX_BYTE*)&t, sizeof t); CRYPT_SHA256Update(sha, m_EncryptKey, 32); CRYPT_SHA256Update(sha, (FX_BYTE*)"there", 5); CRYPT_SHA256Finish(sha, m_EncryptKey); AES256_SetPassword(pEncryptDict, user_pass, user_size, FALSE, m_EncryptKey); if (bDefault) { AES256_SetPassword(pEncryptDict, owner_pass, owner_size, TRUE, m_EncryptKey); AES256_SetPerms(pEncryptDict, m_Permissions, pEncryptDict->GetBoolean(FX_BSTRC("EncryptMetadata"), TRUE), m_EncryptKey); } return; } if (bDefault) { FX_BYTE passcode[32]; FX_DWORD i; for (i = 0; i < 32; i ++) { passcode[i] = i < owner_size ? owner_pass[i] : defpasscode[i - owner_size]; } FX_BYTE digest[16]; CRYPT_MD5Generate(passcode, 32, digest); if (m_Revision >= 3) { for (int i = 0; i < 50; i ++) { CRYPT_MD5Generate(digest, 16, digest); } } FX_BYTE enckey[32]; FXSYS_memcpy32(enckey, digest, key_len); for (i = 0; i < 32; i ++) { passcode[i] = i < user_size ? user_pass[i] : defpasscode[i - user_size]; } CRYPT_ArcFourCryptBlock(passcode, 32, enckey, key_len); FX_BYTE tempkey[32]; if (m_Revision >= 3) { for (i = 1; i <= 19; i ++) { for (int j = 0; j < key_len; j ++) { tempkey[j] = enckey[j] ^ (FX_BYTE)i; } CRYPT_ArcFourCryptBlock(passcode, 32, tempkey, key_len); } } pEncryptDict->SetAtString(FX_BSTRC("O"), CFX_ByteString(passcode, 32)); } CalcEncryptKey(m_pEncryptDict, (FX_LPBYTE)user_pass, user_size, m_EncryptKey, key_len, FALSE, pIdArray); if (m_Revision < 3) { FX_BYTE tempbuf[32]; FXSYS_memcpy32(tempbuf, defpasscode, 32); CRYPT_ArcFourCryptBlock(tempbuf, 32, m_EncryptKey, key_len); pEncryptDict->SetAtString(FX_BSTRC("U"), CFX_ByteString(tempbuf, 32)); } else { FX_BYTE md5[100]; CRYPT_MD5Start(md5); CRYPT_MD5Update(md5, defpasscode, 32); if (pIdArray) { CFX_ByteString id = pIdArray->GetString(0); CRYPT_MD5Update(md5, (FX_LPBYTE)(FX_LPCSTR)id, id.GetLength()); } FX_BYTE digest[32]; CRYPT_MD5Finish(md5, digest); CRYPT_ArcFourCryptBlock(digest, 16, m_EncryptKey, key_len); FX_BYTE tempkey[32]; for (int i = 1; i <= 19; i ++) { for (int j = 0; j < key_len; j ++) { tempkey[j] = m_EncryptKey[j] ^ (FX_BYTE)i; } CRYPT_ArcFourCryptBlock(digest, 16, tempkey, key_len); } CRYPT_MD5Generate(digest, 16, digest + 16); pEncryptDict->SetAtString(FX_BSTRC("U"), CFX_ByteString(digest, 32)); } }
int main() { LoadDict(&M); system("clear"); printf("%s=====================================================================\n", cyan); printf(" _ ______ ____ ____ ___ __ __________ ________ ____ \n"); printf("| | / / __ \\/ __ \\/ __ \\/ | / |/ / ____/ | / /_ __/ / __ \\ \n"); printf("| | /| / / / / / /_/ / / / / /| | / /|_/ / __/ / |/ / / / / / / /\n"); printf("| |/ |/ / /_/ / _ _ / /_/ / ___ |/ / / / /___/ /| / / / / /_/ / \n"); printf("|__/|__/\\____/_/ |_/_____/_/ |_/_/ /_/_____/_/ |_/ /_/ \\____/ \n\n"); printf("=====================================================================\n\n\n"); printf(" %sPress any key to continue%s\n",magenta,normal); getch(); while(opt1 != 5) //OPT1 = 5 adalah QUIT { MainMenu(&opt1); // MENAMPILKAN MAIN MENU switch(opt1) { case 1 : // REGISTER printf("%sEnter user name : ", cyan); do { found = false; // INISIALISASI YANG MENANDAKAN USER BELUM DITEMUKAN DI FILE EKSTERNAL scanf("%s", username.TabKata); username.Length = strlen(username.TabKata); if(strlen(username.TabKata) >= 20 || !(IsAlNumS(username))) // MENGECEK APAKAH LEBIH DARI 20 ATAU ALFANUMERIK printf("Username must be alphanumeric / less or equal to 20 characters\n"); else { *x = "scores/List Users & Highscores 2.txt"; STARTKATA(); while(!EndKata && !found) CheckUser(username,&id,&found); if(found) printf("Sorry, that username already exists\n"); } }while((strlen(username.TabKata) >= 20 || !(IsAlNumS(username))) || found); SalinFile(LU,username); printf("Congratulations! %s has been successfully registered\n",username.TabKata); printf("\n"); printf("%sPress any key to continue%s\n", magenta,cyan); dummygetch = getch(); dummygetch = getch(); break; case 2 : //LOGIN CreateList(&LU); printf("\n"); *x = "scores/List Users & Highscores 2.txt"; STARTKATA(); while(!(EndKata)) InitUser(&LU,&id); // MEMASUKKAN DATA FILE EKSTERNAL KE DALAM LIST InversListU(&LU); ListUsersLengkap(LU); // MENAMPILKAN LIST USER found1 = false; // INISIALISASI YANG MENANDAKAN USERNAME TIDAK DITEMUKAN while(!found1) { printf("=====================================================================\n"); printf("Enter username : "******"%s",username1.TabKata); username1.Length = strlen(username1.TabKata); STARTKATA(); while(!EndKata && !found1) CheckUser(username1,&id,&found1); if(!found1) printf("%s not found. Try again\n",username1.TabKata); } SelectB = true; // INISIALISASI AGAR SETELAH MEMILIH BOARD, MELIHAT SCORE TIDAK KELUAR KE MAIN MENU, MELAINKAN PREP MENU selectT = false; // INISIALISASI YANG MENANDAKAN USER BELUM PILIH BOARD while(SelectB == true) { if(selectT == false) kode = 1; PrepMenu(&opt2, username1); // PREPARATION MENU switch(opt2) { case 1 : // PLAY GAME if(selectT == false) { kode = 1; *y = "boards/1.txt"; } baris = 1; kolom = 1; T = false; used = false; score = 0; CreateEmptyQ(&QFinish); CreateEmpty(&S); CreateListSU(&LSG); CreateListSU(&LSGTemp); ReadSuggestion(&LSG, kode); strcpy(tempsugg, username1.TabKata); PSU = FirstSU(LSG); usersuggfound = false; while (PSU != Nil) { if (strcmp(InfoSU(PSU), tempsugg) == 0) { usersuggfound = true; break; } else { PSU = NextSU(PSU); } } if (!usersuggfound) { InsVSUFirst(&LSG, tempsugg); PSU = FirstSU(LSG); } InsVSUFirst(&LSGTemp, tempsugg); PSE = FirstSE(PSU); if (PSE != Nil) strcpy(tempsugg, InfoSE(PSE)); else { tempsugg[0] = ' '; tempsugg[1] = '\0'; } CreateListSet(&LS); CreateBoard(&B); AmbilBoard(&B); InitKursor(&B); InitSelect(&B, &S); system("clear"); printf("Score = %d\n\n", score); printf("Suggestion = %s\n\n", InfoSE(PSE)); TulisBoard(B); printf("\n\n"); dummygetch = getch(); input = getch(); printf("\n"); while (input != 'm') { system("clear"); ProsesKursor(&B, &baris, &kolom, &T, input, &error); Select(&B, baris, kolom, T, &S, &score, &LS, &QFinish, &used, &LSG, &LSGTemp, &M, PSU); printf("Score = %d\n\n", score); PSE = FirstSE(PSU); printf("Suggestion = %s\n\n", InfoSE(PSE)); TulisBoard(B); printf("\n"); if (used) printf("Invalid Word\n"); else printf("\n"); if (error) printf("error\n"); else printf("\n"); input = getch(); printf("\n"); error = false; used = false; } time(&rawtime); //INISIALISASI WAKTU t = localtime(&rawtime); D.YY = (*t).tm_year+1900; D.MM = (*t).tm_mon+1; D.DD = (*t).tm_mday; J.HH = (*t).tm_hour; J.MM = (*t).tm_min; J.SS = (*t).tm_sec; InsSortScoreU (&LU,D,J,score,username1); //INSERT SCORE KE LIST SCORE SalinInto(LU, kode); // MENYALIN KE FILE EKSTERNAL SelectB = false; system("clear"); addressQ PQ; PQ = Head(QFinish); while (PQ != Nil) { PrintSet(InfoQ(PQ)); printf("\n"); PQ = NextQ(PQ); } printf("Total Score = %d\n", score); PSU = FirstSU(LSG); PSE = FirstSE(PSU); PSUT = FirstSU(LSGTemp); while (PSUT != Nil) { PSET = FirstSE(PSUT); while (PSET != Nil) { InsVSEFirst(&LSG, PSU, InfoSE(PSET)); PSET = NextSE(PSET); } PSUT = NextSU(PSUT); } WriteSuggestion(LSG, kode); printf("Press any key to continue\n"); dummygetch = getch(); getch(); break; case 2 : //SELECT BOARD PilihBoard(&selectT, &kode); CreateList(&LU); STARTKATA(); while(!(EndKata)) InitUser(&LU,&id); // MEMASUKKAN DATA FILE EKSTERNAL KE DALAM LIST InversListU(&LU); SelectB = true; break; case 3 : //VIEW MY HIGH SCORES ViewMyHighScores(LU,username1); printf("%sPress any key to continue%s\n", magenta,cyan); dummygetch = getch(); dummygetch = getch(); SelectB = true; break; case 4 : //VIEW ALL HIGH SCORES ViewAllHighScores(LU); printf("%sPress any key to continue%s\n", magenta,cyan); dummygetch = getch(); dummygetch = getch(); SelectB = true; break; case 5 : //VIEW BOARD STATISTICS CreateEmptyQS(&QS); countuser = 0; countscore = 0; sumscore = 0; PU = FirstU(LU); while (PU != Nil) { PS = FirstS(PU); if((InfoD(PS)).YY != 0) { countuser += 1; } while(PS != Nil) { if((InfoD(PS)).YY != 0) { countscore += 1; sumscore += InfoS(PS); } PS = NextS(PS); } PU = NextU(PU); } //CreateList(&LU); averagescore = sumscore/countscore; printf("%.0f user/s have played in board %d\n",countuser,kode); if(countscore == 0) averagescore = 0; printf("The average score in board %d is %.2f\n",kode,averagescore); AddQS(&QS,kode,averagescore); for(i=0; i<=9;i++) { switch(i) { case 0 : *x = "scores/List Users & Highscores 1.txt"; break; case 1 : *x = "scores/List Users & Highscores 2.txt"; break; case 2 : *x = "scores/List Users & Highscores 3.txt"; break; case 3 : *x = "scores/List Users & Highscores 4.txt"; break; case 4 : *x = "scores/List Users & Highscores 5.txt"; break; case 5 : *x = "scores/List Users & Highscores 6.txt"; break; case 6 : *x = "scores/List Users & Highscores 7.txt"; break; case 7 : *x = "scores/List Users & Highscores 8.txt"; break; case 8 : *x = "scores/List Users & Highscores 9.txt"; break; case 9 : *x = "scores/List Users & Highscores 10.txt"; break; } if(i != kode) { CreateList(&LP); STARTKATA(); while(!EndKata) InitUser(&LP,&id); InversListU(&LP); sumscore = 0; countscore = 0; PX = FirstU(LP); while (PX != Nil) { PZ = FirstS(PX); while(PZ != Nil) { if((InfoD(PZ)).YY != 0) { countscore += 1; sumscore += InfoS(PZ); } PZ = NextS(PZ); } PX = NextU(PX); } if (countscore == 0) averagescore = 0; else averagescore = sumscore/countscore; AddQS(&QS, i, averagescore); } } PX = FirstU(LP); DealokasiU(&PX); PZ = FirstS(PX); DealokasiS(&PZ); P = Head(QS); printf("Difficulty Level of Boards : \n"); for(i=1;i<=10;i++) { printf("%d. Board no.%d with average user scores of %.2f\n",i,InfoQ(P),Prio(P)); P = NextQ(P); if (P == Nil) { break; } } printf("%sPress any key to continue%s\n", magenta,cyan); dummygetch = getch(); dummygetch = getch(); SelectB = true; break; case 6 : // LOG OUT SelectB = false; break; } if(SelectB == false) break; } break; case 3 : // HOW TO PLAY HowToPlay(); break; case 4 : // ABOUT About(); break; } } printf("%s\n", normal); //MENGGANTI WARNA TEXT TERMINAL KE AWAL return 0; }