@@ -83,6 +83,20 @@ func main() {
83
83
Usage : "Generate RSA and AES backup keys" ,
84
84
Subcommands : []* cli.Command {cmdGenAES , cmdGenRSA },
85
85
}
86
+ cmdEncrypt := & cli.Command {
87
+ Name : "encrypt" ,
88
+ Usage : "Just encrypt a local file" ,
89
+ ArgsUsage : "inFile outFile" ,
90
+ Action : encryptLocalFile ,
91
+ Flags : cipherFlags (),
92
+ }
93
+ cmdDecrypt := & cli.Command {
94
+ Name : "decrypt" ,
95
+ Usage : "Just decrypt a local file" ,
96
+ ArgsUsage : "inFile outFile" ,
97
+ Action : decryptLocalFile ,
98
+ Flags : cipherFlags (),
99
+ }
86
100
app := & cli.App {
87
101
Name : "s3backup" ,
88
102
Usage : "S3 backup script in a single binary" ,
@@ -94,6 +108,8 @@ func main() {
94
108
cmdVaultPut ,
95
109
cmdVaultGet ,
96
110
cmdKeygen ,
111
+ cmdEncrypt ,
112
+ cmdDecrypt ,
97
113
},
98
114
}
99
115
if err := app .Run (os .Args ); err != nil {
@@ -148,6 +164,21 @@ func basicFlags() []cli.Flag {
148
164
}
149
165
}
150
166
167
+ func cipherFlags () []cli.Flag {
168
+ return []cli.Flag {
169
+ & cli.StringFlag {
170
+ Name : "symKey" ,
171
+ Usage : "Base64-encoded 256-bit symmetric AES key" ,
172
+ Destination : & symKey ,
173
+ },
174
+ & cli.StringFlag {
175
+ Name : "pemKey" ,
176
+ Usage : "Path to PEM-encoded public or private key `FILE`" ,
177
+ Destination : & pemKeyFile ,
178
+ },
179
+ }
180
+ }
181
+
151
182
func vaultFlags () []cli.Flag {
152
183
return []cli.Flag {
153
184
& cli.StringFlag {
@@ -324,3 +355,42 @@ func genSecretKey(*cli.Context) error {
324
355
func genKeyPair (* cli.Context ) error {
325
356
return crypto .GenerateRSAKeyPair (rsaPrivKey , rsaPubKey )
326
357
}
358
+
359
+ func encryptLocalFile (ctx * cli.Context ) error {
360
+ cipher , err := createCipher (ctx )
361
+ if err != nil {
362
+ return err
363
+ }
364
+ args := ctx .Args ()
365
+ return cipher .Encrypt (args .Get (0 ), args .Get (1 ))
366
+ }
367
+
368
+ func decryptLocalFile (ctx * cli.Context ) error {
369
+ cipher , err := createCipher (ctx )
370
+ if err != nil {
371
+ return err
372
+ }
373
+ args := ctx .Args ()
374
+ return cipher .Decrypt (args .Get (0 ), args .Get (1 ))
375
+ }
376
+
377
+ func createCipher (ctx * cli.Context ) (client.Cipher , error ) {
378
+ if ctx .NArg () != 2 {
379
+ return nil , errors .New ("in and out files are required" )
380
+ }
381
+ var err error
382
+ var cipher client.Cipher
383
+ if symKey != "" {
384
+ cipher , err = crypto .NewAESCipher (symKey )
385
+ }
386
+ if pemKeyFile != "" {
387
+ cipher , err = crypto .NewRSACipher (pemKeyFile )
388
+ }
389
+ if err != nil {
390
+ return nil , err
391
+ }
392
+ if cipher == nil {
393
+ return nil , errors .New ("either one of symKey or pemKey is required" )
394
+ }
395
+ return cipher , nil
396
+ }
0 commit comments