README.md
This commit is contained in:
parent
60779f40ca
commit
9d89d9084f
148
README.md
Normal file
148
README.md
Normal file
@ -0,0 +1,148 @@
|
||||
# i2c-stub toy
|
||||
|
||||
Recently I had a chance to play with ``i2c-stub``. The goal was to send and receive encrypted data to/from I2C connected device. I didn't want to play with real I2C device, so I needed to emulate it somehow, which is possible with ``i2c-stub`` on linux. Here below is description how it was done.
|
||||
|
||||
# Requirements
|
||||
|
||||
The solution needs to be implemented in C and have following functionalities
|
||||
* Possibility to connect to I2C slave
|
||||
* Send encrypted data
|
||||
* Receive and decrypt data
|
||||
* Possibility to check connection status
|
||||
|
||||
# The code
|
||||
|
||||
The code itself is here. To compilie with ``gcc`` simply download and ``make``.
|
||||
|
||||
## Initialization
|
||||
|
||||
In order to use the code (read/write data to I2C) I'm using ``i2c-stub`` linux
|
||||
module and i2c-tools package (ArchLinux). ``i2c-stub`` creates a fake I2C adapter(Controller/Master) and emulates i2C hardware (using array to store data). We also will need ``i2c-dev`` module as a frontend.
|
||||
|
||||
Following command will load the module, initialize slave device with an address 0x03, and read it's initial state:
|
||||
|
||||
```
|
||||
> modprobe i2c-dev
|
||||
> modprobe i2c-stub chip_addr=0x03
|
||||
|
||||
> i2cdetect -l
|
||||
i2c-1 i2c i915 gmbus dpc I2C adapter
|
||||
i2c-2 i2c i915 gmbus dpd I2C adapter
|
||||
...
|
||||
i2c-8 smbus SMBus stub driver SMBus adapter <-- this one
|
||||
...
|
||||
|
||||
> i2cdump -y 8 0x03
|
||||
No size specified (using byte-data access)
|
||||
0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
|
||||
00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||
10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||
20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||
|
||||
```
|
||||
|
||||
We can see that module was loaded. ``i2cdetect`` as detected is as a character device ``/dev/i2c-8`` and ``i2c-dump`` shows memory state of slave device with an ID ``0x03``.
|
||||
|
||||
|
||||
## Sending data
|
||||
|
||||
Test program has ``-s`` option that needs to be used in order to send data. As an argument, device ID needs to be provided.
|
||||
|
||||
```
|
||||
> ./bin/main -s 8 && echo $?
|
||||
0
|
||||
```
|
||||
|
||||
On a success program return 0. We can now verify if data has been stored in the i2c device with ``i2cdump``.
|
||||
|
||||
```
|
||||
0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
|
||||
00: 1f f8 47 8e 7f 24 1d 2b 47 ca 64 be ce 0a 3f bd ??G??$?+G?d?????
|
||||
10: 08 1c 05 87 b0 31 6c 85 46 94 6f c8 9e 49 dd b2 ?????1l?F?o??I??
|
||||
20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||
```
|
||||
|
||||
Before sending program uses Poly1305-ChaCha20 to encrypt and authenticate data.
|
||||
|
||||
## Receiving data
|
||||
|
||||
Test program has ``-r`` option to indicate that user want's to receive data from I2C device. On exit program prints received data.
|
||||
|
||||
```
|
||||
[root@cryptoden final]# ./bin/main -r 8
|
||||
RECEIVED DATA:
|
||||
HELLO WORLD!!!
|
||||
```
|
||||
|
||||
As data is authenticated any change to data stored in the I2C will result
|
||||
in decryption error. In order to see this behaviour one can dump the I2C
|
||||
memory, change it, load to I2C and try to read again. Let's see this:
|
||||
|
||||
```
|
||||
> i2cdump -y 8 0x03 b > dump
|
||||
> cat dump
|
||||
[root@cryptoden ~]# cat dump
|
||||
0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
|
||||
00: 1f f8 47 8e 7f 24 1d 2b 47 ca 64 be ce 0a 3f bd ??G??$?+G?d?????
|
||||
10: 08 1c 05 87 b0 31 6c 85 46 94 6f c8 9e 49 dd b3 ?????1l?F?o??I??
|
||||
20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
|
||||
|
||||
## Here I modify 32-nd byte from b3 to b2 and load data to i2c-stub
|
||||
> i2c-stub-from-dump 0x03 dump
|
||||
256 byte values written to 8-0003
|
||||
|
||||
## Trying to read
|
||||
> ./bin/main -r 8
|
||||
[i2c_recv() src/i2c.c:165] Error occured when decrypting
|
||||
[i2c_recv() src/i2c.c:172] ERROR: can't receive encrypted data
|
||||
[test_receive() src/main.c:88] Error occured when receiving data
|
||||
```
|
||||
|
||||
|
||||
## Testing
|
||||
Program has a ``-t`` option which can be used to test program and see
|
||||
that connection stays persistent after connecting to the device.
|
||||
|
||||
```
|
||||
> ./bin/main -t 8 && echo $?
|
||||
0
|
||||
```
|
Loading…
Reference in New Issue
Block a user