Update README.md to include details on NEW Protocol (0xCC51) for Wyze cameras
This commit is contained in:
@@ -20,11 +20,23 @@ This document provides a complete reverse-engineering reference for the ThroughT
|
||||
14. [Wyze Cloud API](#14-wyze-cloud-api)
|
||||
15. [Cryptography Details](#15-cryptography-details)
|
||||
16. [Constants Reference](#16-constants-reference)
|
||||
17. [NEW Protocol (0xCC51) Overview](#17-new-protocol-0xcc51-overview)
|
||||
18. [NEW Protocol Discovery](#18-new-protocol-discovery)
|
||||
19. [NEW Protocol DTLS Wrapper](#19-new-protocol-dtls-wrapper)
|
||||
|
||||
---
|
||||
|
||||
## 1. Protocol Stack Overview
|
||||
|
||||
Wyze cameras support two protocol variants depending on firmware version:
|
||||
|
||||
| Protocol | Firmware | Magic | Discovery | Encryption |
|
||||
|----------|----------|-------|-----------|------------|
|
||||
| OLD | Cam v4 ≤ 4.52.9.4188 | TransCode | 0x0601/0x0602 | TransCode + DTLS |
|
||||
| NEW | Cam v4 ≥ 4.52.9.5332 | 0xCC51 | 0x1002 | HMAC-SHA1 + DTLS |
|
||||
|
||||
### OLD Protocol Stack (TransCode-based)
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ Application Layer │
|
||||
@@ -67,6 +79,45 @@ This document provides a complete reverse-engineering reference for the ThroughT
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### NEW Protocol Stack (0xCC51-based)
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ Application Layer │
|
||||
│ Video (H.264/H.265) + Audio (AAC/G.711/Opus) │
|
||||
└──────────────────────────┬──────────────────────────────────┘
|
||||
│
|
||||
┌──────────────────────────▼──────────────────────────────────┐
|
||||
│ AV Frame Layer │
|
||||
│ Frame Types, Channels, FRAMEINFO, Packet Reassembly │
|
||||
└──────────────────────────┬──────────────────────────────────┘
|
||||
│
|
||||
┌──────────────────────────▼──────────────────────────────────┐
|
||||
│ K-Command Authentication │
|
||||
│ K10000-K10003 (XXTEA Challenge-Response) │
|
||||
└──────────────────────────┬──────────────────────────────────┘
|
||||
│
|
||||
┌──────────────────────────▼──────────────────────────────────┐
|
||||
│ AV Login Layer │
|
||||
│ Credentials + Capabilities Exchange │
|
||||
└──────────────────────────┬──────────────────────────────────┘
|
||||
│
|
||||
┌──────────────────────────▼──────────────────────────────────┐
|
||||
│ DTLS 1.2 Encryption │
|
||||
│ PSK = SHA256(ENR), ChaCha20-Poly1305 AEAD │
|
||||
└──────────────────────────┬──────────────────────────────────┘
|
||||
│
|
||||
┌──────────────────────────▼──────────────────────────────────┐
|
||||
│ NEW Protocol Wrapper (0xCC51) │
|
||||
│ Discovery (0x1002) + DTLS Wrapper (0x1502) + HMAC-SHA1 │
|
||||
└──────────────────────────┬──────────────────────────────────┘
|
||||
│
|
||||
┌──────────────────────────▼──────────────────────────────────┐
|
||||
│ UDP Transport │
|
||||
│ Port 32761 (default) │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### Required Credentials
|
||||
|
||||
| Parameter | Description | Source |
|
||||
@@ -131,6 +182,8 @@ Used for K-Command challenge-response authentication.
|
||||
|
||||
## 3. Connection Flow
|
||||
|
||||
### 3.1 OLD Protocol Flow (TransCode-based)
|
||||
|
||||
```
|
||||
Client Camera
|
||||
│ │
|
||||
@@ -175,6 +228,53 @@ Client Camera
|
||||
│ ... │
|
||||
```
|
||||
|
||||
### 3.2 NEW Protocol Flow (0xCC51-based)
|
||||
|
||||
```
|
||||
Client Camera
|
||||
│ │
|
||||
│ ═══════════ Phase 1: Discovery (0x1002) ═══════════ │
|
||||
│ │
|
||||
│ seq=0, ticket=0 (broadcast) ────────────────────► │
|
||||
│ ◄─────────────── seq=1, ticket=T (response) │
|
||||
│ seq=2, ticket=T (echo) ─────────────────────────► │
|
||||
│ ◄───────────────────────────── seq=3, ticket=T │
|
||||
│ │
|
||||
│ ═══════════ Phase 2: DTLS Handshake (0x1502) ══════ │
|
||||
│ │
|
||||
│ ClientHello (wrapped in 0x1502) ────────────────► │
|
||||
│ ◄───────────────────── ServerHello + KeyExchange │
|
||||
│ ClientKeyExchange + Finished ───────────────────► │
|
||||
│ ◄───────────────────────────────── DTLS Finished │
|
||||
│ │
|
||||
│ ═══════════ Phase 3: AV Login ═════════════════════ │
|
||||
│ │
|
||||
│ AV Login #1 (magic=0x0000) ──────────────────────► │
|
||||
│ AV Login #2 (magic=0x2000) ──────────────────────► │
|
||||
│ ◄───────────────────── AV Login Response (0x2100) │
|
||||
│ ACK (0x0009) ────────────────────────────────────► │
|
||||
│ │
|
||||
│ ═══════════ Phase 4: K-Authentication ═════════════ │
|
||||
│ │
|
||||
│ K10000 (Auth Request) ───────────────────────────► │
|
||||
│ ◄───────────────────────── K10001 (Challenge 16B) │
|
||||
│ ACK (0x0009) ────────────────────────────────────► │
|
||||
│ K10002 (Response 38B) ───────────────────────────► │
|
||||
│ ◄───────────────────────── K10003 (Result, JSON) │
|
||||
│ ACK (0x0009) ────────────────────────────────────► │
|
||||
│ │
|
||||
│ ═══════════ Phase 5: Streaming ════════════════════ │
|
||||
│ │
|
||||
│ ◄─────────────────────────────── Video/Audio Data │
|
||||
│ ◄─────────────────────────────── Video/Audio Data │
|
||||
│ ... │
|
||||
```
|
||||
|
||||
**Key Differences from OLD Protocol:**
|
||||
- Discovery uses 4-packet handshake (seq 0→1→2→3) instead of 2-stage discovery + session setup
|
||||
- No TransCode encryption layer - packets use HMAC-SHA1 authentication instead
|
||||
- DTLS records wrapped in 0x1502 frames with auth bytes appended
|
||||
|
||||
---
|
||||
|
||||
## 4. IOTC Packet Structures
|
||||
@@ -1063,3 +1163,139 @@ authkey = b64.replace('+', 'Z').replace('/', '9').replace('=', 'A')
|
||||
| MaxPacketSize | 2048 | Max UDP packet |
|
||||
| IOTCChannelMain | 0 | Main channel (DTLS client) |
|
||||
| IOTCChannelBack | 1 | Backchannel (DTLS server) |
|
||||
|
||||
### 16.6 NEW Protocol Constants
|
||||
|
||||
| Constant | Value | Description |
|
||||
|----------|-------|-------------|
|
||||
| MagicNewProto | 0xCC51 | NEW protocol magic (LE) |
|
||||
| CmdNewProtoDiscovery | 0x1002 | Discovery command |
|
||||
| CmdNewProtoDTLS | 0x1502 | DTLS data command |
|
||||
| NewProtoPayloadSize | 0x0028 | 40 bytes payload |
|
||||
| NewProtoPacketSize | 52 | Total discovery packet size |
|
||||
| NewProtoHeaderSize | 28 | DTLS packet header size |
|
||||
| NewProtoAuthSize | 20 | Auth bytes (HMAC-SHA1) |
|
||||
|
||||
---
|
||||
|
||||
## 17. NEW Protocol (0xCC51) Overview
|
||||
|
||||
The NEW protocol (magic 0xCC51) is used by Wyze Cam v4 with firmware 4.52.9.5332 and later. It replaces the TransCode cipher layer with HMAC-SHA1 authentication and simplifies the discovery process.
|
||||
|
||||
### Key Differences from OLD Protocol
|
||||
|
||||
| Aspect | OLD Protocol | NEW Protocol |
|
||||
|--------|--------------|--------------|
|
||||
| Magic | TransCode encoded | 0xCC51 |
|
||||
| Discovery | 0x0601/0x0602 + 0x0402/0x0404 | 0x1002 (4-packet handshake) |
|
||||
| Encryption | TransCode + DTLS | HMAC-SHA1 + DTLS |
|
||||
| DTLS Wrapper | DATA_TX 0x0407 | 0x1502 with auth bytes |
|
||||
| P2P Servers | Required for relay | Not required (LAN only) |
|
||||
|
||||
### Authentication
|
||||
|
||||
All NEW protocol packets include a 20-byte HMAC-SHA1 authentication field:
|
||||
|
||||
```go
|
||||
// Key derivation
|
||||
authKey := CalculateAuthKey(enr, mac) // 8-byte key from ENR + MAC
|
||||
key := append([]byte(uid), authKey...) // UID (20 bytes) + AuthKey (8 bytes)
|
||||
|
||||
// HMAC-SHA1 calculation
|
||||
h := hmac.New(sha1.New, key)
|
||||
h.Write(packetHeader) // Header bytes before auth field
|
||||
authBytes := h.Sum(nil) // 20 bytes
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 18. NEW Protocol Discovery
|
||||
|
||||
Discovery uses command 0x1002 with a 4-packet handshake sequence.
|
||||
|
||||
### 18.1 Discovery Packet Structure (52 bytes)
|
||||
|
||||
```
|
||||
Offset Size Field Description
|
||||
──────────────────────────────────────────────────────────────
|
||||
[0-1] 2 Magic 0xCC51 (little-endian)
|
||||
[2-3] 2 Flags 0x0000 (constant)
|
||||
[4-5] 2 Command 0x1002 (Discovery)
|
||||
[6-7] 2 PayloadSize 0x0028 (40 bytes)
|
||||
[8-9] 2 Direction 0x0000=Request, 0xFFFF=Response
|
||||
[10-11] 2 Reserved 0x0000
|
||||
[12-13] 2 Sequence 0, 1, 2, or 3
|
||||
[14-15] 2 Ticket 0x0000 initially, then from camera
|
||||
[16-23] 8 SessionID Random[2] + Constant[6]
|
||||
[24-31] 8 Capabilities 0x00 08 03 04 1d 00 00 00
|
||||
[32-51] 20 AuthBytes HMAC-SHA1(key, header[0:32])
|
||||
```
|
||||
|
||||
### 18.2 Handshake Sequence
|
||||
|
||||
```
|
||||
Step Direction Seq Ticket Description
|
||||
────────────────────────────────────────────────────────────────
|
||||
1 Client→Cam 0 0x0000 Discovery request (broadcast)
|
||||
2 Cam→Client 1 T Discovery response (ticket assigned)
|
||||
3 Client→Cam 2 T Echo request (confirms ticket)
|
||||
4 Cam→Client 3 T Echo ACK (handshake complete)
|
||||
```
|
||||
|
||||
### 18.3 SessionID Generation
|
||||
|
||||
```go
|
||||
sessionID := make([]byte, 8)
|
||||
rand.Read(sessionID[:2]) // Random prefix
|
||||
copy(sessionID[2:], []byte{0x76, 0x0a, 0x9d, 0x24, 0x88, 0xba}) // Constant suffix
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 19. NEW Protocol DTLS Wrapper
|
||||
|
||||
After discovery, DTLS records are wrapped in command 0x1502 frames with HMAC-SHA1 authentication.
|
||||
|
||||
### 19.1 DTLS Wrapper Structure (variable size)
|
||||
|
||||
```
|
||||
Offset Size Field Description
|
||||
──────────────────────────────────────────────────────────────
|
||||
[0-1] 2 Magic 0xCC51 (little-endian)
|
||||
[2-3] 2 Flags 0x0000
|
||||
[4-5] 2 Command 0x1502 (DTLS)
|
||||
[6-7] 2 PayloadSize 16 + dtls_len + 20
|
||||
[8-9] 2 Direction 0x0000=Request
|
||||
[10-11] 2 Reserved 0x0000
|
||||
[12-13] 2 Sequence 0x0010 (fixed for DTLS)
|
||||
[14-15] 2 Ticket From discovery handshake
|
||||
[16-23] 8 SessionID 8 bytes from discovery
|
||||
[24-27] 4 Channel 1=Main (client), 2=Back (server)
|
||||
[28-N] var DTLSPayload Raw DTLS record
|
||||
[N:N+20] 20 AuthBytes HMAC-SHA1(key, bytes[0:N])
|
||||
```
|
||||
|
||||
### 19.2 PayloadSize Calculation
|
||||
|
||||
```
|
||||
PayloadSize = 16 + len(DTLSPayload) + 20
|
||||
|
||||
Where:
|
||||
16 = seq(2) + ticket(2) + sessionID(8) + channel(4)
|
||||
20 = AuthBytes (HMAC-SHA1)
|
||||
```
|
||||
|
||||
### 19.3 TX/RX Processing
|
||||
|
||||
**Transmit (TX):**
|
||||
1. Build header with magic, command, payload size
|
||||
2. Append session fields (seq, ticket, sessionID, channel)
|
||||
3. Append DTLS payload
|
||||
4. Calculate HMAC-SHA1 over entire packet (excluding auth bytes position)
|
||||
5. Append auth bytes
|
||||
|
||||
**Receive (RX):**
|
||||
1. Verify magic == 0xCC51
|
||||
2. Extract DTLS payload from position 28 to (length - 20)
|
||||
3. Strip 20 auth bytes from end
|
||||
4. Pass DTLS payload to DTLS layer
|
||||
|
||||
Reference in New Issue
Block a user