Can now encrypt / decrypt all files in a specific path
This commit is contained in:
58
src/main.zig
58
src/main.zig
@@ -5,30 +5,59 @@ pub fn main() !void {
|
||||
const allocator = std.heap.page_allocator;
|
||||
const pwd = "Test123!";
|
||||
|
||||
var key: [32]u8 = std.mem.zeroes([32]u8);
|
||||
var nonce: [24]u8 = undefined;
|
||||
const dir = try std.fs.cwd().openDir("./test", .{ .iterate = true });
|
||||
if (dir.openDir("private", .{ .iterate = true })) |priv| {
|
||||
var walker = try priv.walk(allocator);
|
||||
defer walker.deinit();
|
||||
|
||||
crypto.random.bytes(&nonce);
|
||||
while (try walker.next()) |f| {
|
||||
if (f.kind == std.fs.Dir.Entry.Kind.file) {
|
||||
decrypt(allocator, priv, f.path, pwd) catch |err| std.debug.print("{?}\n", .{err});
|
||||
}
|
||||
}
|
||||
|
||||
try crypto.pwhash.argon2.kdf(allocator, &key, pwd, &nonce, crypto.pwhash.argon2.Params.interactive_2id, crypto.pwhash.argon2.Mode.argon2id);
|
||||
try encrypt("test.txt", key, nonce);
|
||||
try decrypt(allocator, "test.txt.cha", pwd[0..]);
|
||||
try dir.deleteDir("private");
|
||||
} else |err| switch (err) {
|
||||
std.fs.Dir.OpenError.FileNotFound => {
|
||||
var key: [32]u8 = std.mem.zeroes([32]u8);
|
||||
var nonce: [24]u8 = undefined;
|
||||
crypto.random.bytes(&nonce);
|
||||
try crypto.pwhash.argon2.kdf(allocator, &key, pwd, &nonce, crypto.pwhash.argon2.Params.interactive_2id, crypto.pwhash.argon2.Mode.argon2id);
|
||||
|
||||
try dir.makeDir("private");
|
||||
|
||||
var walker = try dir.walk(allocator);
|
||||
defer walker.deinit();
|
||||
|
||||
while (try walker.next()) |f| {
|
||||
if (f.kind == std.fs.Dir.Entry.Kind.file) {
|
||||
std.debug.print("Encrypting {s}\n", .{f.path});
|
||||
encrypt(dir, f.path, key, nonce) catch |e| std.debug.print("{?}\n", .{e});
|
||||
}
|
||||
}
|
||||
},
|
||||
else => {
|
||||
std.debug.print("Err: {?}\n", .{err});
|
||||
return;
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
pub fn decrypt(allocator: std.mem.Allocator, path: []const u8, pwd: []const u8) !void {
|
||||
pub fn decrypt(allocator: std.mem.Allocator, priv: std.fs.Dir, path: []const u8, pwd: []const u8) !void {
|
||||
{
|
||||
var out_buf: [512]u8 = undefined;
|
||||
var in_buf: [512]u8 = undefined;
|
||||
var nonce: [24]u8 = undefined;
|
||||
var key: [32]u8 = undefined;
|
||||
|
||||
var file = try std.fs.cwd().openFile(path, .{});
|
||||
var file = try priv.openFile(path, .{});
|
||||
defer file.close();
|
||||
|
||||
_ = try file.read(&nonce);
|
||||
var dir = try priv.openDir("..", .{});
|
||||
|
||||
try crypto.pwhash.argon2.kdf(allocator, &key, pwd, &nonce, crypto.pwhash.argon2.Params.interactive_2id, crypto.pwhash.argon2.Mode.argon2id);
|
||||
var out_file = try std.fs.cwd().createFile(path[0 .. path.len - 4], .{
|
||||
var out_file = try dir.createFile(path[0 .. path.len - 4], .{
|
||||
.read = true,
|
||||
.truncate = true,
|
||||
});
|
||||
@@ -47,19 +76,20 @@ pub fn decrypt(allocator: std.mem.Allocator, path: []const u8, pwd: []const u8)
|
||||
_ = try out_file.write(out_buf[0..read]);
|
||||
}
|
||||
}
|
||||
try std.fs.cwd().deleteFile(path);
|
||||
try priv.deleteFile(path);
|
||||
}
|
||||
|
||||
pub fn encrypt(path: []const u8, key: [32]u8, nonce: [24]u8) !void {
|
||||
pub fn encrypt(dir: std.fs.Dir, path: []const u8, key: [32]u8, nonce: [24]u8) !void {
|
||||
{
|
||||
var file = try std.fs.cwd().openFile(path, .{});
|
||||
var file = try dir.openFile(path, .{});
|
||||
defer file.close();
|
||||
var out_buf: [512]u8 = undefined;
|
||||
var in_buf: [512]u8 = undefined;
|
||||
var priv = try dir.openDir("private", .{});
|
||||
|
||||
// missuse out_buf as buffer for format string
|
||||
_ = try std.fmt.bufPrint(out_buf[0 .. path.len + 4], "{s}.cha", .{path});
|
||||
var out_file = try std.fs.cwd().createFile(out_buf[0 .. path.len + 4], .{
|
||||
var out_file = try priv.createFile(out_buf[0 .. path.len + 4], .{
|
||||
.read = true,
|
||||
});
|
||||
defer out_file.close();
|
||||
@@ -79,5 +109,5 @@ pub fn encrypt(path: []const u8, key: [32]u8, nonce: [24]u8) !void {
|
||||
_ = try out_file.write(out_buf[0..read]);
|
||||
}
|
||||
}
|
||||
try std.fs.cwd().deleteFile(path);
|
||||
try dir.deleteFile(path);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user