CryptOr

Mac OSX specific forum
User avatar
Piero
Addict
Addict
Posts: 862
Joined: Sat Apr 29, 2023 6:04 pm
Location: Italy

CryptOr

Post by Piero »

"PureMaCrypt0r"… #root! :lol:

Just a test with the outdated openssl on most Macs…
Hope I did not make too many mistakes…

Newer openssl will say that "you better use different parameters"…

Thanks Forum!

Dedicated to mksoft, because he made me less scared about callbacks, threads and cleaning pools in PB

Code: Select all

EnableExplicit

#default_pw = "by Piero 2025"

Procedure.s enc_dec(text.s, pass.s, de.s="e"); "d" = decrypt
   Protected ssl,Output$
   pass=URLEncoder(pass)+"'!!'\''!!&;:\/?><,~@#$%^&*)(}{_+-][~='"; beware of '\'' (if shell stdin)
   ssl = RunProgram("/usr/bin/openssl","aes-256-cbc -"+de+" -A -a -k "+
      pass,"",#PB_Program_Open|#PB_Program_Write|#PB_Program_Read)
   If ssl
      If de="d"
         WriteProgramStringN(ssl,text)
      Else
         WriteProgramStringN(ssl,URLEncoder(text))
      EndIf
      WriteProgramData(ssl,#PB_Program_Eof,0)
      While ProgramRunning(ssl)
         If AvailableProgramOutput(ssl)
            Output$ + ReadProgramString(ssl)
         EndIf
      Wend
      CloseProgram(ssl)
      If de="d":Output$=URLDecoder(Output$):EndIf
   EndIf
   ProcedureReturn Output$
EndProcedure

Procedure.s gzip(text.s,de.s=""); "d" = decompress
   Protected gz,Output$
   text.s="'" + ReplaceString(text, "'", "'\''") + "'"
   gz = RunProgram("/bin/sh","","",#PB_Program_Open|#PB_Program_Write|#PB_Program_Read)
   If gz
      If  de="d"
         WriteProgramStringN(gz,"echo "+text+" | /usr/bin/base64 -d | /usr/bin/gzip -d")
      Else
         WriteProgramStringN(gz,"echo "+text+" | /usr/bin/gzip -9 | /usr/bin/base64")
      EndIf
      WriteProgramData(gz,#PB_Program_Eof,0)
      While ProgramRunning(gz)
         If AvailableProgramOutput(gz)
            Output$ + ReadProgramString(gz)
         EndIf
      Wend
      CloseProgram(gz)
   EndIf
   ProcedureReturn Output$
EndProcedure

Procedure.s enc_dec_gzip(text.s,pass.s,de.s=""); "d" = decode
   If de="d"
      ProcedureReturn URLDecoder(gzip(enc_dec(text,pass,de),de))
   Else
      ProcedureReturn enc_dec(gzip(URLEncoder(text)),pass)
   EndIf
EndProcedure

Structure StringGadgetData
   x.i : y.i : w.i : h.i : s.s
EndStructure

Define StringGadgetFlag.a = ~#PB_String_Password
#pwtooltip="Password Input Field"
Procedure ShowHidePass(StringGadget,tooltip.s=#pwtooltip)
   Shared StringGadgetFlag
   Protected StData.StringGadgetData
   StData\x=GadgetX(StringGadget)
   StData\y=GadgetY(StringGadget)
   StData\w=GadgetWidth(StringGadget)
   StData\h=GadgetHeight(StringGadget)
   StData\s=GetGadgetText(StringGadget)
   If IsGadget(StringGadget):FreeGadget(StringGadget):EndIf
   StringGadget(StringGadget,StData\x,StData\y,StData\w,StData\h,StData\s,#PB_String_Password & StringGadgetFlag)
   GadgetToolTip(StringGadget,tooltip)
   StringGadgetFlag = ~StringGadgetFlag
EndProcedure

Procedure SelectAll(EditorGadgetID.I, SelectAll.I=#True)
   CompilerSelect #PB_Compiler_OS
      CompilerCase #PB_OS_Linux
         Protected TextBuffer.I
         Protected StartIter.GtkTextIter
         Protected EndIter.GtkTextIter
         TextBuffer = gtk_text_view_get_buffer_(GadgetID(EditorGadgetID))
         gtk_text_buffer_get_start_iter_(TextBuffer, @StartIter)
         gtk_text_buffer_get_end_iter_(TextBuffer, @EndIter)
         If SelectAll
            gtk_text_buffer_select_range_(TextBuffer, @StartIter, @EndIter)
         Else
            gtk_text_buffer_select_range_(TextBuffer, @StartIter, @StartIter)
         EndIf
      CompilerCase #PB_OS_MacOS
         Protected Range.NSRange
         If SelectAll
            CocoaMessage(0, GadgetID(EditorGadgetID), "selectAll:", 0)
         Else
            Range\length = 0
            CocoaMessage(0, GadgetID(EditorGadgetID), "setSelectedRange:@", @Range)
         EndIf
      CompilerCase #PB_OS_Windows
         If SelectAll
            SendMessage_(GadgetID(EditorGadgetID), #EM_SETSEL, 0, -1)
         Else
            SendMessage_(GadgetID(EditorGadgetID), #EM_SETSEL, 0, 0)
         EndIf
   CompilerEndSelect
EndProcedure

Procedure beep()
   CompilerSelect #PB_Compiler_OS
      CompilerCase #PB_OS_Linux
         RunProgram("/usr/bin/aplay","/usr/share/sounds/sound-icons/prompt.wav 2>/dev/null &","")
      CompilerCase #PB_OS_MacOS
         NSBeep_()
         ;RunProgram("osascript","-e beep","")
      CompilerCase #PB_OS_Windows
         MessageBeep_(#MB_ICONERROR)
   CompilerEndSelect
EndProcedure

Enumeration FormGadget
   #Window_0
   #passw = 0 ; gadgets
   #VerifyPassword
   #Text_1
   #Process
   #Paste
   #CopyQuit
   #input
   #output
   #Text_2
   #HidePassword
EndEnumeration

Procedure OpenWindow_0(x = 0, y = 0, width = 510, height = 440)
   OpenWindow(#Window_0, x, y, width, height, "PureMaCrypt0r", #PB_Window_SystemMenu|#PB_Window_Invisible)
   StringGadget(#passw, 305, 315, 200, 25, #default_pw, #PB_String_Password)
   GadgetToolTip(#passw, #pwtooltip)
   TextGadget(#Text_1, 225, 320, 80, 20, "PASSWORD:", #PB_Text_Center)
   ButtonGadget(#Process, 305, 365, 200, 30, "Process")
   GadgetToolTip(#Process, "Process")
   ButtonGadget(#Paste, 305, 280, 200, 30, "Paste")
   GadgetToolTip(#Paste, "Paste")
   ButtonGadget(#CopyQuit, 305, 400, 200, 30, "Copy Output and Quit")
   GadgetToolTip(#CopyQuit, "Copy and Quit")
   EditorGadget(#input, 5, 5, 500, 130, #PB_Editor_WordWrap)
   GadgetToolTip(#input, "INPUT")
   EditorGadget(#output, 5, 140, 500, 130, #PB_Editor_ReadOnly | #PB_Editor_WordWrap)
   GadgetToolTip(#output, "OUTPUT")
   TextGadget(#Text_2, 5, 415, 300, 20, "Use Mouse to Copy without Quitting")
   GadgetToolTip(#Text_2, "By Piero 2025")
   CheckBoxGadget(#VerifyPassword, 390, 340, 115, 25, "Verify Password")
   GadgetToolTip(#VerifyPassword, "Verify Password")
   SetGadgetState(#VerifyPassword, #PB_Checkbox_Checked)
   CheckBoxGadget(#HidePassword, 305, 340, 115, 25, "Hide")
   GadgetToolTip(#HidePassword, "Hide Password")
   SetGadgetState(#HidePassword, #PB_Checkbox_Checked)
EndProcedure

OpenWindow_0()
AddGadgetItem(#input, 0, ~"INPUT\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor"+
   "incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris"+
   "nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum"+
   "dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt"+
   ~"mollit anim id est laborum.\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt"+
   "ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip"+
   "ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla"+
   "pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.")
AddGadgetItem(#output, 0, "OUTPUT")
SetActiveGadget(#passw)
HideWindow (#Window_0,#False)

Procedure Main()
   Protected Event, Input$
   Repeat
      Event = WaitWindowEvent()
      Select Event
         Case #PB_Event_Gadget
            Select EventGadget()
               Case #Paste
                  ClearGadgetItems(#input)
                  AddGadgetItem(#input, 0, GetClipboardText())
               Case #Process
                  Input$=""
                  if GetGadgetState(#VerifyPassword)
                     Input$ = InputRequester("Password Verification", ~"Close this dialog to skip verification\n\n"+
                        "Please verify your Password:", #default_pw,#PB_InputRequester_Password)
                  endif
                  If (Input$ and GetGadgetText(#passw) = Input$) or not (Input$ and GetGadgetState(#VerifyPassword))
                     ClearGadgetItems(#output)
                     AddGadgetItem(#output, 0, enc_dec_gzip(GetGadgetText(#input), GetGadgetText(#passw), "d"))
                     If GetGadgetText(#output) = ""
                        AddGadgetItem(#output, 0, enc_dec_gzip(GetGadgetText(#input), GetGadgetText(#passw)))
                     EndIf
                     SelectAll(#input)
                     SelectAll(#output)
                     
                     Debug "Input:    "+StringByteLength(GetGadgetText(#input),#PB_UTF8)
                     Debug "Output:   "+StringByteLength(GetGadgetText(#output),#PB_UTF8)+~"\n"
                     
                  Else
                     beep()
                     MessageRequester("", "Password verification failed!", #PB_MessageRequester_Error) 
                     SetActiveGadget(#passw)
                  EndIf
               Case #input
                  Select EventType()
                     Case #PB_EventType_Focus: SelectAll(#input)
                  EndSelect
               Case #output
                  Select EventType()
                     Case #PB_EventType_Focus: SelectAll(#output)
                  EndSelect
               Case #HidePassword
                  ShowHidePass(#passw)
                  SetActiveGadget(#passw)
               Case #CopyQuit
                  SetClipboardText(GetGadgetText(#output))
                  Break
            EndSelect
      EndSelect
   Until Event = #PB_Event_CloseWindow or EventMenu() = #PB_Menu_Quit
EndProcedure

Main()

Debug "End"
Edited: made some small improvements and added "show password" (thanks AZJIO!)
Last edited by Piero on Wed Feb 26, 2025 9:34 am, edited 1 time in total.
User avatar
le_magn
Enthusiast
Enthusiast
Posts: 277
Joined: Wed Aug 24, 2005 12:11 pm
Location: Italia

Re: CryptOr

Post by le_magn »

Hi Piero, try to run your code but i get error on structure not found:

Code: Select all

[13:16:28] [COMPILER] Line 109: Structure not found: NSRange.
Image
User avatar
Piero
Addict
Addict
Posts: 862
Joined: Sat Apr 29, 2023 6:04 pm
Location: Italy

Re: CryptOr

Post by Piero »

le_magn wrote: Tue Feb 04, 2025 1:18 pmstructure not found: NSRange
Hi
Very strange: it's cocoa! (used here to "select all" in input/output gadgets)
What Mac os and PB version are you using?
User avatar
le_magn
Enthusiast
Enthusiast
Posts: 277
Joined: Wed Aug 24, 2005 12:11 pm
Location: Italia

Re: CryptOr

Post by le_magn »

Piero wrote: Tue Feb 04, 2025 1:43 pm
le_magn wrote: Tue Feb 04, 2025 1:18 pmstructure not found: NSRange
Hi
Very strange: it's cocoa! (used here to "select all" in input/output gadgets)
What Mac os and PB version are you using?
Ah sorry my mistake, I had missed that it was for Mac :oops:
Image
User avatar
Piero
Addict
Addict
Posts: 862
Joined: Sat Apr 29, 2023 6:04 pm
Location: Italy

Re: CryptOr

Post by Piero »

le_magn wrote: Tue Feb 04, 2025 7:57 pmmissed that it was for Mac
I hope it will be easy to adjust, at least for Linux: just remove the "range" stuff replacing it with a working "select all", and (eventually) replace the
/usr/bin/openssl
/usr/bin/base64
/usr/bin/gzip
/bin/sh
file paths (also adjusting openssl parameters, if you have a recent version)

PS:
cross-platform example to select all / deselect all the text in an EditorGadget
https://www.purebasic.fr/english/viewto ... 46#p448546
User avatar
Piero
Addict
Addict
Posts: 862
Joined: Sat Apr 29, 2023 6:04 pm
Location: Italy

Multi Platform Alert Beep Sound

Post by Piero »

Updated Beep() :)
Post Reply