ReturnStateContext EngimaState::onRun(QKeyboard &kb) { StateBase* nextState = this; static uint32_t LastScrollTime = HAL_GetTick(); switch (InternalState) { case SET_WHEEL: gui_lable_multiline("Enter password (for rotors)", 0, 10, 128, 64, 0, 0); kb.updateContext(getKeyboardContext()); gui_lable_multiline(&Wheels[0], 0, 30, 128, 64, 0, 0); if (kb.getLastKeyReleased() == 11) { InternalState = PLUG_BOARD; getKeyboardContext().finalize(); getKeyboardContext().init(&PlugBoard[0], sizeof(PlugBoard)); } else if (kb.getLastKeyReleased() == 9) { nextState = StateFactory::getMenuState(); } break; case PLUG_BOARD: gui_lable_multiline("Enter plug board pairs:", 0, 10, 128, 64, 0, 0); kb.updateContext(getKeyboardContext()); gui_lable_multiline(&PlugBoard[0], 0, 30, 128, 64, 0, 0); if (kb.getLastKeyReleased() == 11) { InternalState = ENTER_MESSAGE; getKeyboardContext().finalize(); getKeyboardContext().init(&EntryBuffer[0], sizeof(EntryBuffer)); } else if (kb.getLastKeyReleased() == 9) { nextState = StateFactory::getMenuState(); } break; case ENTER_MESSAGE: { gui_lable_multiline("Enter cipher text: ", 0, 10, 128, 64, 0, 0); kb.updateContext(getKeyboardContext()); uint16_t offset = getKeyboardContext().getCursorPosition() > 37 ? getKeyboardContext().getCursorPosition() - 32 : 0; gui_lable_multiline(&EntryBuffer[offset], 0, 30, 128, 64, 0, 0); if (kb.getLastKeyReleased() == 11) { InternalState = DECRYPT; getKeyboardContext().finalize(); crypt(&Wheels[0], &PlugBoard[0], strlen(&PlugBoard[0]), &EntryBuffer[0]); DisplayOffset = 0; LastScrollTime = HAL_GetTick(); } else if (kb.getLastKeyReleased() == 9) { nextState = StateFactory::getMenuState(); } } break; case DECRYPT: { gui_lable_multiline("Decodes to:", 0, 10, 128, 64, 0, 0); uint32_t decryptedLen = strlen(&EncryptResult[0]); if (decryptedLen > 48 && ((HAL_GetTick()-LastScrollTime)>500)) { LastScrollTime = HAL_GetTick(); DisplayOffset = (DisplayOffset + 1) % decryptedLen; } gui_lable_multiline(&EncryptResult[DisplayOffset], 0, 20, 128, 64, 0, 0); if (kb.getLastKeyReleased() == 11) { InternalState = QUEST_COMPLETION; ShaOBJ sha; sha256_init(&sha); sha256_add(&sha, (const uint8_t*) getContactStore().getMyInfo().getPrivateKey(), ContactStore::PRIVATE_KEY_LENGTH); sha256_add(&sha, (const uint8_t*) &EncryptResult[0], strlen(&EncryptResult[0])); sha256_digest(&sha, &ResultHash[0]); memset(&EntryBuffer[0], 0, sizeof(EntryBuffer)); sprintf(&EntryBuffer[0], "%02x%02x%02x%02x%02x%02x%02x%02x", ResultHash[0], ResultHash[1], ResultHash[2], ResultHash[3], ResultHash[4], ResultHash[5], ResultHash[6], ResultHash[7]); } else if (kb.getLastKeyReleased() == 9) { nextState = StateFactory::getMenuState(); } } break; case QUEST_COMPLETION: gui_lable_multiline("Daemon code: ", 0, 10, 128, 64, 0, 0); gui_lable_multiline(&EntryBuffer[0], 0, 30, 128, 64, 0, 0); if (kb.getLastKeyReleased()==11) { nextState = StateFactory::getMenuState(); } break; default: break; } return ReturnStateContext(nextState); }
void sha224_add(sha224_context* ctxt, const uint8_t data[], uint64_t length) { sha256_add(ctxt, data, length); }