Security+1.0


Filetype: Flipper SubGhz RAW File
Version: 1
Frequency: 315000000
Preset: FuriHalSubGhzPresetOok650Async
Protocol: RAW
RAW_Data: -59500 500 -1500 500 -1000 1000 -1500 500 -500 1500 -1500 500 -500 1500 -1500 500 -1000 1000 -1500 500 -1500 500 -1500 500 -1000 1000 -1500 500 -500 1500 -1500 500 -1500 500 -1500 500 -1000 1000 -1500 500 -1500 500 -58000
RAW_Data: 1500 -1500 500 -500 1500 -1500 500 -1000 1000 -1500 500 -1500 500 -1500 500 -1000 1000 -1500 500 -500 1500 -1000 1000 -1000 1000 -1500 500 -500 1500 -500 1500 -500 1500 -1000 1000 -500 1500 -1000 1000 -500 1500
*Repeat above 10 times.

The data is a series of digits between 0..2:
0: -1500 500
1: -1000 1000
2: -500 1500
_: -50K+ xxx

Packets…
_01020201000102000100
_02010001021102221212


Rolling [Count] is every other digit (base 3), then reverse the bits...
 v v v v v v v v v v  
_01020201000102000100
_02010001021102221212
 ^ ^ ^ ^ ^ ^ ^ ^ ^ ^

00000000000000010211

(((((0*3+1) * 3 + 0) * 3 + 2) * 3 + 1) * 3 + 1) = 103 
103   = 00000000 00000000 00000000 01100111b
Reverse 11100110 00000000 00000000 00000000b = 0xE6000000  [Count]

Digits in acc from both.
                    
_01020201000102000100  
_02010001021102221212

Acc adds digit from rolling or decoded fixed.
Decoded fixed digit is "(n*3 + digit - acc) % 3"
Acc clears between packets.
Extract fix requires an accumulator of all previous digits.

_01020201000102000100  

acc=0+0 (digit 0)
(0*3 + 1 - 0) = 1     fixed:1    acc=0+1=1
acc=1+0 (digit 0)
(0*3 + 2 - 1) = 1     fixed:11    acc=1+1=2
acc=2+0 (digit 0)
(0*3 + 2 - 2) = 0     fixed:110    acc=2+0=2
acc=2+0 (digit 0)
(1*3 + 1 - 2) = 2     fixed:1102    acc=2+2=4
acc=4+0 (digit 0)
(2*3 + 0 - 4) = 2     fixed:11022    acc=4+2=6
acc=6+0 (digit 0)
(2*3 + 1 - 6) = 1     fixed:110221    acc=6+1=7
acc=7+0 (digit 0)
(2*3 + 2 - 7) = 1     fixed:1102211    acc=7+1=8
acc=8+0 (digit 0)
(3*3 + 0 - 8) = 1     fixed:11022111    acc=8+1=9
acc=9+0 (digit 0)
(3*3 + 1 - 9) = 1     fixed:110221111    acc=9+1=10
acc=9+0 (digit 0)
(4*3 + 0 - 10) = 2    fixed:1102211112    acc=10+2=12
acc=0 (end of packet 1)

_02010001021102221212

acc=0+0 (digit 0)
(0*3 + 2 - 0) = 2     fixed:1102211112_2    acc=0+2=2
acc=2+0 (digit 0)
(1*3 + 1 - 2) = 2     fixed:1102211112_22    acc=2+2=4
acc=4+0 (digit 0)
(2*3 + 0 - 4) = 2     fixed:1102211112_222    acc=4+2=6
acc=6+0 (digit 0)
(2*3 + 1 - 6) = 1     fixed:1102211112_2221    acc=6+1=7
acc=7+0 (digit 0)
(2*3 + 2 - 7) = 1     fixed:1102211112_22211    acc=7+1=8
acc=8+1 (digit 1)
(3*3 + 1 - 9) = 1     fixed:1102211112_222111    acc=9+1=10
acc=10+0 (digit 0)
(3*3 + 2 - 10) = 1     fixed:1102211112_2221111    acc=10+1=11
acc=11+2 (digit 2)
(4*3 + 2 - 13) = 1     fixed:1102211112_22211111    acc=13+1=14
acc=14+1 (digit 1)
(5*3 + 2 - 15) = 2     fixed:1102211112_222111112    acc=15+2=17
acc=17+1 (digit 1)
(6*3 + 2 - 18) = 2     fixed:1102211112_2221111122    acc=15+2=17

1102211112 2221111122  (0x63A4A76D or 1671735149 decimal)

0x63A4A76D/27 decimal = 0x3B0C3D4
1671735149 % 27 decimal = 17 decimal. = 122 base3 (1*9+2*3+2).

Serial/Count…
[Fixed]  Serial = 0x63A4A76D   (sn=0x3B0C3D4, Id1=1, Id0=2, Btn=2)
[Rolling] Count = 0xE6000000


Filetype: Flipper SubGhz Key File
Version: 1
Frequency: 315000000
Preset: FuriHalSubGhzPresetOok650Async
Protocol: Security+ 1.0
Bit: 42
Key: 63 A4 A7 6D E6 00 00 00



Security+2.0
=============

Filetype: Flipper SubGhz RAW File
Version: 1
Frequency: 315000000
Preset: FuriHalSubGhzPresetOok650Async
Protocol: RAW
RAW_Data: 250 -250 250 -250 250 -250 250 -250 250 -250 250 -250 250 -250 250 -250 250 -250 250 -250 250 -250 250 -250 250 -250 250 -250 250 -250 250 -500 250 -250 250 -250 250 -250 500 -250 250 -250 250 -250 250 -250 250 -250 250 -250 250 -250 250 -250 250 -500 500 -500 250 -250 500 -500 250 -250 250 -250 250 -250 250 -250 500 -500 250 -250 250 -250 250 -250 250 -250 250 -250 500 -500 500 -250 250 -250 250 -500 500 -500 500 -500 250 -250 500 -250 250 -500 500 -250 250 -68000
RAW_Data: 250 -250 250 -250 250 -250 250 -250 250 -250 250 -250 250 -250 250 -250 250 -250 250 -250 250 -250 250 -250 250 -250 250 -250 250 -250 250 -500 250 -250 250 -250 250 -250 500 -500 500 -250 250 -500 500 -500 500 -250 250 -500 500 -250 250 -500 500 -500 250 -250 500 -500 250 -250 500 -500 250 -250 500 -250 250 -250 250 -500 250 -250 500 -250 250 -500 250 -250 250 -250 250 -250 250 -250 500 -500 250 -250 250 -250 250 -250 250 -250 250 -250 500 -68000

Repeats 10 times.

Convert into 250 groups...  (positive is 1, negative is 0)
250=1  500=11  -250=0   -500=00

Bitstream:
101010101010101010101010101010100101010110101010101010101001100101100101010101100101010101011001101010011001100101101001101 0... (272 zeros)
101010101010101010101010101010100101010110011010011001101001101001100101100101100101101010010110100101010101100101010101011 0... (272 zeros)

Group into pairs:
10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 01 01 01 01 10 10 10 10 10 10 10 10 10 01 10 01 01 10 01 01 01 01 01 10 01 01 01 01 01 01 10 01 10 10 10 01 10 01 10 01 01 10 10 01 10 10 ...

10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 01 01 01 01 10 01 10 10 01 10 01 10 10 01 10 10 01 10 01 01 10 01 01 10 01 01 10 10 10 01 01 10 10 01 01 01 01 01 10 01 01 01 01 01 01 10 ...

Second digit is value (explain examples... 10 = 0, 01 = 1)

00000000000000001111000000000101101111101111110100010101100100
3C016FBF4564   [Pk1]

00000000000000001111010010100100101101101100011001111101111110
3D292DB19F7E   [Pk2]

Filetype: Flipper SubGhz Key File
Version: 1
Frequency: 315000000
Preset: FuriHalSubGhzPresetOok650Async
Protocol: Security+ 2.0
Bit: 62
Key: 00 00 3D 29 2D B1 9F 7E
Secplus_packet_1: 00 00 3C 01 6F BF 45 64

             PK1: 00 00 3C 01 6F BF 45 64
             PK2: 00 00 3D 29 2D B1 9F 7E

secplus_packet_1:  
00000000000000001111000000000101101111101111110100010101100100 [Pk1]  3C016FBF4564
                                  9  8  7  6  5  4  3  2  1  0 [p2]
                                 9  8  7  6  5  4  3  2  1  0  [p1]
                                9  8  7  6  5  4  3  2  1  0   [p0]
                            3210                               [invert]
                        3210                                   [order]

     base3 digits...  p2[1:0] p2[3:2] p2[5:4] p2[7:6] p2[9:8]  [roll 8..4]
base3 digits... invert[1:0] invert[3:2] order[1:0] order[3:2]  [roll 3..0]
fixed1 = p0*1024+p1

invert method: subghz_protocol_secplus_v2_mix_invet
order method:  subghz_protocol_secplus_v2_mix_order_decode

Repeat above for 2nd packet.

reorder rolling digits (rp2[8],rp1[8],rp2[4:7],rp1[4:7],rp2[0:3],rp1[0:3]) 
rolling digits from base3 to binary.
Count = reverse(rolling 28-bit)
Btn = fixed1 [20:12]
Sn = (fixed1 [19:0],fixed2)


Can you show me the "25 steps" to decode a Security+2.0 signal.



3C016FBF4564  001111000000000101101111101111110100010101100100 [Pk1]
                                  9  8  7  6  5  4  3  2  1  0 [p2]
               p2 = 1111000100b = 964

3C016FBF4564  001111000000000101101111101111110100010101100100 [Pk1]
                                 9  8  7  6  5  4  3  2  1  0  [p1]
               p1 = 0101101000b = 360

3C016FBF4564  001111000000000101101111101111110100010101100100 [Pk1]
                                9  8  7  6  5  4  3  2  1  0   [p0]
               p0 = 1111110111b = 1015


3C016FBF4564  001111000000000101101111101111110100010101100100 [Pk1]
                            3210                               [invert]
            invert method = 0101b = 0x5

3C016FBF4564  001111000000000101101111101111110100010101100100 [Pk1]
                        3210                                   [order]
         order method = 0000b = 0x0


invert method 0x5 in subghz_protocol_secplus_v2_mix_invet
method 0x5 : invert p0 and p2 bits. subghz_protocol_secplus_v2_mix_invet

               p0 = 1111110111b
                    0000001000b = 8 decimal
               p1 = 0101101000b 
                    0101101000b = 360 decimal
               p2 = 1111000100b 
                    0000111011b = 59 decimal

order method 0x0:  subghz_protocol_secplus_v2_mix_order_decode
method 0x0 : swap p1 and p2   subghz_protocol_secplus_v2_mix_order_decode

               p0 = 0000001000b = 8
               p1 = 0000111011b = 59 decimal
               p2 = 0101101000b = 360 decimal
                    9876543210
                   
            base3 digits... p2[1:0] p2[3:2] p2[5:4] p2[7:6] p2[9:8]  [roll 8..4]
                            02211xxxx

            base3 digits... invert[1:0] invert[3:2] order[1:0] order[3:2]  [roll 3..0]
                                 1100

            rollH1 [8..0] = 022111100                
                   
fixed1 = p0*1024+p1    8*1024+59     8192+59 = 8251



3D292DB19F7E  001111010010100100101101101100011001111101111110 [Pk2]
                                9  8  7  6  5  4  3  2  1  0   [p0]
               p0 = 1111001111b = 975

3D292DB19F7E  001111010010100100101101101100011001111101111110 [Pk2]
                                 9  8  7  6  5  4  3  2  1  0  [p1]
               p1 = 0000101011b = 43

3D292DB19F7E  001111010010100100101101101100011001111101111110 [Pk2]
                                  9  8  7  6  5  4  3  2  1  0 [p2]
               p2 = 1110111110b = 958

3D292DB19F7E  001111010010100100101101101100011001111101111110 [Pk2]
                            3210 invert
            invert method = 0100b = 0x4

3D292DB19F7E  001111010010100100101101101100011001111101111110 [Pk2]
                        3210     order
         order method = 1010b = 0xA

invert method 0x4: subghz_protocol_secplus_v2_mix_invet
method 0x4 : invert all.

               p0 = 1111001111b 
                    0000110000 = 48 decimal
               p1 = 0000101011b 
                    1111010100 = 980 decimal
               p2 = 1110111110b
                    0001000001 = 65 decimal

order method 0xa:  subghz_protocol_secplus_v2_mix_order_decode
method 0xa : no reodering

               p0 = 0000110000 = 48 decimal
               p1 = 1111010100 = 980 decimal
               p2 = 0001000001 = 65 decimal
                    9876543210

            base3 digits... p2[1:0] p2[3:2] p2[5:4] p2[7:6] p2[9:8]  [roll 8..4]
                            10010xxxx

            base3 digits... invert[1:0] invert[3:2] order[1:0] order[3:2]  [roll 3..0]
                                 0122

            rollH2 [8..0] = 100100122

fixed2 = p0*1024+p1   48*1024+980   = 50132

fixed2 = 50132 decimal = 1100001111010100b
fixed1 = 8251 decimal =  0010000000111011b

rollH1 [8..0] =          022111100                
rollH2 [8..0] =          100100122

reorder rolling digits (rH2[8],rH1[8],rH2[4:7],rH1[4:7],rH2[0:3],rH1[0:3]) 
            reverse... 100100112222100011 (base3)
                     = 134217895 decimal
                     = 1000000000000000000010100111 binary
            reverse... 1110010100000000000000000001 binary
                       0xE500001

Count = 0xE500001
Btn = fixed1 [15:12]                 0010b = 2 dec
Sn = (fixed1 [11:0] fixed2[15:0])    000000111011_1100001111010100b = 0x3BC3D4