Project Description
This entry is a group submission. Our team consists of the following students from Cal Poly Pomona under the supervision of Dr. Mohamed Aly.
Graduate Students:
Melvin Relf
Patricia Ankunda
Lino Mercado-Esquivias
Muhammed Zahid Kamil
Undergraduate Students:
Russell Hua
Alexander Ea
Shahzman Saqib
For this competition we will set out to safely encrypt and send an audio recording from one Raspberry Pi Pico to another. For the encryption we will use a lightweight cryptographic algorithm. We settled on the TinyJambu algorithm; one of the finalists in the NIST standardization process which can be found here. It would be pretty pointless to send the recording through a wire so we will send it over wifi. In order to exchange the encryption keys over wifi we will use an X3DH key exchange since this will allow for good scalability in the future. This project might be a bit ambitious for us since we have our hands in multiple research projects so we’ll cut stuff down as we see fit. Below is the simple top level design of our project. As can be seen, we will require three picos. To differentiate between the picos we gave them names. Bob sends the encrypted audio, Alice decrypts the audio and plays it, and the server is mainly there for scalability purposes in case the need for twenty Alices arises someday.
Figure: System level design
Figure: Bob flowchart
Figure: Server flowchart
Figure: Alice flowchart
Research
Parts
We already had three picos lying around, so to start we did some research on some cheap modules we could buy to interface the picos to wifi, microphone, and speaker. We ended up buying:
- X1 Adafruit I2S microphone module
- X1 Adafruit I2S stereo decoder
- X3 Espressif ESP-01 wifi module
The wifi module can interface to the pico using UART. The firmware preinstalled on the ESP-01 allows us to create an SSID, connect to a wifi signal, and send data. Both the mic and decoder interface using the i2s protocol. Unfortunately, the pico doesn't natively support i2s but we can implement it using the programmable I/O (PIO).
Figure: Microphone module
Figure: Stereo decoder module
Figure: Wifi module
Language
Now came time to choose a programming language. After looking around we noticed that Python would be the easiest language to interface the pico to the modules since it has all the libraries and plenty of documentation. However, the TinyJambu library is written in C. There were also some ideas floating around of using Go or Rust. Ideally we would run multiple languages on the Pico which we don’t know how to do. After some research we thought maybe an operating system might be the best way to run multiple languages. The two potential operating systems that caught our attention were FUZIX and RTOS. The alternative to the operating system is to write everything in C since we would rather not rewrite the TinyJambu code. Since our choice of language depends on getting the operating system to work, we decided we should start on that first.
Top Comments