Data format 8 (Encrypted environmental)
Lifecycle: Proposal
This is a proposed encrypted data format which is not yet implemented in Ruuvi devices outside of a few proof-of-concept projects
The encryption uses nRF52-builtin AES128 encryption in Elctronic Codebook (ECB) mode. Data to be encrypted is temprature, humidity, pressure, voltage, TX power, measurement count and movement counts. The measurement sequence counter protects against replay attacks. All measurements where encrypted data and nonce are equal can be considred duplicates.
Data format has an unencrypted header, 16 bytes of AES-128 encrypted data, 1 byte nonce and 6 bytes long MAC address for iOS devices.
Offset
Allowed values
Description
0
8
Data format.
1-2
-32767 ... 32767
Temperature in 0.005 degrees.
3-4
0 ... 40 000
Humidity (16bit unsigned) in 0.0025% (0-163.83% range, though realistically 0-100%).
5-6
0 ... 65534
Pressure (16bit unsigned) in 1 Pa units, with offset of -50 000 Pa.
7-8
0 ... 2046
, 0 ... 30
Power info (11+5bit unsigned), first 11 bits is the battery voltage above 1.6V, in millivolts (1.6V to 3.646V range). Last 5 bits unsigned are the TX power above -40dBm, in 2dBm steps. (-40dBm to +20dBm range).
9-10
0 ... 65534
Movement counter (16 bit unsigned), incremented by motion detection interrupts from accelerometer
11-12
0 ... 65534
Measurement sequence number (16 bit unsigned), each time a measurement is taken, this is incremented by one, used for measurement de-duplication. Depending on the transmit interval, multiple packets with the same measurements can be sent, and there may be measurements that never were sent.
13-16
Any
Reserved for future use.
17
0 ... 255
CRC8, used to check for correct decryption.
18-23
Any valid MAC
48bit MAC address.
The encryption key is formed from 64-bit tag ID, 8 bit encryption nonce and a static password with length of 16 bytes by appending nonce to ID and XORing the 9 bytes with 9 first bytes of password
Invalid values
If a value cannot be determined for any reason, a special invalid value is sent. For unsigned values the invalid value is largest presentable number, for example 0xFFFF
and for signed values the invalud value is smallest presentable number, for example 0x8000
. Invalid values should be treated as NULL, NAN, NONE or similar by the parser.
Example
Data
Value
Temperature
24.58 C
Humidity
40.54 RH-%
Pressure
100453 Pa
Battery
2.765 V
TX Power
+4 dBm
Movement
15
Measurement
6353
Reserved
0
Checksum
MAC
0xAABBCCDDEEFF
Keys
Binary
ID
0x0011223344556677
Password
0x5275757669636f6d5275757669546167 "RuuvicomRuuviTag"
Unencrypted binary:
DF
T
H
P
B+TX
C
M
R
CH
MAC
08
1334
3F58
C515
48E6
000F
18D1
000000E0
1C
AABBCCDDEEDD
Encryption key:
Component
Binary
ID
00 11 22 33 44 55 66 77
password
52 75 75 76 69 63 6f 6d 52 75 75 76 69 54 61 67
Result
52 64 57 45 2d 36 09 1a 52 75 75 76 69 54 61 67
Encrypted data: 0x43825B56324FE019C4BD4D6D3CECAC6E
Complete message:
DF
T
H
P
B+TX
C
M
R
CH
MAC
08
4382
5B56
324F
E019
C4BD
4D6D
3CECAC6E
1C
AABBCCDDEEDD
TODO: Test vectors
Last updated