80 lines
1.9 KiB
C
80 lines
1.9 KiB
C
#define MAX_SIZE 32
|
|
|
|
const uint32_t a = 1103515245;
|
|
const uint32_t c = 12345;
|
|
const uint32_t m = 2147483647;
|
|
uint32_t seed = 1337;
|
|
|
|
unsigned char user_input[MAX_SIZE];
|
|
const uint32_t STATE[4] = {0x1e48add6, 0xaaa7550c, 0x18df53bf, 0xe6af1116};
|
|
|
|
uint32_t start[] = {0x0, 0x0, 0x0, 0x0};
|
|
|
|
uint32_t gen_random(void) {
|
|
seed = (uint32_t)(((uint32_t)a * (uint32_t)seed + (uint32_t)c) % m);
|
|
return (uint32_t)seed;
|
|
}
|
|
|
|
void setup() {
|
|
Serial.begin(115200);
|
|
Serial.println("==================================================");
|
|
Serial.println("= SECURE LOCK - v0.5 =");
|
|
Serial.println("==================================================");
|
|
}
|
|
|
|
int check_pass(uint32_t start[]) {
|
|
Serial.println("checking\n");
|
|
uint32_t temp = 0;
|
|
for (int i = 0; i < 4; ++i) {
|
|
temp = start[i];
|
|
temp *= (uint32_t)0xcafebeef;
|
|
temp += (uint32_t)gen_random();
|
|
temp *= (uint32_t)0xfacefeed;
|
|
temp ^= (uint32_t)gen_random();
|
|
|
|
if ((uint32_t)temp != (uint32_t)STATE[i]) {
|
|
return 0;
|
|
}
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
void loop() {
|
|
|
|
memset(user_input,0,MAX_SIZE);
|
|
memset(start, 0, 16);
|
|
|
|
Serial.println("Enter your password: ");
|
|
|
|
while (Serial.available() == 0) {
|
|
delay(100);
|
|
}
|
|
|
|
Serial.readBytes(user_input, MAX_SIZE);
|
|
|
|
Serial.println();
|
|
for (int i = 0; i < 4; i++) {
|
|
|
|
start[i] |= ((uint32_t)user_input[(i * 4)] << 24);
|
|
start[i] |= ((uint32_t)user_input[(i * 4)+1] << 16);
|
|
start[i] |= ((uint32_t)user_input[(i * 4)+2] << 8);
|
|
start[i] |= ((uint32_t)user_input[(i * 4)+3] << 0);
|
|
|
|
Serial.println(start[i],HEX);
|
|
}
|
|
|
|
if (check_pass(start) == 1) {
|
|
Serial.print("Thats it!\r\nSubmit in the format FLAG{");
|
|
for (int i = 0; i < 4; i++) {
|
|
Serial.print(start[i],HEX);
|
|
}
|
|
Serial.println("}");
|
|
while (true) { delay(1000); }
|
|
}
|
|
|
|
// Failed, just spin
|
|
Serial.println("Incorrect password!");
|
|
while (true) {delay(1000); }
|
|
}
|
|
|