HomeKit Based Pairings
Default code is 3939
.
Transient Pairing
POST /pair-setup
EncryptionKey
is SRP shared secret
Normal Pairing
POST /pair-setup
POST /pair-verify
EncryptionKey
is agreed SessionKey
Encryption
After successful pairing the connection switches to being encrypted using
the format N:n_bytes:tag
where N
is a 16 bit Little Endian length that
describes the number of bytes in n_bytes
and n_bytes
is encrypted using
ChaCha20-Poly1305 with tag
being the Poly1305 tag.
Each direction uses its own key and nonce.
The key for data sent from client to accessory is a HKDF-SHA-512 with the following parameters:
InputKey = <EncryptionKey>
Salt = ”Control-Salt”
Info = ”Control-Write-Encryption-Key”
OutputSize = 32 bytes
While the data sent from accessory to client is HKDF-SHA-512 with the following parameters:
InputKey = <EncryptionKey>
Salt = ”Control-Salt”
Info = ”Control-Read-Encryption-Key”
OutputSize = 32 bytes
The nonce is a 64 bit counter (i.e. the high order bits of the full 96 bit nonce is set to 0) starting with 0 and incrementing by 1 for each encrypted block.
MFi Authentication
When SupportsUnifiedPairSetupAndMFi is enabled and HKP is used, the device can authenticate when pairing. In such case M1 step is done with "Pair Setup with Auth" method.
Also, during the M4 step of the pairing process, in addition of the PROOF TLV used in regular pair-setup, the following TLV is added:
TLV: 0x05,N,ENCRYPTED_DATA_WITH_TAG
where N (int16) is the length of ENCRYPTED_DATA_WITH_TAG
ENCRYPTED_DATA_WITH_TAG has the following format:
<N:ENCRYPTED_DATA>
<16:Poly1305 Tag>
ENCRYPTED_DATA is encrypted using a HKDF-SHA-512 key with the following parameters:
InputKey = <SRP Shared key>
Salt = ”Pair-Setup-Encrypt-Salt”
Info = ”Pair-Setup-Encrypt-Info”
Nonce = ”PS-Msg04”
OutputSize = 32 bytes
Decrypted data contains TLVs, which contain MFi Signature (signed by Apple authenticator IC) and used MFi certificate. The message is signed using RSA-1024 with SHA-1 hash algorithm. The message signed is a HKDF-SHA-512 key with the following parameters:
InputKey = <SRP Shared key>
Salt = ”MFi-Pair-Setup-Salt”
Info = ”MFi-Pair-Setup-Info”
OutputSize = 32 bytes