Add bambu-nfc dump parse, Key-A HKDF, and spool merge.
Parse filanfc-dump/v1 zip/JSON, Bambu 1K images, and merge stickers by tray UID. dump and mifare packages stay importable for a later common library.
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
// Package mifare holds MIFARE Classic 1K layout helpers with no brand-specific memory map.
|
||||
package mifare
|
||||
|
||||
import "fmt"
|
||||
|
||||
const (
|
||||
Sectors = 16
|
||||
Blocks = 64
|
||||
BlockSize = 16
|
||||
SectorSize = 64
|
||||
Size1K = 1024
|
||||
)
|
||||
|
||||
// SectorOf returns the sector index for a block number (0–63).
|
||||
func SectorOf(block int) int {
|
||||
return block / 4
|
||||
}
|
||||
|
||||
// BlockRange returns the half-open block range [first, last) for a sector.
|
||||
func BlockRange(sector int) (first, last int) {
|
||||
first = sector * 4
|
||||
last = first + 4
|
||||
return first, last
|
||||
}
|
||||
|
||||
// SectorBytes returns the 64-byte slice for sector (0–15) from a 1K image.
|
||||
func SectorBytes(image []byte, sector int) ([]byte, error) {
|
||||
if len(image) != Size1K {
|
||||
return nil, fmt.Errorf("image size: want %d got %d", Size1K, len(image))
|
||||
}
|
||||
if sector < 0 || sector >= Sectors {
|
||||
return nil, fmt.Errorf("sector %d out of range", sector)
|
||||
}
|
||||
off := sector * SectorSize
|
||||
return image[off : off+SectorSize], nil
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
package mifare
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestSectorOfAndBlockRange(t *testing.T) {
|
||||
t.Parallel()
|
||||
if got := SectorOf(9); got != 2 {
|
||||
t.Errorf("SectorOf(9) = %d; want 2", got)
|
||||
}
|
||||
first, last := BlockRange(2)
|
||||
if first != 8 || last != 12 {
|
||||
t.Errorf("BlockRange(2) = %d,%d; want 8,12", first, last)
|
||||
}
|
||||
}
|
||||
|
||||
func TestSectorBytes(t *testing.T) {
|
||||
t.Parallel()
|
||||
img := make([]byte, Size1K)
|
||||
img[2*SectorSize] = 0xAB
|
||||
got, err := SectorBytes(img, 2)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if got[0] != 0xAB || len(got) != SectorSize {
|
||||
t.Errorf("SectorBytes sector 2: len=%d first=%02x", len(got), got[0])
|
||||
}
|
||||
if _, err := SectorBytes(img[:1023], 0); err == nil {
|
||||
t.Fatal("short image: want error")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user