From 0316f2b667f04c91d54194d0227e4b8f9227246c Mon Sep 17 00:00:00 2001 From: applecuckoo <113647417+applecuckoo@users.noreply.github.com> Date: Tue, 23 Jul 2024 18:30:05 +1200 Subject: [PATCH] patterns: Add PKM pattern + add BCC checksum verification to ntag pattern (#274) * patterns/ntag: add BCC checksum verification * patterns: add PKM file pattern * Add entry to README * Added missing import --------- Co-authored-by: Nik --- README.md | 1 + patterns/ntag.hexpat | 35 ++++++++++++++++++++++++ patterns/pkm.hexpat | 27 ++++++++++++++++++ tests/patterns/test_data/pkm.hexpat.pkm | Bin 0 -> 4112 bytes 4 files changed, 63 insertions(+) create mode 100644 patterns/pkm.hexpat create mode 100644 tests/patterns/test_data/pkm.hexpat.pkm diff --git a/README.md b/README.md index 9f9544f..8378e64 100644 --- a/README.md +++ b/README.md @@ -94,6 +94,7 @@ Everything will immediately show up in ImHex's Content Store and gets bundled wi | PP | | [`patterns/selinuxpp.hexpat`](patterns/selinuxpp.pat) | SE Linux package | | PFS0 | | [`patterns/pfs0.hexpat`](patterns/pfs0.hexpat) | Nintendo Switch PFS0 archive (NSP files) | | PIF | `image/pif` | [`patterns/pif.hexpat`](patterns/pif.hexpat) | PIF Image Format | +| PKM | | [`patterns/pkm.hexpat`](patterns/pkm.hexpat) | PKM texture format | | 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 | diff --git a/patterns/ntag.hexpat b/patterns/ntag.hexpat index 9aadc15..831acd1 100644 --- a/patterns/ntag.hexpat +++ b/patterns/ntag.hexpat @@ -2,6 +2,7 @@ #pragma description NTAG213/NTAG215/NTAG216, NFC Forum Type 2 Tag compliant IC import std.core; +import std.io; using BitfieldOrder = std::core::BitfieldOrder; @@ -147,6 +148,38 @@ bitfield ACCESS { AUTHLIM : 3; }; +fn validate_ntag_checksum(ManufacturerData mdata) { + + /* + 0x88 is the CT/cascade digit. + This is XOR'd with the first 3 bytes of the serial to calculate BCC0. + */ + + u8 bcc0 = 0x88 ^ + mdata.serial1[0] ^ + mdata.serial1[1] ^ + mdata.serial1[2]; + + if (bcc0 == mdata.checkByte0) { + std::print("NTAG BCC0 checksum OK. Value: {}", bcc0); + } else { + std::warning(std::format("NTAG BCC0 checksum failed! Value: {}", bcc0)); + } + + // BCC1 is the XOR of the last 4 serial bytes. + + u8 bcc1 = mdata.serial2[0] ^ + mdata.serial2[1] ^ + mdata.serial2[2] ^ + mdata.serial2[3]; + + if (bcc1 == mdata.checkByte1) { + std::print("NTAG BCC1 checksum OK. Value: {}", bcc1); + } else { + std::warning(std::format("NTAG BCC1 checksum failed! Value: {}", bcc1)); + } +}; + struct Config { MIRROR MIRROR; u8 MIRROR_PAGE; @@ -166,3 +199,5 @@ struct NTAG { }; NTAG ntag @ 0x00; + +validate_ntag_checksum(ntag.manufacturerData); diff --git a/patterns/pkm.hexpat b/patterns/pkm.hexpat new file mode 100644 index 0000000..2ce2180 --- /dev/null +++ b/patterns/pkm.hexpat @@ -0,0 +1,27 @@ +#pragma description PKM (PacKMan) files containing ETC (Ericsson Texture Compression) +#pragma author applecuckoo +#pragma endian big + +enum PKMFormat : u16 { + ETC1_RGB_NO_MIPMAPS, + ETC2PACKAGE_RGB_NO_MIPMAPS, + ETC2PACKAGE_RGBA_NO_MIPMAPS_OLD, + ETC2PACKAGE_RGBA_NO_MIPMAPS, + ETC2PACKAGE_RGBA1_NO_MIPMAPS, + ETC2PACKAGE_R_NO_MIPMAPS, + ETC2PACKAGE_RG_NO_MIPMAPS, + ETC2PACKAGE_R_SIGNED_NO_MIPMAPS, + ETC2PACKAGE_RG_SIGNED_NO_MIPMAPS +}; + +struct PKMHeader { + char id[4]; + char version[2]; + PKMFormat pkm_format; + u16 width; + u16 height; + u16 original_width; + u16 original_height; +}; + +PKMHeader pkm_header @ 0x00 [[comment("PKM file header"), name("Header")]]; \ No newline at end of file diff --git a/tests/patterns/test_data/pkm.hexpat.pkm b/tests/patterns/test_data/pkm.hexpat.pkm new file mode 100644 index 0000000000000000000000000000000000000000..32479c064e20a1ab6890bdf3e5747c0f074ddee0 GIT binary patch literal 4112 zcmd^?e`p(J7{}ixX*ai~X`3nOV3^iSHV~G!S{1}pUB#Oex|UL0k*0KzZS`Eiq4-y> zDj4U$G-$W>O6Z0~MZprcW2J141szD$(t&i#!Yb?!hb)V3My!R`=e@h<&Gj`|H`o2; z^&t87z32OWKli-%BW*9XdK>)2PMXa>!Z#cLW_d=&|U66B^9i-_zQ6eNX0Rr|l za@EE+U|V&4O3uy8S_v<|h>XjP1Y9 z|IrY@&|EC=YPu{-t`kS)@GSAgB;+Lm|2szwes`06g}4Zxe@wm+m#4mO%57kNKQ40Z zpMEng4es5~h_1?xwnKRt_n^}XLc)Y%E^<{S)a&#EwprFWtrx)bC2#x3|>Qihki^zz<8_ADkt$o{T)$AScv`(?$J6f92fPgbM4$ zURF-rG|l^kc@Ldnv)@$N{0FvI*V#9YMfq>V!fy>{AV)@Rh1ZMEcAOk^w}4$S@_RZWJ;>UdQo$Jv;JRxCci&;hG#cD3Z75V zAM)z_tpChF^ymEM{9?VRt^Ck^-v80Q`_;aY&wsP>yXfurAL}t6YV5zxkAp_2JLabr ze)LCv)FQ8_k>B0)$`xw4|Bd!+PzA#6^hbW2U#u5(p1(T?{m=7vRg8A+-PfPzKT)3Lqq z6OS-{M~$z&1$KP?i8>LN^yeR|?}U0pAGd>-}JxA`HlQnMc$H4@E@D> zI_4jQ=O3I%TD^J48R}}_YjTS;V$Wm<8B$dGcm9AUX|1E8w>c=Dh zhdaxMcS<|9q8WVZ<2rw=Rm1t-RgCvPgWr