From ca1122ef713f4348c18f7938e2beb88c6c105c3b Mon Sep 17 00:00:00 2001 From: Mohamed Feddad Date: Wed, 18 Sep 2024 16:58:53 +0400 Subject: [PATCH 1/4] fix: input file overwriting --- cmd/encrypt.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cmd/encrypt.go b/cmd/encrypt.go index f46d37e..32f394b 100644 --- a/cmd/encrypt.go +++ b/cmd/encrypt.go @@ -41,8 +41,9 @@ var encryptCmd = &cobra.Command{ sl.Quiet = beQuiet inputPath, outputPath := []string{args[0]}, args[1] + fileFlags := os.O_RDWR | os.O_CREATE | os.O_TRUNC - if outputFile, err = os.OpenFile(outputPath, os.O_RDWR|os.O_CREATE, 0755); err != nil { + if outputFile, err = os.OpenFile(outputPath, fileFlags, 0755); err != nil { utils.PrintErrsAndExit((&slErrs.ErrInvalidOutputPath{ Path: outputPath, Err: err, From 4bacf5112009d86d5b24c0234d490b523e7a90a4 Mon Sep 17 00:00:00 2001 From: Mohamed Feddad Date: Wed, 18 Sep 2024 16:59:12 +0400 Subject: [PATCH 2/4] chore: update readme and benchmark results --- README.md | 8 +++- benchmark/bench_and_plot.py | 51 +++++++++----------- benchmark/decryption-time.webp | Bin 8548 -> 7612 bytes benchmark/decryption.json | 84 ++++++++++++++++----------------- benchmark/encryption-time.webp | Bin 8268 -> 6630 bytes benchmark/encryption.json | 84 ++++++++++++++++----------------- benchmark/file-size.webp | Bin 9190 -> 7842 bytes 7 files changed, 111 insertions(+), 116 deletions(-) diff --git a/README.md b/README.md index bd63795..816ac6a 100644 --- a/README.md +++ b/README.md @@ -2,10 +2,13 @@

safelock-cli - + build status>
+</a>
+<a href= + linter badge - Go Reference + Go Reference

@@ -61,6 +64,7 @@ You can find interactive examples of using it as a package to [encrypt](https:// |-------------------------|---------------------------------------------| | Iterations | 3 | | Memory size | 64 Megabytes | +| Salt length | 16 | | Key length | 32 | | Threads | Number of available cores `runtime.NumCPU()`| | Minimum password length | 8 | diff --git a/benchmark/bench_and_plot.py b/benchmark/bench_and_plot.py index be90b30..b7bb6be 100644 --- a/benchmark/bench_and_plot.py +++ b/benchmark/bench_and_plot.py @@ -5,7 +5,7 @@ import matplotlib.pyplot as plt from matplotlib.colors import XKCD_COLORS as plot_colors -safelock_cmd = "safelock-cli" +safelock_cmd = "~/Projects/safelock-cli/safelock-cli" pwd = "123456789" rest = "60s" input_path = "Videos" @@ -13,26 +13,20 @@ output_dir = "safelock_dump" runs = 3 figure_width = 14 -figure_height = 2.5 -bar_width = 0.6 +figure_height = 2.3 +bar_width = 0.65 measure = "Seconds" root = os.getcwd() -def get_label(i, clean=False, key="command"): +def get_label(i, key="command"): matchers = [ ('gpg', 'gpgtar',), ('7z', '7zip (fastest)',), ('age', 'age (tar-zstd)'), ('safelock', 'safelock',), ] - label = next((v for m, v in matchers if m in i[key])) - if clean: - return label - if key == "label": - return f"{label}\n{i['size']:.2f} MB" - - return f"{label}\n{i['median']:.3f}s" + return next((v for m, v in matchers if m in i[key])) def get_name(i): matchers = [ @@ -48,8 +42,8 @@ def encrypt(): err = os.system( f"hyperfine --runs {runs} --prepare " f"'sleep {rest}' " - f"'echo \"{pwd}\" | {safelock_cmd} encrypt {input_path} {get_name('safelock')} --quiet' " f"'tar cv --zstd {input_path} | . {root}/pipe_age_password.sh | age -e -p -o {get_name('age')}' " + f"'echo \"{pwd}\" | {safelock_cmd} encrypt {input_path} {get_name('safelock')} --quiet' " f"'7z a -p{pwd} -mx1 {get_name('7z')} {input_path}' " f"'gpgtar -e -o {get_name('gpg')} -c --yes --batch --gpg-args \"--passphrase {pwd}\" {input_path}' " f"--export-json {root}/encryption.json" @@ -62,8 +56,8 @@ def decrypt(): err = os.system( f"hyperfine --runs {runs} --prepare " f"'rm -rf {output_dir} {output_name}_*_ && mkdir {output_dir} && sleep {rest}' " - f"'echo \"{pwd}\" | {safelock_cmd} decrypt {get_name('safelock')} {output_dir} --quiet' " f"'sleep 0.05; xdotool type \"{pwd}\"; xdotool key \"Return\" | age --decrypt {get_name('age')} | tar x --zstd -f - -C {output_dir}' " + f"'echo \"{pwd}\" | {safelock_cmd} decrypt {get_name('safelock')} {output_dir} --quiet' " f"'7z e -y -p{pwd} -mx1 {get_name('7z')} -o{output_dir}' " f"'gpgtar -d --yes --batch --gpg-args \"--passphrase {pwd}\" {get_name('gpg')}' " f"--export-json {root}/decryption.json" @@ -73,8 +67,8 @@ def decrypt(): exit(err) os.chdir(os.path.expanduser("~")) -# encrypt() -# decrypt() +encrypt() +decrypt() os.chdir(root) plt.margins(3.5) @@ -85,16 +79,15 @@ def decrypt(): data = sorted(json.load(f)['results'], key=lambda i: i['median']) labels = [get_label(i) for i in data] scores = [i['median'] for i in data] - colors_map = {get_label(i, 1): random.choice(list(plot_colors.values())) for i in data} - colors = [colors_map[get_label(i, 1)] for i in data] + colors_map = {get_label(i): random.choice(list(plot_colors.values())) for i in data} + colors = [colors_map[get_label(i)] for i in data] fig, ax = plt.subplots() ax.set_title('Encryption Time') ax.set_xlabel(measure) -ax.yaxis.set_label_position('right') -ax.set_ylabel('lower is better') -ax.grid(zorder=0, axis='x', color='black') +ax.grid(zorder=0, axis='x') ax.barh(labels, scores, bar_width, color=colors, zorder=3) +ax.bar_label(ax.containers[0], label_type='edge', padding=3, fmt=lambda i: f"{i:.2f}") fig.set_size_inches(w=figure_width, h=figure_height) fig.tight_layout() fig.savefig("encryption-time.webp", transparent=True, format="webp") @@ -106,15 +99,14 @@ def decrypt(): data = sorted(json.load(f)['results'], key=lambda i: i['median']) labels = [get_label(i) for i in data] decryption = [i['median'] for i in data] - colors = [colors_map[get_label(i, 1)] for i in data] + colors = [colors_map[get_label(i)] for i in data] fig, ax = plt.subplots() ax.set_title('Decryption Time') ax.set_xlabel(measure) -ax.yaxis.set_label_position('right') -ax.set_ylabel('lower is better') -ax.grid(zorder=0, axis='x', color='black') +ax.grid(zorder=0, axis='x') ax.barh(labels, decryption, bar_width, color=colors, zorder=3) +ax.bar_label(ax.containers[0], label_type='edge', padding=3, fmt=lambda i: f"{i:.2f}") fig.set_size_inches(w=figure_width, h=figure_height) fig.tight_layout() fig.savefig("decryption-time.webp", transparent=True, format="webp") @@ -126,20 +118,19 @@ def decrypt(): data = sorted([{ 'size': os.path.getsize(get_name(get_label(i))) / 1024 / 1024, 'label': get_label(i), - 'color': colors_map[get_label(i, 1)], + 'color': colors_map[get_label(i)], } for i in data], key=lambda i: i['size']) os.chdir(root) -labels = [get_label(i, key='label') for i in data] +labels = [get_label(i, 'label') for i in data] sizes = [i['size'] for i in data] colors = [i['color'] for i in data] fig, ax = plt.subplots() ax.set_title('File Size') -ax.set_xlabel("Megabytes") -ax.yaxis.set_label_position('right') -ax.set_ylabel('lower is better') -ax.grid(zorder=0, axis='x', color='black') +ax.set_xlabel("MegaBytes") +ax.grid(zorder=0, axis='x') ax.barh(labels, sizes, bar_width, color=colors, zorder=3) +ax.bar_label(ax.containers[0], label_type='edge', padding=3, fmt=lambda i: f"{i:.0f}") fig.set_size_inches(w=figure_width, h=figure_height) fig.tight_layout() fig.savefig("file-size.webp", transparent=True, format="webp") diff --git a/benchmark/decryption-time.webp b/benchmark/decryption-time.webp index 4fa863d8234f63746f1c30551b2184b85ec5f17d..3152b7245af7bb181a66e513f612582446d52a80 100644 GIT binary patch literal 7612 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 literal 8548 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%0D&T5g+HLmuRcA2mmiNX0n5qA~QxY@Ds$~26qPt zf8j~^m`#~UPE{Ua4nYkzvsrWS)_zjD0o{QvM#TEwjQa$71KtoH^tLTq%Jx=D5rS3> zmFYjWr=;E@^&SEX23s)0wPUrB@LDtJz5Bd5@COMUqqnyFOFDW8&-f2Uk1A(Gx3qs= z9|%od%lq(-)mMFdfYBB?c}^!)a71`w-+7-_x{8RZmbQzHOcU%M^P!_Z)4+I~t-?G} zgX@Ei0<@kLZ}ndMziBc|$uxMf{|DiJ7&51lLDS7#f>KHp5(80`CX!JV*^+aLRMz=e zJVH-YYo!W#R0Kz^fZ1iXa`03u?DS%{Y7gi66htlk-fF4;>~rK^XC{|0yc z7xVFwQAhl!E?ZNcNt^=eYeK~oNfsI3=o5ZZb1iC|B% zoCb-Mo`q4TAZ1}bU2Z7RHI!~WahBu+CzIUh7~brO;uy~ieXixZi_bdCX#%hgW)Apu z6VxUAE|*Z8M>&W)kD=)b{X5Q#OT`%x6mgTz0uqWofeMqLS{o3>G|3IA%}oe%1* z{AYE0D<&;Bc3#?~3;f~rpHL@E{XTZ8+nPP2z-x0LsZ zi0tCkvoLh)3sZBLq$q79J#AZ#Bh!oXVOYtlxF6Xf_x$HLa@VP} z(z8PZ8{a8jHj^uquY(<;Ps-wIMKv&}&qj0Ga_m37IPpX{MGC_Q!bx0R5BLrwt89y= zFHP5yA>Nc9I=Wggl(@D(I8ji#z&^Oe&R|GVVIe$^+h)r!CGAYTd{SK_z2Q#bd{Fv| ztZr%y759TT2=paUIj1$}OC&ClNZ|pU`@3kBHSBMT?9HOd;i@7DjtdsFTI)ngz)wUd z{oN_sIBTW#HR^<{NhLWtHdG5>WfnUaP+`VXqk!ktKh&6-J*P0jPlP9#})s1vQgluksG$RKe>Gy+E>`skpk=SBR z+-~rzab5CWIWJE5L!$^=K26G(p*?S=KJQ*MA{K1B1q_di;p4 z;a#*ew8t8)%gI|PPrhS2OGM1(+-=vpL^#mH*-AcHwQ!G(i2B%IufDX=0Mw>noQgT7vgz zSr+XMI_%6*VHm?pfLIyJ?jaE;VJfjw>9%t7sD{1XO)vj=*;9q?ale{(YTEh9%Vtj; zy8n}KjpAeMulK8Z$)n~|5&;uFr}w8%wYEX^B$h`aae|_`8qa;F(C4y+;p9J!nv4W* zu)1F}te{26%b;ETL#l~!+J`5(kr$Hp1;Zj>O7{l6TAsnS z+_c?_BZ{axW7(&J(Yz059ckU4rs{=ekRHgxf8zgl?CUn;jI{| zw!JlmZK`}V+h&G=6+PpoJec>6@7qM<;j!m5Tb7$#%P;Rbc1d&f9>1AE@3Ch+jQ3l> z$L0g1jU1k${ZI5yw0|B%tVU04h3U)HtKAgc-{-mJ>WYhoBU36MmC<^$91?&cVq`Z( z-W>FLf`q^J^)A#vQnyj;<)f7YIXI|qRNdx_H2LyAv8rTEyEiz$%~1>9pO+?-!)#gp zPU$tyJ4teLN3LltebUJ%qbaMRX?`loeJ=WDm*9y=AWwTi>406qY5Z zBNqL1RKlj>Ox0I>X z@%H;a@Agj4in0=n1LI8G#)OOaq>Bi?2~gLhS29}oH(U@g8VX7WpGN)#Ltk{IV$;g* zCklNU)y7(ii%8{0#JXBw1{dY#>Fj4L`-TF+4m!ZQQqd1N%>~UobtcJ<0Qb zZDfRnSc}togPZn$KDXGn{l&|8vVW)Z(3xY@^^2DcOE&+io4LdvUI@P9Cx;uOo_*5`E0>)Y;v1EjzXdBZgo;!T+2@98~JC$acYVJts_ n+7~KRg?QuT+W-KBh;4Ut(!~!roW0BmO=hr{@wlqp?ZV3 diff --git a/benchmark/decryption.json b/benchmark/decryption.json index 0c13d90..7a8a829 100644 --- a/benchmark/decryption.json +++ b/benchmark/decryption.json @@ -1,18 +1,18 @@ { "results": [ { - "command": "echo \"123456789\" | ~/Projects/safelock-cli/safelock-cli decrypt test.sla safelock_dump --quiet", - "mean": 1.8276349158133336, - "stddev": 0.14566191806696024, - "median": 1.9042654354800002, - "user": 2.309450346666667, - "system": 1.9107805599999999, - "min": 1.6596538664800002, - "max": 1.9189854454800002, + "command": "sleep 0.05; xdotool type \"123456789\"; xdotool key \"Return\" | age --decrypt test.age | tar x --zstd -f - -C safelock_dump", + "mean": 3.2734613258266667, + "stddev": 0.38923582353211417, + "median": 3.30132871616, + "user": 2.7651234999999996, + "system": 6.166127426666666, + "min": 2.87104071616, + "max": 3.64801454516, "times": [ - 1.9189854454800002, - 1.9042654354800002, - 1.6596538664800002 + 3.64801454516, + 2.87104071616, + 3.30132871616 ], "exit_codes": [ 0, @@ -21,18 +21,18 @@ ] }, { - "command": "sleep 0.05; xdotool type \"123456789\"; xdotool key \"Return\" | age --decrypt test.age | tar x --zstd -f - -C safelock_dump", - "mean": 2.816656686146667, - "stddev": 0.2702910723941267, - "median": 2.9378343294800002, - "user": 2.6122993466666666, - "system": 5.240392226666667, - "min": 2.50698103648, - "max": 3.00515469248, + "command": "echo \"123456789\" | ~/Projects/safelock-cli/safelock-cli decrypt test.sla safelock_dump --quiet", + "mean": 2.0015877658266668, + "stddev": 0.006728462206629033, + "median": 2.00485857816, + "user": 2.4911125000000003, + "system": 2.106313093333333, + "min": 1.9938492011600002, + "max": 2.00605551816, "times": [ - 3.00515469248, - 2.9378343294800002, - 2.50698103648 + 2.00605551816, + 1.9938492011600002, + 2.00485857816 ], "exit_codes": [ 0, @@ -42,17 +42,17 @@ }, { "command": "7z e -y -p123456789 -mx1 test.7z -osafelock_dump", - "mean": 18.76303972514667, - "stddev": 0.10991428273642811, - "median": 18.72587103648, - "user": 20.692533679999997, - "system": 1.3673248933333333, - "min": 18.67652879848, - "max": 18.886719340480003, + "mean": 18.780328156826666, + "stddev": 0.09312114686946973, + "median": 18.83279570716, + "user": 20.808235166666666, + "system": 1.4123247599999997, + "min": 18.672811449159997, + "max": 18.83537731416, "times": [ - 18.67652879848, - 18.886719340480003, - 18.72587103648 + 18.83537731416, + 18.83279570716, + 18.672811449159997 ], "exit_codes": [ 0, @@ -62,17 +62,17 @@ }, { "command": "gpgtar -d --yes --batch --gpg-args \"--passphrase 123456789\" test.gpg", - "mean": 6.573486912813334, - "stddev": 0.3839886822791872, - "median": 6.52200845048, - "user": 0.21511468, - "system": 1.4525625599999998, - "min": 6.21783424048, - "max": 6.98061804748, + "mean": 6.849333490159999, + "stddev": 1.0445899571644215, + "median": 6.89337370116, + "user": 0.2077078333333333, + "system": 1.5517317599999998, + "min": 5.78341994016, + "max": 7.87120682916, "times": [ - 6.98061804748, - 6.52200845048, - 6.21783424048 + 6.89337370116, + 7.87120682916, + 5.78341994016 ], "exit_codes": [ 0, diff --git a/benchmark/encryption-time.webp b/benchmark/encryption-time.webp index 65496378a70f09ec26f2d7982eeb4637e45cd956..95cff4cb758faae8b9f4d3d996b29ec4d130ccc5 100644 GIT binary patch literal 6630 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 UVT4DlAy5-Tv$wfHo&L7}0+H_R-~a#s literal 8268 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 Date: Wed, 18 Sep 2024 16:59:30 +0400 Subject: [PATCH 3/4] chore: bump version to 0.6.0 --- cmd/root.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/root.go b/cmd/root.go index b632c1d..75f2825 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -14,7 +14,7 @@ var rootCmd = &cobra.Command{ Use: "safelock-cli", Short: "Simple tool to encrypt/decrypt files with AES encryption", Long: "Simple command-line tool to encrypt and decrypt files with AES encryption", - Version: "0.5.0", + Version: "0.6.0", CompletionOptions: cobra.CompletionOptions{ DisableDefaultCmd: true, }, From 014859c515c3377fa20b400e5d70d644330b8ff3 Mon Sep 17 00:00:00 2001 From: Mohamed Feddad Date: Wed, 18 Sep 2024 17:20:10 +0400 Subject: [PATCH 4/4] chore: fix readme links --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 816ac6a..938fad7 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@

safelock-cli - build status>
+  <img src= linter badge