| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | /* | ||
| 2 | * devcrypto - Wiimote device-side crypto implementation | ||
| 3 | * Copyright (C) 2008-2009 Héctor Martín <hector@marcansoft.com> | ||
| 4 | * | ||
| 5 | * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR MIT | ||
| 6 | * | ||
| 7 | */ | ||
| 8 | #include <stdlib.h> | ||
| 9 | #include <time.h> | ||
| 10 | #include <stdio.h> | ||
| 11 | #include <string.h> | ||
| 12 | #include <esp32/rom/ets_sys.h> | ||
| 13 | #include "devcrypto.h" | ||
| 14 | |||
| 15 | typedef unsigned short u16; | ||
| 16 | typedef unsigned int u32; | ||
| 17 | typedef unsigned long long u64; | ||
| 18 | typedef signed char s8; | ||
| 19 | typedef signed short s16; | ||
| 20 | typedef signed int s32; | ||
| 21 | typedef signed long long s64; | ||
| 22 | |||
| 23 | static u8 ans_tbl[7][6] = { | ||
| 24 | {0x43,0xF7,0xE0,0xA6,0x77,0xA8,}, | ||
| 25 | {0x97,0x72,0xE2,0x85,0x35,0x5A,}, | ||
| 26 | {0x38,0x87,0x62,0x1A,0xB7,0x8F,}, | ||
| 27 | {0x3E,0x4F,0xBE,0xC7,0x67, 0xD,}, | ||
| 28 | {0xB7,0x68,0x8F,0x37,0x76,0x20,}, | ||
| 29 | {0xE3,0x10,0x2B,0x3F,0x26,0xA9,}, | ||
| 30 | { 0xA,0x85, 0xE,0x90,0x7E,0x30,}, | ||
| 31 | }; | ||
| 32 | |||
| 33 | static u8 tsbox[256] = { | ||
| 34 | 0x70,0x51, 3,0x86,0x40, 0xD,0x4F,0xEB,0x3E,0xCC,0xD1,0x87,0x35,0xBD,0xF5, 0xB, | ||
| 35 | 0x5E,0xD0,0xF8,0xF2,0xD5,0xE2,0x6C,0x31, 0xC,0xAD,0xFC,0x21,0xC3,0x78,0xC1, 6, | ||
| 36 | 0xC2,0x4C,0x55,0xE6,0x4A,0x34,0x48,0x11,0x1E,0xDA,0xE7,0x1A,0x84,0xA0,0x96,0xA7, | ||
| 37 | 0xE3,0x7F,0xAF,0x63,0x9C,0xFA,0x23,0x5B,0x79,0xC8,0x9E,0xBA,0xB2,0xC9,0x22,0x12, | ||
| 38 | 0x4B,0xB3,0xA1,0xB6,0x32,0x49,0xA2,0xE1,0x89,0x39,0x10,0x66,0xC5, 7,0x8F,0x54, | ||
| 39 | 0xEA,0x91,0xCA,0x3F,0xF9,0x19,0xF0,0xD7,0x46,0xBC,0x28,0x1B,0x61,0xE8,0x2F,0x6A, | ||
| 40 | 0xAE,0x9D,0xF6,0x4E, 9,0x14,0x77,0x4D,0xDB,0x1F,0x2E,0x7B,0x7C,0xF1,0x43,0xA3, | ||
| 41 | 0,0xB8,0x13,0x8C,0x85,0xB9,0x29,0x75,0x88,0xFD,0xD2,0x56,0x1C,0x50,0x97,0x41, | ||
| 42 | 0xE5,0x3B,0x60,0xB5,0xC0,0x64,0xEE,0x98,0xD6,0x2D,0x25,0xA4,0xAA,0xCD,0x7D,0xA8, | ||
| 43 | 0x83,0xC6,0xAB,0xBE,0x44,0x99,0x26,0x3C,0xCE,0x9F,0xBF,0xD3,0xCB,0x76,0x7A,0x7E, | ||
| 44 | 0x82, 1,0x8A,0x9A,0x80,0x1D, 0xE,0xB0,0x5C,0xD4,0x38,0x62,0xF4,0x30,0xE0,0x8E, | ||
| 45 | 0x53,0xB7, 2,0x57,0xAC,0xA6,0x52, 0xA,0x6D,0x92,0x65,0x17,0x24,0x33,0x45,0x72, | ||
| 46 | 0x74,0xB1,0xB4,0xF7,0x5D,0xED,0x2C,0xFF,0x47,0x37,0x5A,0x90,0xBB,0xDF,0x2A,0x16, | ||
| 47 | 0x59,0x95,0xD9,0xC4,0x27,0x67,0x73,0xC7,0x68,0xFE,0xA5,0xDD,0x6B,0x5F,0x93,0xD8, | ||
| 48 | 0xEC, 5,0x3A,0x8D,0x6E,0xFB,0x3D,0xA9,0x69,0x36,0xF3,0x94,0xDE,0xEF,0x15,0x6F, | ||
| 49 | 0x8B,0x9B, 8, 0xF,0xDC,0x81,0x18,0x20, 4,0xE4,0x71,0xCF,0xE9,0x2B,0x42,0x58, | ||
| 50 | }; | ||
| 51 | |||
| 52 | static u8 sboxes[8][256] = { | ||
| 53 | { | ||
| 54 | 1,0xA0,0xA9,0x62,0xD6,0x3F,0x85,0xA7,0xB6,0xD4,0xFA,0x15,0x66,0x17, 9,0xBD, | ||
| 55 | 0x5D,0x14,0x34,0x26,0x59,0x72,0x91,0x54, 6,0x4F,0xF8,0xB0,0x5B,0x74,0x93,0x99, | ||
| 56 | 0x8C,0xF2,0x45,0xCD,0xEA,0x4E,0xAD,0x10,0x4A,0xE5,0xCA,0xEE,0xDF,0xC6,0x6F,0x9F, | ||
| 57 | 0x88,0x8E, 2,0xCC, 8,0xA8,0x77,0x94,0x6D,0x21,0xB1,0x28,0xE4,0x39,0x79,0x96, | ||
| 58 | 0x60,0x71,0x81,0x16,0x2E,0xE6,0x78,0xB9,0xC4,0x46,0x9A,0x42,0xAE,0xB7,0x7C,0x43, | ||
| 59 | 0xB3,0x22,0x1A,0x86,0xC2,0x32,0x3D,0x2D,0x9C,0xD2,0x29,0xE9,0x63,0x9B,0xD1,0x31, | ||
| 60 | 0x38,0x5E,0x1E,0x36,0x41,0xBB, 3,0x18,0x2B,0x3E,0xBF,0x68,0x61,0xFC,0x52,0xC0, | ||
| 61 | 0xDE,0xE0, 0xA,0x58,0x13,0x5A, 0,0xBE,0x1C,0x90, 0xE,0x53,0x12,0xFD,0xE2,0x6E, | ||
| 62 | 0xBA,0xCE,0x24,0x27,0x44,0x7F,0x87,0xA3,0xA1,0xD5,0x50,0x40,0xE3,0xF9,0x83,0xF7, | ||
| 63 | 0xC7,0xA2,0x35,0xC8,0xDB,0x19,0xAB,0x2F,0x11,0x25,0xED,0x33,0x9E,0x55,0xE1,0x48, | ||
| 64 | 0xAF,0x73,0x84,0xDA,0x2A,0xAA,0x51,0xEB,0x9D,0x95,0xB2,0xCB,0xE7,0x70,0x80,0xFE, | ||
| 65 | 0x4C,0x65, 4,0xEF,0xC5,0xF1,0xC3,0x3A,0xB4,0xF5,0x5F,0x23,0x89,0xDD,0x30,0xA5, | ||
| 66 | 0x8B,0xD3,0xF6,0xDC,0x4D,0x64,0xD7,0xF0,0x8F,0xEC,0x56,0x37,0x5C,0xA4, 0xD, 7, | ||
| 67 | 0x76,0x8A,0x2C, 0xB,0xB5,0xD8,0xC1,0x1F,0xE8,0x3B,0xF4,0x4B,0x1B,0x47,0x6C,0x49, | ||
| 68 | 0x67,0x7B,0x92,0xCF,0x75,0x7E,0x20,0xD9,0x7D,0x3C,0x97,0x7A,0xD0, 5,0x6B, 0xF, | ||
| 69 | 0x1D,0xFB,0x82,0x98,0x57,0x8D,0xF3,0x6A,0xBC,0xAC,0xC9,0xA6,0xFF,0xB8,0x69, 0xC, | ||
| 70 | }, | ||
| 71 | { | ||
| 72 | 0x4C,0x4D,0x72, 7,0x5A,0x49,0x33,0x8D,0xA2,0xAB,0x46,0x3D,0x63, 0xD,0xA0,0x97, | ||
| 73 | 0xFF,0xF0,0xF5,0xFA,0xC0,0xE9,0xDB,0x62,0xE4,0xE1,0x74,0x43,0xDC,0x86,0x18,0x29, | ||
| 74 | 0x37,0xF4, 6,0xE2,0xED,0x6F,0x90,0x48,0x1E,0x2D,0x1D,0xEA,0x73,0x94,0x54,0xDF, | ||
| 75 | 0x25,0xF6,0x47,0x27,0xD9,0x11,0x77,0xC9,0x84,0x1C,0x5B,0x5C,0x51,0x81,0xA6,0x22, | ||
| 76 | 0x3E,0x24,0x96,0xC8,0x8A,0xEC,0x82,0x7C, 9,0xB8,0x45,0x4A,0x57,0xBB,0x2F,0x50, | ||
| 77 | 0x75,0x8E,0x61,0x70,0x8C,0x6C,0xAF,0xD0,0xFD,0xB4,0x1B,0xAE,0xDE,0xFE,0x3B,0xB5, | ||
| 78 | 0x36,0xBD,0x55, 1, 0xE,0x9C,0x41,0x56,0x5F,0xB3,0x26, 3,0x83,0xBA,0x13,0x4B, | ||
| 79 | 0xCA,0xC5, 0xA,0xF8,0x60,0xA5,0xB9,0xC7,0xC3,0x98,0x32,0xFB,0x12,0xF9,0xA7,0x92, | ||
| 80 | 0xAA,0x68,0xF3,0x78,0x7E, 5,0x20,0x21, 2,0xE8,0xBF,0xF2,0xB0,0x59,0x8F,0xD2, | ||
| 81 | 0xCB,0x87,0x65,0x15,0xF1,0x1A,0xB2,0x30,0xAD,0xEE,0x58,0xA3,0x8B,0x66,0x1F,0x2C, | ||
| 82 | 0xD7,0x5D,0x19,0x85,0xA8,0xE6,0xD3,0x6B,0xA1, 0xC,0x91,0x93,0x6A,0x5E, 0xB,0x79, | ||
| 83 | 0xE3,0xDD, 0,0x4F,0x3C,0x89,0x6E,0x71,0x69,0xA9,0xAC,0x40,0xE5,0x99,0x28,0xC6, | ||
| 84 | 0x31,0x4E,0x7A,0xCD, 8,0x9E,0x7D,0xEF,0x17,0xFC,0x88,0xD8,0xA4,0x6D,0x44,0x95, | ||
| 85 | 0xD1,0xB7,0xD4,0x9B,0xBE,0x2A,0x34,0x64,0x2B,0xCF,0x2E,0xEB,0x38,0xCE,0x23,0xE0, | ||
| 86 | 0x3A,0x3F,0xF7,0x7B,0x9F,0x10,0x53,0xBC,0x52,0x67,0x16,0xE7,0x80,0x76, 4,0xC4, | ||
| 87 | 0xB6,0xC1,0xC2,0x7F,0x9A,0xDA,0xD5,0x39,0x42,0x14,0x9D,0xB1, 0xF,0x35,0xD6,0xCC, | ||
| 88 | }, | ||
| 89 | { | ||
| 90 | 0xB9,0xDA,0x38, 0xC,0xA2,0x9C, 9,0x1F, 6,0xB1,0xB6,0xFD,0x1A,0x69,0x23,0x30, | ||
| 91 | 0xC4,0xDE, 1,0xD1,0xF4,0x58,0x29,0x37,0x1C,0x7D,0xD5,0xBF,0xFF,0xBD,0xC8,0xC9, | ||
| 92 | 0xCF,0x65,0xBE,0x7B,0x78,0x97,0x98,0x67, 8,0xB3,0x26,0x57,0xF7,0xFA,0x40,0xAD, | ||
| 93 | 0x8E,0x75,0xA6,0x7C,0xDB,0x91,0x8B,0x51,0x99,0xD4,0x17,0x7A,0x90,0x8D,0xCE,0x63, | ||
| 94 | 0xCB,0x4E,0xA0,0xAB,0x18,0x3A,0x5B,0x50,0x7F,0x21,0x74,0xC1,0xBB,0xB8,0xB7,0xBA, | ||
| 95 | 0xB,0x35,0x95,0x31,0x59,0x9A,0x4D, 4, 7,0x1E,0x5A,0x76,0x13,0xF3,0x71,0x83, | ||
| 96 | 0xD0,0x86, 3,0xA8,0x39,0x42,0xAA,0x28,0xE6,0xE4,0xD8,0x5D,0xD3,0xD0,0x6E,0x6F, | ||
| 97 | 0x96,0xFB,0x5E,0xBC,0x56,0xC2,0x5F,0x85,0x9B,0xE7,0xAF,0xD2,0x3B,0x84,0x6A,0xA7, | ||
| 98 | 0x53,0xC5,0x44,0x49,0xA5,0xF9,0x36,0x72,0x3D,0x2C,0xD9,0x1B,0xA1,0xF5,0x4F,0x93, | ||
| 99 | 0x9D,0x68,0x47,0x41,0x16,0xCA,0x2A,0x4C,0xA3,0x87,0xD6,0xE5,0x19,0x2E,0x77,0x15, | ||
| 100 | 0x6D,0x70,0xC0,0xDF,0xB2, 0,0x46,0xED,0xC6,0x6C,0x43,0x60,0x92,0x2D,0xA9,0x22, | ||
| 101 | 0x45,0x8F,0x34,0x55,0xAE,0xA4, 0xA,0x66,0x32,0xE0,0xDC, 2,0xAC,0xE8,0x20,0x8C, | ||
| 102 | 0x89,0x62,0x4A,0xFE,0xEE,0xC3,0xE3,0x3C,0xF1,0x79, 5,0xE9,0xF6,0x27,0x33,0xCC, | ||
| 103 | 0xF2,0x9E,0x11,0x81,0x7E,0x80,0x10,0x8A,0x82,0x9F,0x48, 0xD,0xD7,0xB4,0xFC,0x2F, | ||
| 104 | 0xB5,0xC7,0xDD,0x88,0x14,0x6B,0x2B,0x54,0xEA,0x1D,0x94,0x5C,0xB0,0xEF,0x12,0x24, | ||
| 105 | 0xCD,0xEB,0xE1,0xE2,0x64,0x73,0x3F, 0xE,0x52,0x61,0x25,0x3E,0xF8, 0xF,0x4B,0xEC, | ||
| 106 | }, | ||
| 107 | { | ||
| 108 | 0xC0, 0,0x30,0xF6, 2,0x49,0x3D,0x10,0x6E,0x20,0xC9,0xA6,0x2F,0xFE,0x2C,0x2B, | ||
| 109 | 0x75,0x2E,0x45,0x26,0xAB,0x48,0xA9,0x80,0xFC, 4,0xCC,0xD3,0xB5,0xBA,0xA3,0x38, | ||
| 110 | 0x31,0x7D, 1,0xD9,0xA7,0x7B,0x96,0xB6,0x63,0x69,0x4E,0xF7,0xDE,0xE0,0x78,0xCA, | ||
| 111 | 0x50,0xAA,0x41,0x91,0x65,0x88,0xE4,0x21,0x85,0xDA,0x3A,0x27,0xBE,0x1C,0x3E,0x42, | ||
| 112 | 0x5E,0x17,0x52,0x7F,0x1F,0x89,0x24,0x6F,0x8F,0x5C,0x67,0x74, 0xE,0x12,0x87,0x8D, | ||
| 113 | 0xE9,0x34,0xED,0x73,0xC4,0xF8,0x61,0x5B, 5,0xDF,0x59,0x4C,0x97,0x79,0x83,0x18, | ||
| 114 | 0xA4,0x55,0x95,0xEB,0xBD,0x53,0xF5,0xF1,0x57,0x66,0x46,0x9F,0xB2,0x81, 9,0x51, | ||
| 115 | 0x86,0x22,0x16,0xDD,0x23,0x93,0x76,0x29,0xC2,0xD7,0x1D,0xD4,0xBF,0x36,0x3F,0xEA, | ||
| 116 | 0x4B,0x11,0x32,0xB9,0x62,0x54,0x60,0xD6,0x6D,0x43,0x9A, 0xD,0x92,0x9C,0xB0,0xEF, | ||
| 117 | 0x58,0x6C,0x9D,0x77,0x2D,0x70,0xFA,0xF3,0xB3, 0xB,0xE2,0x40,0x7E,0xF4,0x8A,0xE5, | ||
| 118 | 0x8C,0x3C,0x56,0x71,0xD1,0x64,0xE1,0x82, 0xA,0xCB,0x13,0x15,0x90,0xEC, 3,0x99, | ||
| 119 | 0xAF,0x14,0x5D, 0xF,0x33,0x4A,0x94,0xA5,0xA8,0x35,0x1B,0xE3,0x6A,0xC6,0x28,0xFF, | ||
| 120 | 0x4D,0xE7,0x25,0x84,0xAC, 8,0xAE,0xC5,0xA2,0x2A,0xB8,0x37, 0xC,0x7A,0xA0,0xC3, | ||
| 121 | 0xCE,0xAD, 6,0x1A,0x9E,0x8B,0xFB,0xD5,0xD0,0xC1,0x1E,0xD0,0xB4,0x9B,0xB1,0x44, | ||
| 122 | 0xF2,0x47,0xC7,0x68,0xCF,0x72,0xBB,0x4F,0x5A,0xF9,0xDC,0x6B,0xDB,0xD2,0xE8,0x7C, | ||
| 123 | 0xC8,0xEE,0x98,0xA1,0xE6,0xD8,0x39, 7,0x5F,0xFD,0x8E,0x19,0xB7,0x3B,0xBC,0xCD, | ||
| 124 | }, | ||
| 125 | { | ||
| 126 | 0x7C,0xE3,0x81,0x73,0xB2,0x11,0xBF,0x6F,0x20,0x98,0xFE,0x75,0x96,0xEF,0x6C,0xDA, | ||
| 127 | 0x50,0xE1, 9,0x72,0x54,0x45,0xBA,0x34,0x80,0x5B,0xED,0x3E,0x53,0x2C,0x87,0xA4, | ||
| 128 | 0x57,0xF3,0x33,0x3F,0x3C,0xB7,0x67,0xB4,0xA3,0x25,0x60,0x4F, 7,0x6B,0x1B,0x47, | ||
| 129 | 0x15, 0xF,0xE4, 0xA,0xEA,0xD1,0x32,0x78,0x36,0x49,0x8D,0x4B,0xD2,0xBC,0xA5,0xDC, | ||
| 130 | 0x1D, 0xD,0x4D,0xCD,0x9A,0x82,0x5F,0xFC,0x94,0x65,0xBE,0xE2,0xF4,0xC9,0x1E,0x44, | ||
| 131 | 0xCB,0x9E, 0xC,0x64,0x71,0x26,0x63,0xB3,0x14,0xE8,0x40,0x70,0x8A, 0xE,0x19,0x42, | ||
| 132 | 0x6D,0xAC,0x88,0x10,0x5C,0xDF,0x41,0xA9,0xAD,0xE5,0xFB,0x74,0xCC,0xD5, 6,0x8E, | ||
| 133 | 0x59,0x86,0xCE,0x1F,0x3D,0x76,0xE0,0x8F,0xB9,0x77,0x27,0x7B,0xA6,0xD8,0x29,0xD3, | ||
| 134 | 0xEC,0xB8,0x13,0xF7,0xFA,0xC3,0x51,0x6A,0xDE,0x4A,0x5A,0xEB,0xC2,0x8B,0x23,0x48, | ||
| 135 | 0x92,0xCF,0x62,0xA8,0x99,0xF8,0xD0,0x2E,0x85,0x61,0x43,0xC8,0xBD,0xF0, 5,0x93, | ||
| 136 | 0xCA,0x4E,0xF1,0x7D,0x30,0xFD,0xC4,0x69,0x66,0x2F, 8,0xB1,0x52,0xF9,0x21,0xE6, | ||
| 137 | 0x7A,0x2B,0xDD,0x39,0x84,0xFF,0xC0,0x91,0xD6,0x37,0xD4,0x7F,0x2D,0x9B,0x5D,0xA1, | ||
| 138 | 0x3B,0x6E,0xB5,0xC5,0x46, 4,0xF5,0x90,0xEE,0x7E,0x83,0x1C, 3,0x56,0xB6,0xAA, | ||
| 139 | 0,0x17, 1,0x35,0x55,0x79, 0xB,0x12,0xBB,0x1A,0x31,0xE7, 2,0x28,0x16,0xC1, | ||
| 140 | 0xF6,0xA2,0xDB,0x18,0x9C,0x89,0x68,0x38,0x97,0xAB,0xC7,0x2A,0xD7,0x3A,0xF2,0xC6, | ||
| 141 | 0x24,0x4C,0xB0,0x58,0xA0,0x22,0x5E,0x9D,0xD9,0xA7,0xE9,0xAE,0xAF,0x8C,0x95,0x9F, | ||
| 142 | }, | ||
| 143 | { | ||
| 144 | 0x28,0xB7,0x20,0xD7,0xB0,0x30,0xC3, 9,0x19,0xC0,0x67,0xD6, 0,0x3C,0x7E,0xE7, | ||
| 145 | 0xE9,0xF4, 8,0x5A,0xF8,0xB8,0x2E, 5,0xA6,0x25,0x9E,0x5C,0xD8,0x15, 0xD,0xE1, | ||
| 146 | 0xF6,0x11,0x54,0x6B,0xCD,0x21,0x46,0x66,0x5E,0x84,0xAD, 6,0x38,0x29,0x44,0xC5, | ||
| 147 | 0xA2,0xCE,0xF1,0xAA,0xC1,0x40,0x71,0x86,0xB5,0xEF,0xFC,0x36,0xA8,0xCB, 0xA,0x48, | ||
| 148 | 0x27,0x45,0x64,0xA3,0xAF,0x8C,0xB2,0xC6,0x9F, 7,0x89,0xDC,0x17,0xD3,0x49,0x79, | ||
| 149 | 0xFB,0xFE,0x1D,0xD0,0xB9,0x88,0x43,0x52,0xBC, 1,0x78,0x2B,0x7D,0x94,0xC7, 0xE, | ||
| 150 | 0xDE,0xA5,0xD5,0x9B,0xCC,0xF7,0x61,0x7A,0xC2,0x74,0x81,0x39, 3,0xAB,0x96,0xA0, | ||
| 151 | 0x37,0xBD,0x2D,0x72,0x75,0x3F,0xC9,0xD4,0x8E,0x6F,0xF9,0x8D,0xED,0x62,0xDB,0x1C, | ||
| 152 | 0xDF, 4,0xAC,0x1B,0x6C,0x14,0x4B,0x63,0xD0,0xBF,0xB4,0x82,0xEC,0x7B,0x1A,0x59, | ||
| 153 | 0x92,0xD2,0x10,0x60,0xB6,0x3D,0x5F,0xE6,0x80,0x6E,0x70,0xC4,0xF2,0x35,0xD9,0x7C, | ||
| 154 | 0xEE,0xE5,0x41,0xA4,0x5B,0x50,0xDD,0xBB,0x4C,0xF3,0x1F,0x9D,0x5D,0x57,0x55,0x51, | ||
| 155 | 0x97,0xE3,0x58,0x42,0x4D,0x9C,0x73,0xBA,0xC8,0x77,0x31,0x69,0x26,0xAE,0xEA,0x8A, | ||
| 156 | 0xDA,0x22,0xB3,0x87,0x56,0xFA,0x93, 0xB,0x34,0x16,0x33,0xE8,0xE4,0x53,0xBE,0xA9, | ||
| 157 | 0xB1,0x3A,0x3E,0xF5,0x90,0x6A,0xCF,0x3B,0x12,0xFD,0x8F,0x9A,0xA7,0x47,0x91,0x99, | ||
| 158 | 0xEB, 0xF,0x24,0xFF,0x23,0x18,0x85,0x4E,0x7F, 0xC,0xE0,0xA1,0xD2,0xD1,0x2C,0x2A, | ||
| 159 | 0x4A, 2,0x4F,0x1E,0x95,0x68,0x8B,0x98,0x83,0x6D,0x76,0xCA,0x65,0x32,0x13,0x2F, | ||
| 160 | }, | ||
| 161 | { | ||
| 162 | 0xC3,0x82,0x9A,0xA4,0xBA,0x81,0x60,0x37,0x34,0x35,0xFC,0x80,0xA8,0x51,0x65,0x67, | ||
| 163 | 0xED,0x30,0x5F,0x10,0xD3,0x4A,0x27,0x2F,0x13,0xB9,0x2A,0xD2,0xCC,0xE1,0xEF,0xAE, | ||
| 164 | 0xEB,0xBE,0xF4,0xBD,0xCF,0x43,0xB3,0xC5,0x88,0x84,0xB7,0xDD,0x39,0x40,0xCE,0x48, | ||
| 165 | 0x6D,0x9B,0x72,0x61,0x7E,0xE7,0xA1,0x4E,0x53,0x2E,0x77,0x3B,0xE2,0xC9,0x36,0x22, | ||
| 166 | 0x1B,0x6E,0x73,0xB1, 3,0xB2,0x4C,0x87,0xA9,0xD4,0x4D, 0xF,0xD8,0x15,0x6C,0xAA, | ||
| 167 | 0x18,0xF6,0x49,0x57,0x5D,0xFB,0x7A,0x14,0x94,0x63,0xA0,0x11,0xB0,0x9E,0xDE, 5, | ||
| 168 | 0x46,0xC8,0xEE,0x47,0xDB,0xDC,0x24,0x89,0x9C,0x91,0x97,0x29,0xE9,0x7B,0xC1, 7, | ||
| 169 | 0x1E,0xB8,0xFD,0xFE,0xAC,0xC6,0x62,0x98,0x4F,0xF1,0x79,0xE0,0xE8,0x6B,0x78,0x56, | ||
| 170 | 0xB6,0x8D, 4,0x50,0x86,0xCA,0x6F,0x20,0xE6,0xEA,0xE5,0x76,0x17,0x1C,0x74,0x7F, | ||
| 171 | 0xBC, 0xD,0x2C,0x85,0xF7,0x66,0x96,0xE4,0x8B,0x75,0x3F,0x4B,0xD9,0x38,0xAF,0x7C, | ||
| 172 | 0xDA, 0xB,0x83,0x2D,0x31,0x32,0xA2,0xF5,0x1D,0x59,0x41,0x45,0xBF,0x3C,0x1F,0xF8, | ||
| 173 | 0xF9,0x8A,0xD0,0x16,0x25,0x69,0x12,0x99,0x9D,0x21,0x95,0xAB, 1,0xA6,0xD7,0xB5, | ||
| 174 | 0xC0,0x7D,0xFF,0x58, 0xE,0x3A,0x92,0xD1,0x55,0xE3, 8,0x9F,0xD6,0x3E,0x52,0x8E, | ||
| 175 | 0xFA,0xA3,0xC7, 2,0xCD,0xDF,0x8F,0x64,0x19,0x8C,0xF3,0xA7, 0xC,0x5E, 0xA,0x6A, | ||
| 176 | 9,0xF0,0x93,0x5B,0x42,0xC2, 6,0x23,0xEC,0x71,0xAD,0xB4,0xCB,0xBB,0x70,0x28, | ||
| 177 | 0xD5,0x1A,0x5C,0x33,0x68,0x5A, 0,0x44,0x90,0xA5,0xC4,0x26,0x3D,0x2B,0xF2,0x54, | ||
| 178 | }, | ||
| 179 | { | ||
| 180 | 0x96,0xAD,0xDA,0x1F,0xED,0x33,0xE1,0x81,0x69, 8, 0xD, 0xA,0xDB,0x35,0x77,0x9A, | ||
| 181 | 0x64,0xD1,0xFC,0x78,0xAA,0x1B,0xD0,0x67,0xA0,0xDD,0xFA,0x6C,0x63,0x71, 5,0x84, | ||
| 182 | 0x17,0x6A,0x89,0x4F,0x66,0x7F,0xC6,0x50,0x55,0x92,0x6F,0xBD,0xE7,0xD2,0x40,0x72, | ||
| 183 | 0x8D,0xBB,0xEC, 6,0x42,0x8A,0xE4,0x88,0x9D,0x7E,0x7A,0x82,0x27,0x13,0x41,0x1A, | ||
| 184 | 0xAF,0xC8,0xA4,0x76,0xB4,0xC2,0xFE,0x6D,0x1C,0xD9,0x61,0x30,0xB3,0x7C,0xEA,0xF7, | ||
| 185 | 0x29, 0xF,0xF2,0x3B,0x51,0xC1,0xDE,0x5F,0xE5,0x2A,0x2F,0x99, 0xB,0x5D,0xA3,0x2B, | ||
| 186 | 0x4A,0xAB,0x95,0xA5,0xD3,0x58,0x56,0xEE,0x28,0x31, 0,0xCC,0x15,0x46,0xCA,0xE6, | ||
| 187 | 0x86,0x38,0x3C,0x65,0xF5,0xE3,0x9F,0xD6,0x5B, 9,0x49,0x83,0x70,0x2D,0x53,0xA9, | ||
| 188 | 0x7D,0xE2,0xC4,0xAC,0x8E,0x5E,0xB8,0x25,0xF4,0xB9,0x57,0xF3,0xF1,0x68,0x47,0xB2, | ||
| 189 | 0xA2,0x59,0x20,0xCE,0x34,0x79,0x5C,0x90, 0xE,0x1E,0xBE,0xD5,0x22,0x23,0xB1,0xC9, | ||
| 190 | 0x18,0x62,0x16,0x2E,0x91,0x3E, 7,0x8F,0xD8,0x3F,0x93,0x3D,0xD4,0x9B,0xDF,0x85, | ||
| 191 | 0x21,0xFB,0x11,0x74,0x97,0xC7,0xD7,0xDC,0x4C,0x19,0x45,0x98,0xE9,0x43, 2,0x4B, | ||
| 192 | 0xBC,0xC3, 4,0x9C,0x6B,0xF0,0x75,0x52,0xA7,0x26,0xF6,0xC5,0xBA,0xCF,0xB0,0xB7, | ||
| 193 | 0xAE,0x5A,0xA1,0xBF, 3,0x8B,0x80,0x12,0x6E, 0xC,0xEB,0xF9,0xC0,0x44,0x24,0xEF, | ||
| 194 | 0x10,0xF8,0xA8,0x8C,0xE8,0x7B,0xFF,0x9E,0x2C,0xCD,0x60,0x36,0x87,0xB5,0x94,0xA6, | ||
| 195 | 0x54,0x73,0x3A,0x14,0x4E, 1,0x1D,0xB6,0xFD,0x37,0x48,0x4D,0x39,0xCB,0xE0,0x32, | ||
| 196 | } | ||
| 197 | }; | ||
| 198 | |||
| 199 | static inline u8 ror8(u8 a, u8 b) { | ||
| 200 | return (a>>b) | ((a<<(8-b))&0xff); | ||
| 201 | } | ||
| 202 | |||
| 203 | ✗ | static void genkey(u8 *rand, u8 idx, u8 *key) | |
| 204 | { | ||
| 205 | ✗ | u8 *ans = ans_tbl[idx]; | |
| 206 | ✗ | u8 t0[10]; | |
| 207 | ✗ | int i; | |
| 208 | |||
| 209 | ✗ | for(i=0;i<10;i++) | |
| 210 | ✗ | t0[i] = tsbox[rand[i]]; | |
| 211 | |||
| 212 | ✗ | key[5] = ((ror8((ans[5]^t0[4]),(t0[7]%8)) - t0[0]) ^ t0[5]); | |
| 213 | ✗ | key[4] = ((ror8((ans[4]^t0[8]),(t0[9]%8)) - t0[4]) ^ t0[2]); | |
| 214 | ✗ | key[3] = ((ror8((ans[3]^t0[3]),(t0[1]%8)) - t0[7]) ^ t0[9]); | |
| 215 | ✗ | key[2] = ((ror8((ans[2]^t0[5]),(t0[2]%8)) - t0[6]) ^ t0[7]); | |
| 216 | ✗ | key[1] = ((ror8((ans[1]^t0[8]),(t0[3]%8)) - t0[6]) ^ t0[5]); | |
| 217 | ✗ | key[0] = ((ror8((ans[0]^t0[2]),(t0[1]%8)) - t0[4]) ^ t0[0]); | |
| 218 | ✗ | } | |
| 219 | |||
| 220 | ✗ | static void gentabs(u8 *rand, u8 *key, u8 idx, u8 *ft, u8 *sb) | |
| 221 | { | ||
| 222 | ✗ | ft[0] = sboxes[idx][key[1]] ^ sboxes[(idx+1)%8][rand[6]]; | |
| 223 | ✗ | ft[1] = sboxes[idx][key[3]] ^ sboxes[(idx+1)%8][rand[4]]; | |
| 224 | ✗ | ft[2] = sboxes[idx][key[0]] ^ sboxes[(idx+1)%8][rand[2]]; | |
| 225 | ✗ | ft[3] = sboxes[idx][key[5]] ^ sboxes[(idx+1)%8][rand[7]]; | |
| 226 | ✗ | ft[4] = sboxes[idx][key[4]] ^ sboxes[(idx+1)%8][rand[5]]; | |
| 227 | ✗ | ft[5] = sboxes[idx][key[2]] ^ sboxes[(idx+1)%8][rand[0]]; | |
| 228 | ✗ | ft[6] = sboxes[idx][rand[9]] ^ sboxes[(idx+1)%8][rand[3]]; | |
| 229 | ✗ | ft[7] = sboxes[idx][rand[8]] ^ sboxes[(idx+1)%8][rand[1]]; | |
| 230 | |||
| 231 | ✗ | sb[0] = sboxes[idx][key[5]] ^ sboxes[(idx+1)%8][rand[8]]; | |
| 232 | ✗ | sb[1] = sboxes[idx][key[0]] ^ sboxes[(idx+1)%8][rand[5]]; | |
| 233 | ✗ | sb[2] = sboxes[idx][key[2]] ^ sboxes[(idx+1)%8][rand[9]]; | |
| 234 | ✗ | sb[3] = sboxes[idx][key[3]] ^ sboxes[(idx+1)%8][rand[0]]; | |
| 235 | ✗ | sb[4] = sboxes[idx][key[1]] ^ sboxes[(idx+1)%8][rand[2]]; | |
| 236 | ✗ | sb[5] = sboxes[idx][key[4]] ^ sboxes[(idx+1)%8][rand[1]]; | |
| 237 | ✗ | sb[6] = sboxes[idx][rand[6]] ^ sboxes[(idx+1)%8][rand[4]]; | |
| 238 | ✗ | sb[7] = sboxes[idx][rand[7]] ^ sboxes[(idx+1)%8][rand[3]]; | |
| 239 | ✗ | } | |
| 240 | |||
| 241 | /* generate a ft and sb, given the deviceside keybuffer (rand+key) */ | ||
| 242 | ✗ | void wiimote_gen_key(wiimote_key *key, u8 *keydata) | |
| 243 | { | ||
| 244 | ✗ | u8 rand[10]; | |
| 245 | ✗ | u8 skey[6]; | |
| 246 | ✗ | u8 testkey[6]; | |
| 247 | ✗ | int idx; | |
| 248 | ✗ | int i; | |
| 249 | |||
| 250 | ✗ | for(i=0;i<10;i++) | |
| 251 | ✗ | rand[i] = keydata[i]; | |
| 252 | ✗ | for(i=0;i<6;i++) | |
| 253 | ✗ | skey[i] = keydata[i+10]; | |
| 254 | |||
| 255 | ✗ | ets_printf("# rand: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", rand[0], rand[1], rand[2], rand[3], rand[4], rand[5], rand[6], rand[7], rand[8], rand[9]); | |
| 256 | ✗ | ets_printf("# key: %02x %02x %02x %02x %02x %02x\n", skey[0], skey[1], skey[2], skey[3], skey[4], skey[5]); | |
| 257 | |||
| 258 | ✗ | for(idx=0;idx<7;idx++) { | |
| 259 | ✗ | genkey(rand, idx, testkey); | |
| 260 | ✗ | if(!memcmp(testkey,skey,6)) | |
| 261 | break; | ||
| 262 | } | ||
| 263 | // default case is idx = 7 which is valid (homebrew uses it for the 0x17 case) | ||
| 264 | ✗ | ets_printf("# idx: %d\n", idx); | |
| 265 | |||
| 266 | ✗ | gentabs(rand, skey, idx, key->ft, key->sb); | |
| 267 | |||
| 268 | ✗ | ets_printf("# ft: %02x %02x %02x %02x %02x %02x %02x %02x\n", key->ft[0], key->ft[1], key->ft[2], key->ft[3], key->ft[4], key->ft[5], key->ft[6], key->ft[7]); | |
| 269 | ✗ | ets_printf("# sb: %02x %02x %02x %02x %02x %02x %02x %02x\n", key->sb[0], key->sb[1], key->sb[2], key->sb[3], key->sb[4], key->sb[5], key->sb[6], key->sb[7]); | |
| 270 | |||
| 271 | // for homebrew, ft and sb are all 0x97 which is equivalent to 0x17 | ||
| 272 | ✗ | } | |
| 273 | |||
| 274 | ✗ | void wiimote_encrypt(wiimote_key *key, int len, u8 *data, int addr) | |
| 275 | { | ||
| 276 | ✗ | int i; | |
| 277 | ✗ | for(i=0; i<len; i++, addr++) { | |
| 278 | ✗ | data[i] = (data[i] - key->ft[addr%8]) ^ key->sb[addr%8]; | |
| 279 | } | ||
| 280 | ✗ | } | |
| 281 | |||
| 282 | ✗ | void wiimote_decrypt(wiimote_key *key, int len, u8 *data, int addr) | |
| 283 | { | ||
| 284 | ✗ | int i; | |
| 285 | ✗ | for(i=0; i<len; i++, addr++) { | |
| 286 | ✗ | data[i] = (data[i] ^ key->sb[addr%8]) + key->ft[addr%8]; | |
| 287 | } | ||
| 288 | ✗ | } | |
| 289 | |||
| 290 | #if 0 | ||
| 291 | int main(int argc, char **argv) | ||
| 292 | { | ||
| 293 | |||
| 294 | wiimote_key k; | ||
| 295 | u8 d[] = {0x98, 0xe2, 0x67, 0xe9, 0x8b, 0x97, 0x12, 0x77, 0x28, 0xa9, 0x11, 0x93, 0x9b, 0x7b, 0xbf, 0xae}; | ||
| 296 | |||
| 297 | wiimote_gen_key(&k, d); | ||
| 298 | |||
| 299 | u8 ed[] = {0x5d, 0x7b, 0x81, 0x47, 0xf5, 0x30, 0xc8, 0x9a}; | ||
| 300 | |||
| 301 | wiimote_decrypt(&k, 8, ed, 0 ); | ||
| 302 | printf("data: %02x %02x %02x %02x %02x %02x %02x %02x\n", ed[0], ed[1], ed[2], ed[3], ed[4], ed[5], ed[6], ed[7]); | ||
| 303 | } | ||
| 304 | #endif | ||
| 305 | |||
| 306 |