/* * This file is part of the TREZOR project. * * Copyright (C) 2014 Pavol Rusnak <stick@satoshilabs.com> * * This library is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library. If not, see <http://www.gnu.org/licenses/>. */ #include <string.h> #include "pinmatrix.h" #include "oled.h" #include "rng.h" static char pinmatrix_perm[10] = "XXXXXXXXX"; void pinmatrix_draw(const char *text) { const BITMAP *bmp_digits[10] = { &bmp_digit0, &bmp_digit1, &bmp_digit2, &bmp_digit3, &bmp_digit4, &bmp_digit5, &bmp_digit6, &bmp_digit7, &bmp_digit8, &bmp_digit9, }; oledSwipeLeft(); const int w = bmp_digit0.width, h = bmp_digit0.height, pad = 2; int i, j, k; for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { // use (2 - j) instead of j to achieve 789456123 layout k = pinmatrix_perm[i + (2 - j) * 3] - '0'; if (text) { oledDrawStringCenter(0, text); } oledDrawBitmap((OLED_WIDTH - 3 * w - 2 * pad) / 2 + i * (w + pad), OLED_HEIGHT - 3 * h - 2 * pad + j * (h + pad), bmp_digits[k]); } } oledRefresh(); } void pinmatrix_start(const char *text) { int i; for (i = 0; i < 9; i++) { pinmatrix_perm[i] = '1' + i; } pinmatrix_perm[9] = 0; random_permute(pinmatrix_perm, 9); pinmatrix_draw(text); } void pinmatrix_done(char *pin) { int k, i = 0; while (pin && pin[i]) { k = pin[i] - '1'; if (k >= 0 && k <= 8) { pin[i] = pinmatrix_perm[k]; } else { pin[i] = 'X'; } i++; } memset(pinmatrix_perm, 'X', sizeof(pinmatrix_perm)); } #if DEBUG_LINK const char *pinmatrix_get(void) { return pinmatrix_perm; } #endif