#include <SoftwareSerial.h> #define RX 3 // *** D3, Pin 2 #define TX 4 // *** D4, Pin 3 SoftwareSerial Serial(RX, TX); const String correctPassword = "secure123"; // Hardcoded password String inputString = ""; // Variable to hold user input bool stringComplete = false; // Flag to indicate when a string is complete bool loggedIn = false; void setup() { Serial.begin(9600); Serial.println(" "); Serial.println("Initializing..."); delay(200); // Delay for initialization Serial.print("[-]> "); } void prompt(){ // Reset for the next input without checking password inputString = ""; stringComplete = false; if(loggedIn == false){ Serial.print("[-]"); // not logged in }else{ Serial.print("[+]"); // logged in } Serial.print("> "); } void loop() { // If the string is complete, process the input if (stringComplete) { // Glitch-prone section: making the comparison more complex and glitch-susceptible volatile bool match = false; // Using 'volatile' to increase glitch vulnerability // Introduce some artificial delays (vulnerable points for glitching) for (volatile int i = 0; i < 100; i++) { delayMicroseconds(1); // Short delay to give more opportunity for glitches } // Dummy operation: XOR password with itself (reversible) before comparison volatile String tempPassword = correctPassword; for (int i = 0; i < tempPassword.length(); i++) { tempPassword[i] ^= 0xFF; // XOR with 0xFF (dummy operation to increase complexity) tempPassword[i] ^= 0xFF; // XOR back to restore original password } // Check if input is "ping" if (inputString == "ping") { Serial.println("pong"); // Respond with "pong" if input is "ping" prompt(); return; // Exit the loop to avoid further processing (no "Password incorrect!" after "pong") } // Now compare the user input with the hardcoded password, but with timing window else if (inputString == correctPassword) { match = true; // Passwords match } // Add a chance for glitches to affect this critical condition if (match) { Serial.println("Password correct!"); loggedIn = true; } else { Serial.println("Password incorrect!"); } prompt(); } // Listen for input from the user while (Serial.available()) { char inChar = (char)Serial.read(); // Read the incoming character // Check if it is the return character (indicating the end of input) if (inChar == '\r' || inChar == '\n') { stringComplete = true; } else { // Append the character to the input string inputString += inChar; } } }