Added decrypt
This commit is contained in:
81
src/main.zig
81
src/main.zig
@@ -12,33 +12,72 @@ pub fn main() !void {
|
|||||||
|
|
||||||
try crypto.pwhash.argon2.kdf(allocator, &key, pwd, &nonce, crypto.pwhash.argon2.Params.interactive_2id, crypto.pwhash.argon2.Mode.argon2id);
|
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 encrypt("test.txt", key, nonce);
|
||||||
|
try decrypt(allocator, "test.txt.cha", pwd[0..]);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn decrypt(allocator: std.mem.Allocator, 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, .{});
|
||||||
|
defer file.close();
|
||||||
|
|
||||||
|
_ = try file.read(&nonce);
|
||||||
|
|
||||||
|
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], .{
|
||||||
|
.read = true,
|
||||||
|
.truncate = true,
|
||||||
|
});
|
||||||
|
defer out_file.close();
|
||||||
|
|
||||||
|
var counter: u32 = 0;
|
||||||
|
var read: usize = 0;
|
||||||
|
while (true) {
|
||||||
|
read = try file.read(&in_buf);
|
||||||
|
if (read <= 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
crypto.stream.chacha.XChaCha20IETF.xor(out_buf[0..read], in_buf[0..read], counter, key, nonce);
|
||||||
|
counter += 1;
|
||||||
|
_ = try out_file.write(out_buf[0..read]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
try std.fs.cwd().deleteFile(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn encrypt(path: []const u8, key: [32]u8, nonce: [24]u8) !void {
|
pub fn encrypt(path: []const u8, key: [32]u8, nonce: [24]u8) !void {
|
||||||
var file = try std.fs.cwd().openFile(path, .{});
|
{
|
||||||
defer file.close();
|
var file = try std.fs.cwd().openFile(path, .{});
|
||||||
var out_buf: [512]u8 = undefined;
|
defer file.close();
|
||||||
var in_buf: [512]u8 = undefined;
|
var out_buf: [512]u8 = undefined;
|
||||||
|
var in_buf: [512]u8 = undefined;
|
||||||
|
|
||||||
// missuse out_buf as buffer for format string
|
// missuse out_buf as buffer for format string
|
||||||
_ = try std.fmt.bufPrint(out_buf[0 .. path.len + 4], "{s}.cha", .{path});
|
_ = 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 std.fs.cwd().createFile(out_buf[0 .. path.len + 4], .{
|
||||||
.read = true,
|
.read = true,
|
||||||
});
|
});
|
||||||
defer out_file.close();
|
defer out_file.close();
|
||||||
|
|
||||||
_ = try out_file.write(&nonce);
|
_ = try out_file.write(&nonce);
|
||||||
|
|
||||||
var counter: u32 = 0;
|
var counter: u32 = 0;
|
||||||
var read: usize = 0;
|
var read: usize = 0;
|
||||||
while (true) {
|
while (true) {
|
||||||
read = try file.read(&in_buf);
|
read = try file.read(&in_buf);
|
||||||
if (read <= 0) {
|
if (read <= 0) {
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
crypto.stream.chacha.XChaCha20IETF.xor(out_buf[0..read], in_buf[0..read], counter, key, nonce);
|
||||||
|
counter += 1;
|
||||||
|
_ = try out_file.write(out_buf[0..read]);
|
||||||
}
|
}
|
||||||
|
|
||||||
crypto.stream.chacha.XChaCha20IETF.xor(out_buf[0..read], in_buf[0..read], counter, key, nonce);
|
|
||||||
counter += 1;
|
|
||||||
_ = try out_file.write(out_buf[0..read]);
|
|
||||||
}
|
}
|
||||||
|
try std.fs.cwd().deleteFile(path);
|
||||||
}
|
}
|
||||||
|
|||||||
BIN
test.txt.cha
BIN
test.txt.cha
Binary file not shown.
Reference in New Issue
Block a user