From bb46276bde36a6661b2d1fd609692090fe2cf5ea Mon Sep 17 00:00:00 2001 From: Marc Butler Date: Thu, 4 Jul 2024 16:27:51 +1000 Subject: [PATCH] patterns: Added Password Safe Version 3 pattern (#266) * Add password safe V3 * Added description pragma --------- Co-authored-by: Nik --- README.md | 1 + patterns/psafe3.hexpat | 33 ++++++++++++++++++ tests/patterns/test_data/psafe3.hexpat.psafe3 | Bin 0 -> 600 bytes 3 files changed, 34 insertions(+) create mode 100644 patterns/psafe3.hexpat create mode 100644 tests/patterns/test_data/psafe3.hexpat.psafe3 diff --git a/README.md b/README.md index 8704f3aa..e33a0fc6 100644 --- a/README.md +++ b/README.md @@ -96,6 +96,7 @@ Everything will immediately show up in ImHex's Content Store and gets bundled wi | PNG | `image/png` | [`patterns/png.hexpat`](patterns/png.hexpat) | PNG image files | | PRODINFO | | [`patterns/prodinfo.hexpat`](patterns/prodinfo.hexpat) | Nintendo Switch PRODINFO | | Protobuf | | [`patterns/protobuf.hexpat`](patterns/protobuf.hexpat) | Google Protobuf encoding | +| psafe3 | | [`patterns/psafe3.hexpat`](patterns/psafe3.hexpat`) | Password Safe V3 | | PyInstaller | | [`patterns/pyinstaller.hexpat`](patterns/pyinstaller.hexpat) | PyInstaller binray files | | PYC | | [`patterns/pyc.hexpat`](patterns/pyc.hexpat) | Python bytecode files | | QBCL | | [`patterns/qbcl.hexpat`](patterns/qbcl.hexpat) | Qubicle voxel scene project file | diff --git a/patterns/psafe3.hexpat b/patterns/psafe3.hexpat new file mode 100644 index 00000000..eb3ecb72 --- /dev/null +++ b/patterns/psafe3.hexpat @@ -0,0 +1,33 @@ +// Password Safe V3 +// Only a small part of the file is unencrypted. + +#pragma endian little +#pragma description Password Safe V3 + +import std.mem; +import std.sys; + +struct Prologue { + u8 SALT[32]; + u32 ITER; + u8 HPP[32] [[name("H(P')")]]; + u8 B1[16]; + u8 B2[16]; + u8 B3[16]; + u8 B4[16]; + u8 IV[16]; +}; + +struct EOF { + u8 HMAC[32]; +}; + +char magic[4] @ 0x00; +std::assert(magic == "PWS3", "Invalid file: bad tag!"); +char marker[16] @ std::mem::size() - 48; +std::assert(marker == "PWS3-EOFPWS3-EOF", "Invalid file: bad end marker!"); + +Prologue prologue @ 0x04; +u8 HMAC[32] @ std::mem::size() - 32; + +EOF eof @ std::mem::size() - 48; \ No newline at end of file diff --git a/tests/patterns/test_data/psafe3.hexpat.psafe3 b/tests/patterns/test_data/psafe3.hexpat.psafe3 new file mode 100644 index 0000000000000000000000000000000000000000..717d17149c843b2bfb6723e34a7ea202522c3f55 GIT binary patch literal 600 zcmV-e0;l~@S5q@04IVYkJ9o3=Tt9$3xCb}_88pvEOR>0Q4b&)P1O1)=2mk>7$c9k| zofFJ17@by19n|&M!P*APuAh}ZpBt=6r68)<;8dEq-R1K=y{c3_*r~@B545z%_gkCt zpW7p6=yXw-no&m-fWbF@kghd!fUUfCa#&&eaI=ocEy`l!G0*s3cdeyqaWRake+#X2 z2Ay~+??!;&l}_2@7chSo=E1TptV_>}HW6`JWhkcF`#^ank@K6Vw~V~MhguHJSkg8V z{D{iGcE7pLQdYvgD#7mo?jM@yV*}8VgHqa}wTUP80gF@oXjh4$<;+?4iBzg05fbdR z)t7+lmHrPv2<@tuw!tePl97H-4Y65FjfCXo%UU>h@D1ZV0dXrf&%D+vYmpAPPkCZ0c}dHh2hle zM^=h@d!&lZiw3(kN&{UmjiK~b&t+5|ekNG-a;BfEH8W6bDAksqI4%En{GKbutrld| zmqK;`j>MZo*;VSV@OjwGE4nhUyh{lmXNhQ?fAs{XuSS-_HAmok@3GfN(&0o~0Mco) zmwC)H<5isMFE3CfeW!SGci|eDE#pllsKovz=~%Dr#4_X+fo8XnE}t4I=25pq`hnu{ za44C9i5A>eWt`fNdE*utUW}VsOC6K_{sI literal 0 HcmV?d00001