Confirmed, the value gets written to the C0 and C1 protected bits in the RFID tag when the label is printed or a blank label advanced which is what I just tried.
When I advnaced the label by one (not having printed anything) the C0 value changed from C6h to C7h at the end of memory.
So there is no doubt that if you try and simply peel off the label and reuse it, that won't work. As it will presumably count down to zero and won't let you use it any more.
I already wrote about that (see above).
The tag gets a COUNTER INCREMENT whenever a tag feed is issued. The tag increment command needs the READ-Password to be set (which is 0x179AADEF !!!FOR MY TAG!!!, looks like they read the application note to derive passwords from UID).
Meanwhile I read all the spec and have some more insights:
- the SLIX2 tags used from DYMO do NOT have the NXP factory "Originality Signature" embedded, instead a CUSTOM signature from DYMO is used.
(the signature is just signing the UID of the tag, it is static for every UID. Spoofing of tags is still possible, one just needs to read UID + SIGNATURE from a valid dymo tag)
- it is UNLIKELY that they track used UIDs in firmware of the STM32 main MCU. If they would, there is no reason to implement the counter inside of the tag...
- "magic SLIX" tags do exist (where you can set UID yourself), however magic "SLIX2 tags" are not available YET... for sure they will come soon (Toniebox, Dymo, variuos ticketing systems, ... all use SLIX2)
(in a magic SLIX2 tag you just need to set the UID + SIGNATURE (taken from original tag))
- spoofing the complete RFID reader PCB (simple I2C) seems to be a trivial task. In reality only a handful of commands are used which are sent to the tag:
w: 0x36 0x01 0x00 0x00 (INVENTORY)
r: (0x00) 0x01 0xBA 0x6C 0x60 0x3D 0x08 0x01 0x04 0xE0 (=> DSFID + UID)
w: 0x22 0x23 0xBA 0x6C 0x60 0x3D 0x08 0x01 0x04 0xE0 0x00 0x03 (READ MULTIPLE BLOCKS: BLOCK = 0x00, LEN = 0x3 BLOCKS +1)
r: (0x00) 0x03 0x0A 0x82 0xED 0x86 0x39 0x61 0xD2 0x03 0x14 0x1E 0x32 0xB6 0xCA 0x00 0x3C
w: 0x22 0xBD 0x04 0xBA 0x6C 0x60 0x3D 0x08 0x01 0x04 0xE0 (READ SIGNATURE)
r: (0x00) 0x33 0x4A 0x63 0x63 0xD0 0x13 0x49 0xDB 0xA0 0x9E 0xEE 0x15 0x1E 0xF8 0xF8 0xF3 0xFA 0x15 0xF5 0x77 0xE4 0x4D 0x75 0x9B 0x78 0x14 0xCA 0xD3 0x7E 0x02 0xEF 0x10
w: 0x22 0x2B 0xBA 0x6C 0x60 0x3D 0x08 0x01 0x04 0xE0 (GET SYSTEM INFO)
r: (0x00) 0x0F 0xBA 0x6C 0x60 0x3D 0x08 0x01 0x04 0xE0 0x01 0x3D 0x4F 0x03 0x01
w: 0x22 0x23 0xBA 0x6C 0x60 0x3D 0x08 0x01 0x04 0xE0 0x00 0x03 (READ MULTIPLE BLOCKS: BLOCK = 0x00, LEN = 0x3 BLOCKS +1)
r: (0x00) 0x03 0x0A 0x82 0xED 0x86 0x39 0x61 0xD2 0x03 0x14 0x1E 0x32 0xB6 0xCA 0x00 0x3C
w: 0x22 0x23 0xBA 0x6C 0x60 0x3D 0x08 0x01 0x04 0xE0 0x03 0x0F (READ MULTIPLE BLOCKS: BLOCK = 0x03, LEN = 0xF BLOCKS +1)
r: (0x00) 0xB6 0xCA 0x00 0x3C 0x36 0x42 0x0C 0x33 0x53 0x30 0x37 0x32 0x32 0x34 0x30 0x30 0x00 0x00 0x00 0x00 0x00 0xFF 0x04 0x01 0x01 0x00 0x00 0x00 0xA3 0x03 0x1E 0x00 0x26 0x00 0x00 0x00 0x00 0x00 0x0F 0x00 0x76 0x03 0x65 0x01 0x00 0x00 0x00 0x00 0x85 0x01 0x34 0x00 0x75 0x09 0x05 0x00 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00
w: 0x22 0x23 0xBA 0x6C 0x60 0x3D 0x08 0x01 0x04 0xE0 0x14 0x07 (READ MULTIPLE BLOCKS: BLOCK = 0x14, LEN = 0x7 BLOCKS +1)
r: (0x00) 0xD7 0xFA 0x00 0x1C 0x14 0xC2 0x5D 0xBC 0x00 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x00 0x00 0x00 0x3D 0x3C 0xEA 0x07 0x00 0x00 0x00 0x00 0x00 0x00
w: 0x22 0x23 0xBA 0x6C 0x60 0x3D 0x08 0x01 0x04 0xE0 0x1E 0x0C (READ MULTIPLE BLOCKS: BLOCK = 0x1E, LEN = 0xC BLOCKS +1)
r: (0x00) 0x32 0x8C 0x00 0x30 0x3E 0x50 0xEC 0x31 0x00 0x00 0x00 0x00 0x2D 0x07 0xA6 0x12 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
w: 0x22 0x23 0xBA 0x6C 0x60 0x3D 0x08 0x01 0x04 0xE0 0x32 0x0B (READ MULTIPLE BLOCKS: BLOCK = 0x32, LEN = 0xB BLOCKS +1)
r: (0x00) 0x11 0xF3 0x00 0x2C 0xDD 0xC3 0x3E 0x91 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
w: 0x22 0xB2 0x04 0xBA 0x6C 0x60 0x3D 0x08 0x01 0x04 0xE0 (GET RANDOM NUMBER)
r: (0x00) 0xEF 0x30 (=0x30EF)
w: 0x22 0xB3 0x04 0xBA 0x6C 0x60 0x3D 0x08 0x01 0x04 0xE0 0x01 0x00 0x9D 0x75 0x27 (SET PASSWORD: READ_PASS)
r: (0x00)
w: 0x22 0x23 0xBA 0x6C 0x60 0x3D 0x08 0x01 0x04 0xE0 0x4F 0x01 (READ MULTIPLE BLOCKS: BLOCK = 0x4F (79), LEN = 0x1 BLOCKS +1)
r: (0x00) 0xC7 0xFF 0x00 0x01
w: 0x22 0x26 0xBA 0x6C 0x60 0x3D 0x08 0x01 0x04 0xE0 (RESET TO READY)
r: (0x00)
w: 0x22 0x26 0xBA 0x6C 0x60 0x3D 0x08 0x01 0x04 0xE0 (RESET TO READY)
r: (0x00)
...
w: 0x22 0x26 0xBA 0x6C 0x60 0x3D 0x08 0x01 0x04 0xE0 (RESET TO READY)
r: (0x00)
w: 0x22 0xB2 0x04 0xBA 0x6C 0x60 0x3D 0x08 0x01 0x04 0xE0 (GET RANDOM NUMBER)
r: (0x00) 0xB7 0x38 (=0x38B7)
w: 0x22 0xB3 0x04 0xBA 0x6C 0x60 0x3D 0x08 0x01 0x04 0xE0 0x01 0x58 0x95 0x2D 0x2F (SET PASSWORD: READ_PASS)
r: (0x00)
w: 0x22 0x21 0xBA 0x6C 0x60 0x3D 0x08 0x01 0x04 0xE0 0x4F 0x01 0x00 0x00 0x00 (WRITE BLOCK: BLOCK=0x4F (79), DATA = 0x01 0x00 0x00 0x00 (increment counter))
r: (0x00)
w: 0x22 0x23 0xBA 0x6C 0x60 0x3D 0x08 0x01 0x04 0xE0 0x4F 0x01 (READ MULTIPLE BLOCKS: BLOCK = 79, LEN = 0x1 BLOCKS +1)
r: (0x00) 0xC8 0xFF 0x00 0x01
w: 0x22 0x26 0xBA 0x6C 0x60 0x3D 0x08 0x01 0x04 0xE0 (RESET TO READY)
r: (0x00)
w: 0x22 0x26 0xBA 0x6C 0x60 0x3D 0x08 0x01 0x04 0xE0 (RESET TO READY)
r: (0x00)
...
The "increment counter" is checked immediately after the increment. But nothing else is there or even available to prevent spoofing of ORIGINAL tags.
It is also very unlikely that DYMO ever implements a "blacklist" (theoretically they could, especially in combination with the host pc reading the UID and an online connection), BUT since one can read the tags within the original box in the shop (without purchasing them) this would put DYMO at risk reporting original material as bad just because somebody did a readout of the box before it was pruchased...
The complete "solution" from DYMO is based on the WRONG SECURITY SCHEME.
ICODE SLIX2 is just the wrong tag. ICODE DNA would have been the correct choice... But for sure they needed to save money

Open questions:
* what happens when the counter is 0xFFFF and it is incremented? (in case it wraps around... if counter is <0xFFFF then you can print)
* can we "find" the write password by guessing (in case it could be found... the counter could be written to any value, the datasheet does not mention a lock after several wrong tries, just a reset of the tag is enough)
JS
References:
https://www.nxp.com/docs/en/data-sheet/SL2S2602.pdfhttps://www.nxp.com/docs/en/application-note/AN12366.pdf 3.5 Reprogrammable originality signature
NXP offers to either lock the pre-programmed NXP originality signature, or to allow
customers to re-programm and lock the originality signature.
Following steps for Originality Signature generating and reprogramming are
recommended:
1. Generate a public and private key for the parameters secp128r1
2. Create and Sign Originality Signature with private key
3. Verify the Originality Signature with public key
4. Program the Originality Signature into IC memory
5. Lock the Originality Signature
High res picture of annotated mainboard of DYMO550: