Course update: lessons, CTF 0x0011a_cb, and documentation

- 0x0011a_cb (Operation Dark Vector): nation-state CTF redesign with an
  AES-128-ECB sealed target and a plaintext launch origin; RP2350 firmware with
  bearing-driven servo, tri-color LEDs, GSV stats, and a realistic no-fix path
- docs: story-driven classified brief, GDB and Ghidra tutorials with deep
  step-throughs, regenerated artifacts and PDFs
- scripts: docstring standard, AES per-student randomizer, telemetry monitor
- week 3 to week 5 lessons: Ghidra patching tutorial, CMSIS-SVD hardware RE,
  double floating-point and GPIO architecture chapters, README structure
This commit is contained in:
Kevin Thomas committed 2026-09-27 14:18:56 -04:00
1 parent 5201ee4b6b
commit 35eacd2c0e
162 files changed
+125658 -232

No files matched your search

+24
View File
@@ -0,0 +1,24 @@
// MIT License
//
// Copyright (c) 2026 Kevin Thomas
//
// File: aes.h
// Desc: Declares AES-128-ECB single-block decryption.
// Created: 2026
#ifndef AES_H
#define AES_H
#include <stdint.h>
/**
* @brief Decrypt one 16-byte block with AES-128-ECB.
*
* @param in 16-byte ciphertext.
* @param key 16-byte key.
* @param out 16-byte plaintext output.
* @return None.
*/
void aes128_ecb_decrypt_block(const uint8_t in[16], const uint8_t key[16], uint8_t out[16]);
#endif // AES_H
+17
View File
@@ -0,0 +1,17 @@
// MIT License
//
// Copyright (c) 2026 Kevin Thomas
//
// File: ctf_target.h
// Desc: AES-128-ECB key and ciphertext for the real target waypoint.
// Created: 2026
#ifndef CTF_TARGET_H
#define CTF_TARGET_H
#include <stdint.h>
#define CTF_AES_KEY { 0x56, 0x45, 0x43, 0x54, 0x4F, 0x52, 0x31, 0x31, 0x41, 0x45, 0x53, 0x4B, 0x45, 0x59, 0x21, 0x21 }
#define CTF_TARGET_CT { 0x20, 0x4F, 0xAC, 0xC2, 0xC0, 0x23, 0xEA, 0x7A, 0x3A, 0x93, 0x0F, 0x71, 0x11, 0x23, 0xEF, 0xCA }
#endif // CTF_TARGET_H
+67
View File
@@ -0,0 +1,67 @@
// MIT License
//
// Copyright (c) 2026 Kevin Thomas
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// Author: Kevin Thomas
// Email: kevin@mytechnotalent.com
// GitHub: https://github.com/mytechnotalent
// File: gps.h
// Desc: Declares PIO UART GPS receiver interface and NMEA parsing logic.
// Created: 2026
#ifndef GPS_H
#define GPS_H
#include <stdbool.h>
#include "hardware/pio.h"
#define GPS_PIN 7
#define GPS_BAUD 9600
#define GPS_PIO pio0
#define GPS_SM 0
/**
* @brief Initialize PIO UART receiver on GPIO7 for u-blox NEO-6M GPS.
*
* @param None.
* @return None.
*/
void init_gps_pio(void);
/**
* @brief Poll PIO RX FIFO and parse incoming NMEA GPS coordinates.
*
* @param lat Pointer to double storing updated latitude.
* @param lon Pointer to double storing updated longitude.
* @return bool True if a valid active 3D GPS fix (RMC 'A') was received, false otherwise.
*/
bool poll_gps(double *lat, double *lon);
/**
* @brief Read latest GNSS signal statistics parsed from GSV sentences.
*
* @param siv Pointer to store satellites-in-view count.
* @param cno Pointer to store best carrier-to-noise ratio in dBHz.
* @return None.
*/
void gps_get_stats(int *siv, int *cno);
#endif // GPS_H
+74
View File
@@ -0,0 +1,74 @@
// MIT License
//
// Copyright (c) 2026 Kevin Thomas
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// Author: Kevin Thomas
// Email: kevin@mytechnotalent.com
// GitHub: https://github.com/mytechnotalent
// File: lcd.h
// Desc: Declares I2C HD44780 (16x2) LCD interface for telemetry coordinates.
// Created: 2026
#ifndef LCD_H
#define LCD_H
#include <stdbool.h>
#include <stdint.h>
#include "hardware/i2c.h"
#define LCD_I2C_INST i2c1
#define LCD_SDA_PIN 2
#define LCD_SCL_PIN 3
#define LCD_BAUD 100000
/**
* @brief Initialize I2C0 peripheral and detect/configure 1602 LCD backpack.
*
* @param None.
* @return None.
*/
void init_lcd(void);
/**
* @brief Render current latitude and longitude on the 16x2 character display.
*
* Row 0: LAT: dd.dddddd N
* Row 1: LON: dd.dddddd W
*
* @param lat Current latitude in decimal degrees.
* @param lon Current longitude in decimal degrees.
* @return None.
*/
void lcd_show_coords(double lat, double lon);
/**
* @brief Render GNSS acquisition telemetry (satellites and C/N0) on the LCD.
*
* Row 0: SAT: nn CNO: nn
* Row 1: ACQUIRING... when satellites are in view, else NO SIGNAL
*
* @param sats Number of satellites currently in view.
* @param cno Best carrier-to-noise ratio in dBHz.
* @return None.
*/
void lcd_show_gnss(int sats, int cno);
#endif // LCD_H
+64
View File
@@ -0,0 +1,64 @@
// MIT License
//
// Copyright (c) 2026 Kevin Thomas
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// Author: Kevin Thomas
// Email: kevin@mytechnotalent.com
// GitHub: https://github.com/mytechnotalent
// File: lora.h
// Desc: Declares UART1 interface for the REYAX RYLR998 LoRa transceiver.
// Created: 2026
#ifndef LORA_H
#define LORA_H
#include "hardware/uart.h"
#define LORA_UART uart1
#define LORA_BAUD 9600
#define LORA_TX_PIN 8
#define LORA_RX_PIN 9
/**
* @brief Initialize LoRa transceiver over UART1 on GPIO8 and GPIO9
*
* @param None.
* @return None.
*/
void init_lora(void);
/**
* @brief Transmit string message over LoRa UART1 interface
*
* @param msg Null-terminated string buffer to transmit.
* @return None.
*/
void lora_send(const char *msg);
/**
* @brief Service the LoRa UART: stream pending TX bytes and drain RX.
*
* @param None.
* @return None.
*/
void lora_tick(void);
#endif // LORA_H
+87
View File
@@ -0,0 +1,87 @@
// MIT License
//
// Copyright (c) 2026 Kevin Thomas
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// Author: Kevin Thomas
// Email: kevin@mytechnotalent.com
// GitHub: https://github.com/mytechnotalent
// File: navigation.h
// Desc: Declares autonomous guidance, dead-reckoning, and telemetry interface.
// Created: 2026
#ifndef NAVIGATION_H
#define NAVIGATION_H
#include <stdbool.h>
/** @brief Pre-programmed programmed decoy waypoint (Centreville, VA). */
extern const double ORIGIN_LAT;
extern const double ORIGIN_LON;
/** @brief Target coordinates, reconstructed at boot from masked constants. */
extern double TARGET_LAT;
extern double TARGET_LON;
/**
* @brief Reconstruct the target waypoint from its XOR-masked constants.
*
* @param None.
* @return None.
*/
void init_navigation(void);
/**
* @brief Transmit telemetry stream over Debug UART0 and LoRa UART1.
*
* @param cur_lat Current micro-UAV latitude.
* @param cur_lon Current micro-UAV longitude.
* @return None.
*/
void send_telemetry(double cur_lat, double cur_lon);
/**
* @brief Advance dead-reckoning position toward programmed waypoint.
*
* @param cur_lat Pointer to current latitude.
* @param cur_lon Pointer to current longitude.
* @return None.
*/
void dead_reckon_step(double *cur_lat, double *cur_lon);
/**
* @brief Verify if micro-UAV has arrived at target coordinates.
*
* @param cur_lat Current latitude coordinate.
* @param cur_lon Current longitude coordinate.
* @return true if arrived at target, false otherwise.
*/
bool check_arrival(double cur_lat, double cur_lon);
/**
* @brief Manage guidance progression, propeller oscillation, and payload release.
*
* @param cur_lat Current latitude coordinate.
* @param cur_lon Current longitude coordinate.
* @return None.
*/
void navigate_to_target(double cur_lat, double cur_lon);
#endif // NAVIGATION_H
+68
View File
@@ -0,0 +1,68 @@
// MIT License
//
// Copyright (c) 2026 Kevin Thomas
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// Author: Kevin Thomas
// Email: kevin@mytechnotalent.com
// GitHub: https://github.com/mytechnotalent
// File: payload.h
// Desc: Declares payload release mechanism interface on GPIO16.
// Created: 2026
#ifndef PAYLOAD_H
#define PAYLOAD_H
#include <stdbool.h>
#define LED_RED_PIN 16
#define LED_GREEN_PIN 17
#define LED_YELLOW_PIN 18
/**
* @brief Initialize GPIO16 (Red failure LED) and GPIO17 (Green success LED).
*
* @param None.
* @return None.
*/
void init_payload(void);
/**
* @brief Update tri-color GNSS status LEDs from fix state and satellites.
*
* Red (GP16) = no satellites in view; Yellow (GP18) = satellites in view
* while acquiring; Green (GP17) = active 3D fix.
*
* @param fix True if an active 3D GPS fix is held.
* @param siv Number of satellites currently in view.
* @return None.
*/
void set_gnss_leds(bool fix, int siv);
/**
* @brief Energize payload latch and illuminate both LEDs at target coordinates.
*
* @param None.
* @return None.
*/
void release_payload(void);
#endif // PAYLOAD_H
+67
View File
@@ -0,0 +1,67 @@
// MIT License
//
// Copyright (c) 2026 Kevin Thomas
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// Author: Kevin Thomas
// Email: kevin@mytechnotalent.com
// GitHub: https://github.com/mytechnotalent
// File: propeller.h
// Desc: Declares SG90 servo PWM mock propeller interface on GPIO6.
// Created: 2026
#ifndef PROPELLER_H
#define PROPELLER_H
#define PROPELLER_PIN 6
/**
* @brief Initialize 50 Hz PWM on GPIO6 for SG90 mock propeller blade.
*
* @param None.
* @return None.
*/
void init_propeller(void);
/**
* @brief Advance mock propeller blade oscillation during flight.
*
* @param None.
* @return None.
*/
void propeller_spin(void);
/**
* @brief Halt mock propeller blade oscillation upon target arrival.
*
* @param None.
* @return None.
*/
void propeller_stop(void);
/**
* @brief Point the servo at the compass bearing toward the target.
*
* @param deg Bearing in degrees from the current position to the target.
* @return None.
*/
void propeller_set_bearing(double deg);
#endif // PROPELLER_H