From f987173425e87aea0f40ee708dad00f599a4fda8 Mon Sep 17 00:00:00 2001 From: bzt Date: Fri, 9 Nov 2018 12:43:03 +0100 Subject: [PATCH] Booting from encrypted initrd --- README.md | 7 +- aarch64-rpi/README.md | 2 +- bootboot.efi | Bin 81158 -> 93186 bytes bootboot.rom | Bin 81408 -> 93696 bytes x86_64-bios/README.md | 1 + x86_64-efi/README.md | 1 + x86_64-efi/bootboot.c | 374 ++++++++++++++++++++++++++++++++++++++++++ x86_64-efi/fs.h | 29 ++-- 8 files changed, 397 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index e9f9d11..b1f8ca9 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ I provide pre-compiled images ready for use. 1. *x86_64-efi* the preferred way of booting on x86_64 architecture. Standard GNU toolchain and a few files from gnuefi (included). - [bootboot.efi](https://gitlab.com/bztsrc/bootboot/raw/master/bootboot.efi) (81k), [bootboot.rom](https://gitlab.com/bztsrc/bootboot/raw/master/bootboot.rom) (81k) + [bootboot.efi](https://gitlab.com/bztsrc/bootboot/raw/master/bootboot.efi) (93k), [bootboot.rom](https://gitlab.com/bztsrc/bootboot/raw/master/bootboot.rom) (93k) 2. *x86_64-bios* BIOS, Multiboot (GRUB) and El Torito (CDROM) compatible, OBSOLETE loader. If you want to recompile this, you'll need fasm (not included). @@ -237,7 +237,7 @@ OS developers, specially for those who want to write their own file systems. The reference implementations support [cpio](https://en.wikipedia.org/wiki/Cpio) (all hpodc, newc and crc variants), [ustar](https://en.wikipedia.org/wiki/Tar_(computing)), osdev.org's [SFS](http://wiki.osdev.org/SFS), [James Molloy's initrd](http://www.jamesmolloy.co.uk/tutorial_html/8.-The%20VFS%20and%20the%20initrd.html) -format and OS/Z's native [FS/Z](https://gitlab.com/bztsrc/osz/blob/master/etc/include/sys/fsZ.h). +format and OS/Z's native [FS/Z](https://gitlab.com/bztsrc/osz/blob/master/etc/include/sys/fsZ.h) (with encryption support too). Gzip compressed initrds also supported to save disk space and fasten up load time (not recommended on RPi3). Example kernel @@ -401,6 +401,7 @@ BOOTBOOT-PANIC: Unsupported cipher ``` This message is shown if the initrd is encrypted with a cipher that the loader does not support. Solution: -regenerate and encrypt the initrd image with SHA-XOR-CBC cipher, supported by all three implementations. +regenerate and encrypt the initrd image with SHA-XOR-CBC cipher, known to all the three implementations. +(Note: encryption is only supported for FS/Z initrd images.) That's all, hope it will be useful! diff --git a/aarch64-rpi/README.md b/aarch64-rpi/README.md index d61c920..9df4aaf 100644 --- a/aarch64-rpi/README.md +++ b/aarch64-rpi/README.md @@ -46,4 +46,4 @@ Limitations - Maps only the first 1G of RAM. - Cards other than SDHC Class 10 not supported. - Raspberry Pi does not have an on-board RTC, so always 0000-00-00 00:00:00 returned as bootboot.datetime. - + - Only supports SHA-XOR-CBC cipher, no AES diff --git a/bootboot.efi b/bootboot.efi index 242665bb04868e914ddeb15125b4cb711f59c35d..771800d223bd56ef7590db03325d5ed98085f83a 100755 GIT binary patch delta 33882 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 delta 22487 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 Z!J&_;4*+5bL0$pGIP{qDe%*zr{{!6JX`uiB diff --git a/bootboot.rom b/bootboot.rom index 04382c315fbe80bcfb24e818280f2eeb21a3bd7c..cb0683ebf0653a7070a0f57a54335e7f4e11ad67 100644 GIT binary patch delta 33532 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 D_@R|c delta 22158 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 n!IqxWu4pS$q!RlZAns7>24);(ct)[1]=(UINT8)((st)>>16);(ct)[2]=(UINT8)((st)>>8);(ct)[3]=(UINT8)(st);} +static const UINT32 Te0[256]={ + 0xc66363a5U,0xf87c7c84U,0xee777799U,0xf67b7b8dU,0xfff2f20dU,0xd66b6bbdU,0xde6f6fb1U,0x91c5c554U, + 0x60303050U,0x02010103U,0xce6767a9U,0x562b2b7dU,0xe7fefe19U,0xb5d7d762U,0x4dababe6U,0xec76769aU, + 0x8fcaca45U,0x1f82829dU,0x89c9c940U,0xfa7d7d87U,0xeffafa15U,0xb25959ebU,0x8e4747c9U,0xfbf0f00bU, + 0x41adadecU,0xb3d4d467U,0x5fa2a2fdU,0x45afafeaU,0x239c9cbfU,0x53a4a4f7U,0xe4727296U,0x9bc0c05bU, + 0x75b7b7c2U,0xe1fdfd1cU,0x3d9393aeU,0x4c26266aU,0x6c36365aU,0x7e3f3f41U,0xf5f7f702U,0x83cccc4fU, + 0x6834345cU,0x51a5a5f4U,0xd1e5e534U,0xf9f1f108U,0xe2717193U,0xabd8d873U,0x62313153U,0x2a15153fU, + 0x0804040cU,0x95c7c752U,0x46232365U,0x9dc3c35eU,0x30181828U,0x379696a1U,0x0a05050fU,0x2f9a9ab5U, + 0x0e070709U,0x24121236U,0x1b80809bU,0xdfe2e23dU,0xcdebeb26U,0x4e272769U,0x7fb2b2cdU,0xea75759fU, + 0x1209091bU,0x1d83839eU,0x582c2c74U,0x341a1a2eU,0x361b1b2dU,0xdc6e6eb2U,0xb45a5aeeU,0x5ba0a0fbU, + 0xa45252f6U,0x763b3b4dU,0xb7d6d661U,0x7db3b3ceU,0x5229297bU,0xdde3e33eU,0x5e2f2f71U,0x13848497U, + 0xa65353f5U,0xb9d1d168U,0x00000000U,0xc1eded2cU,0x40202060U,0xe3fcfc1fU,0x79b1b1c8U,0xb65b5bedU, + 0xd46a6abeU,0x8dcbcb46U,0x67bebed9U,0x7239394bU,0x944a4adeU,0x984c4cd4U,0xb05858e8U,0x85cfcf4aU, + 0xbbd0d06bU,0xc5efef2aU,0x4faaaae5U,0xedfbfb16U,0x864343c5U,0x9a4d4dd7U,0x66333355U,0x11858594U, + 0x8a4545cfU,0xe9f9f910U,0x04020206U,0xfe7f7f81U,0xa05050f0U,0x783c3c44U,0x259f9fbaU,0x4ba8a8e3U, + 0xa25151f3U,0x5da3a3feU,0x804040c0U,0x058f8f8aU,0x3f9292adU,0x219d9dbcU,0x70383848U,0xf1f5f504U, + 0x63bcbcdfU,0x77b6b6c1U,0xafdada75U,0x42212163U,0x20101030U,0xe5ffff1aU,0xfdf3f30eU,0xbfd2d26dU, + 0x81cdcd4cU,0x180c0c14U,0x26131335U,0xc3ecec2fU,0xbe5f5fe1U,0x359797a2U,0x884444ccU,0x2e171739U, + 0x93c4c457U,0x55a7a7f2U,0xfc7e7e82U,0x7a3d3d47U,0xc86464acU,0xba5d5de7U,0x3219192bU,0xe6737395U, + 0xc06060a0U,0x19818198U,0x9e4f4fd1U,0xa3dcdc7fU,0x44222266U,0x542a2a7eU,0x3b9090abU,0x0b888883U, + 0x8c4646caU,0xc7eeee29U,0x6bb8b8d3U,0x2814143cU,0xa7dede79U,0xbc5e5ee2U,0x160b0b1dU,0xaddbdb76U, + 0xdbe0e03bU,0x64323256U,0x743a3a4eU,0x140a0a1eU,0x924949dbU,0x0c06060aU,0x4824246cU,0xb85c5ce4U, + 0x9fc2c25dU,0xbdd3d36eU,0x43acacefU,0xc46262a6U,0x399191a8U,0x319595a4U,0xd3e4e437U,0xf279798bU, + 0xd5e7e732U,0x8bc8c843U,0x6e373759U,0xda6d6db7U,0x018d8d8cU,0xb1d5d564U,0x9c4e4ed2U,0x49a9a9e0U, + 0xd86c6cb4U,0xac5656faU,0xf3f4f407U,0xcfeaea25U,0xca6565afU,0xf47a7a8eU,0x47aeaee9U,0x10080818U, + 0x6fbabad5U,0xf0787888U,0x4a25256fU,0x5c2e2e72U,0x381c1c24U,0x57a6a6f1U,0x73b4b4c7U,0x97c6c651U, + 0xcbe8e823U,0xa1dddd7cU,0xe874749cU,0x3e1f1f21U,0x964b4bddU,0x61bdbddcU,0x0d8b8b86U,0x0f8a8a85U, + 0xe0707090U,0x7c3e3e42U,0x71b5b5c4U,0xcc6666aaU,0x904848d8U,0x06030305U,0xf7f6f601U,0x1c0e0e12U, + 0xc26161a3U,0x6a35355fU,0xae5757f9U,0x69b9b9d0U,0x17868691U,0x99c1c158U,0x3a1d1d27U,0x279e9eb9U, + 0xd9e1e138U,0xebf8f813U,0x2b9898b3U,0x22111133U,0xd26969bbU,0xa9d9d970U,0x078e8e89U,0x339494a7U, + 0x2d9b9bb6U,0x3c1e1e22U,0x15878792U,0xc9e9e920U,0x87cece49U,0xaa5555ffU,0x50282878U,0xa5dfdf7aU, + 0x038c8c8fU,0x59a1a1f8U,0x09898980U,0x1a0d0d17U,0x65bfbfdaU,0xd7e6e631U,0x844242c6U,0xd06868b8U, + 0x824141c3U,0x299999b0U,0x5a2d2d77U,0x1e0f0f11U,0x7bb0b0cbU,0xa85454fcU,0x6dbbbbd6U,0x2c16163aU, +}; +static const UINT32 Te1[256]={ + 0xa5c66363U,0x84f87c7cU,0x99ee7777U,0x8df67b7bU,0x0dfff2f2U,0xbdd66b6bU,0xb1de6f6fU,0x5491c5c5U, + 0x50603030U,0x03020101U,0xa9ce6767U,0x7d562b2bU,0x19e7fefeU,0x62b5d7d7U,0xe64dababU,0x9aec7676U, + 0x458fcacaU,0x9d1f8282U,0x4089c9c9U,0x87fa7d7dU,0x15effafaU,0xebb25959U,0xc98e4747U,0x0bfbf0f0U, + 0xec41adadU,0x67b3d4d4U,0xfd5fa2a2U,0xea45afafU,0xbf239c9cU,0xf753a4a4U,0x96e47272U,0x5b9bc0c0U, + 0xc275b7b7U,0x1ce1fdfdU,0xae3d9393U,0x6a4c2626U,0x5a6c3636U,0x417e3f3fU,0x02f5f7f7U,0x4f83ccccU, + 0x5c683434U,0xf451a5a5U,0x34d1e5e5U,0x08f9f1f1U,0x93e27171U,0x73abd8d8U,0x53623131U,0x3f2a1515U, + 0x0c080404U,0x5295c7c7U,0x65462323U,0x5e9dc3c3U,0x28301818U,0xa1379696U,0x0f0a0505U,0xb52f9a9aU, + 0x090e0707U,0x36241212U,0x9b1b8080U,0x3ddfe2e2U,0x26cdebebU,0x694e2727U,0xcd7fb2b2U,0x9fea7575U, + 0x1b120909U,0x9e1d8383U,0x74582c2cU,0x2e341a1aU,0x2d361b1bU,0xb2dc6e6eU,0xeeb45a5aU,0xfb5ba0a0U, + 0xf6a45252U,0x4d763b3bU,0x61b7d6d6U,0xce7db3b3U,0x7b522929U,0x3edde3e3U,0x715e2f2fU,0x97138484U, + 0xf5a65353U,0x68b9d1d1U,0x00000000U,0x2cc1ededU,0x60402020U,0x1fe3fcfcU,0xc879b1b1U,0xedb65b5bU, + 0xbed46a6aU,0x468dcbcbU,0xd967bebeU,0x4b723939U,0xde944a4aU,0xd4984c4cU,0xe8b05858U,0x4a85cfcfU, + 0x6bbbd0d0U,0x2ac5efefU,0xe54faaaaU,0x16edfbfbU,0xc5864343U,0xd79a4d4dU,0x55663333U,0x94118585U, + 0xcf8a4545U,0x10e9f9f9U,0x06040202U,0x81fe7f7fU,0xf0a05050U,0x44783c3cU,0xba259f9fU,0xe34ba8a8U, + 0xf3a25151U,0xfe5da3a3U,0xc0804040U,0x8a058f8fU,0xad3f9292U,0xbc219d9dU,0x48703838U,0x04f1f5f5U, + 0xdf63bcbcU,0xc177b6b6U,0x75afdadaU,0x63422121U,0x30201010U,0x1ae5ffffU,0x0efdf3f3U,0x6dbfd2d2U, + 0x4c81cdcdU,0x14180c0cU,0x35261313U,0x2fc3ececU,0xe1be5f5fU,0xa2359797U,0xcc884444U,0x392e1717U, + 0x5793c4c4U,0xf255a7a7U,0x82fc7e7eU,0x477a3d3dU,0xacc86464U,0xe7ba5d5dU,0x2b321919U,0x95e67373U, + 0xa0c06060U,0x98198181U,0xd19e4f4fU,0x7fa3dcdcU,0x66442222U,0x7e542a2aU,0xab3b9090U,0x830b8888U, + 0xca8c4646U,0x29c7eeeeU,0xd36bb8b8U,0x3c281414U,0x79a7dedeU,0xe2bc5e5eU,0x1d160b0bU,0x76addbdbU, + 0x3bdbe0e0U,0x56643232U,0x4e743a3aU,0x1e140a0aU,0xdb924949U,0x0a0c0606U,0x6c482424U,0xe4b85c5cU, + 0x5d9fc2c2U,0x6ebdd3d3U,0xef43acacU,0xa6c46262U,0xa8399191U,0xa4319595U,0x37d3e4e4U,0x8bf27979U, + 0x32d5e7e7U,0x438bc8c8U,0x596e3737U,0xb7da6d6dU,0x8c018d8dU,0x64b1d5d5U,0xd29c4e4eU,0xe049a9a9U, + 0xb4d86c6cU,0xfaac5656U,0x07f3f4f4U,0x25cfeaeaU,0xafca6565U,0x8ef47a7aU,0xe947aeaeU,0x18100808U, + 0xd56fbabaU,0x88f07878U,0x6f4a2525U,0x725c2e2eU,0x24381c1cU,0xf157a6a6U,0xc773b4b4U,0x5197c6c6U, + 0x23cbe8e8U,0x7ca1ddddU,0x9ce87474U,0x213e1f1fU,0xdd964b4bU,0xdc61bdbdU,0x860d8b8bU,0x850f8a8aU, + 0x90e07070U,0x427c3e3eU,0xc471b5b5U,0xaacc6666U,0xd8904848U,0x05060303U,0x01f7f6f6U,0x121c0e0eU, + 0xa3c26161U,0x5f6a3535U,0xf9ae5757U,0xd069b9b9U,0x91178686U,0x5899c1c1U,0x273a1d1dU,0xb9279e9eU, + 0x38d9e1e1U,0x13ebf8f8U,0xb32b9898U,0x33221111U,0xbbd26969U,0x70a9d9d9U,0x89078e8eU,0xa7339494U, + 0xb62d9b9bU,0x223c1e1eU,0x92158787U,0x20c9e9e9U,0x4987ceceU,0xffaa5555U,0x78502828U,0x7aa5dfdfU, + 0x8f038c8cU,0xf859a1a1U,0x80098989U,0x171a0d0dU,0xda65bfbfU,0x31d7e6e6U,0xc6844242U,0xb8d06868U, + 0xc3824141U,0xb0299999U,0x775a2d2dU,0x111e0f0fU,0xcb7bb0b0U,0xfca85454U,0xd66dbbbbU,0x3a2c1616U, +}; +static const UINT32 Te2[256]={ + 0x63a5c663U,0x7c84f87cU,0x7799ee77U,0x7b8df67bU,0xf20dfff2U,0x6bbdd66bU,0x6fb1de6fU,0xc55491c5U, + 0x30506030U,0x01030201U,0x67a9ce67U,0x2b7d562bU,0xfe19e7feU,0xd762b5d7U,0xabe64dabU,0x769aec76U, + 0xca458fcaU,0x829d1f82U,0xc94089c9U,0x7d87fa7dU,0xfa15effaU,0x59ebb259U,0x47c98e47U,0xf00bfbf0U, + 0xadec41adU,0xd467b3d4U,0xa2fd5fa2U,0xafea45afU,0x9cbf239cU,0xa4f753a4U,0x7296e472U,0xc05b9bc0U, + 0xb7c275b7U,0xfd1ce1fdU,0x93ae3d93U,0x266a4c26U,0x365a6c36U,0x3f417e3fU,0xf702f5f7U,0xcc4f83ccU, + 0x345c6834U,0xa5f451a5U,0xe534d1e5U,0xf108f9f1U,0x7193e271U,0xd873abd8U,0x31536231U,0x153f2a15U, + 0x040c0804U,0xc75295c7U,0x23654623U,0xc35e9dc3U,0x18283018U,0x96a13796U,0x050f0a05U,0x9ab52f9aU, + 0x07090e07U,0x12362412U,0x809b1b80U,0xe23ddfe2U,0xeb26cdebU,0x27694e27U,0xb2cd7fb2U,0x759fea75U, + 0x091b1209U,0x839e1d83U,0x2c74582cU,0x1a2e341aU,0x1b2d361bU,0x6eb2dc6eU,0x5aeeb45aU,0xa0fb5ba0U, + 0x52f6a452U,0x3b4d763bU,0xd661b7d6U,0xb3ce7db3U,0x297b5229U,0xe33edde3U,0x2f715e2fU,0x84971384U, + 0x53f5a653U,0xd168b9d1U,0x00000000U,0xed2cc1edU,0x20604020U,0xfc1fe3fcU,0xb1c879b1U,0x5bedb65bU, + 0x6abed46aU,0xcb468dcbU,0xbed967beU,0x394b7239U,0x4ade944aU,0x4cd4984cU,0x58e8b058U,0xcf4a85cfU, + 0xd06bbbd0U,0xef2ac5efU,0xaae54faaU,0xfb16edfbU,0x43c58643U,0x4dd79a4dU,0x33556633U,0x85941185U, + 0x45cf8a45U,0xf910e9f9U,0x02060402U,0x7f81fe7fU,0x50f0a050U,0x3c44783cU,0x9fba259fU,0xa8e34ba8U, + 0x51f3a251U,0xa3fe5da3U,0x40c08040U,0x8f8a058fU,0x92ad3f92U,0x9dbc219dU,0x38487038U,0xf504f1f5U, + 0xbcdf63bcU,0xb6c177b6U,0xda75afdaU,0x21634221U,0x10302010U,0xff1ae5ffU,0xf30efdf3U,0xd26dbfd2U, + 0xcd4c81cdU,0x0c14180cU,0x13352613U,0xec2fc3ecU,0x5fe1be5fU,0x97a23597U,0x44cc8844U,0x17392e17U, + 0xc45793c4U,0xa7f255a7U,0x7e82fc7eU,0x3d477a3dU,0x64acc864U,0x5de7ba5dU,0x192b3219U,0x7395e673U, + 0x60a0c060U,0x81981981U,0x4fd19e4fU,0xdc7fa3dcU,0x22664422U,0x2a7e542aU,0x90ab3b90U,0x88830b88U, + 0x46ca8c46U,0xee29c7eeU,0xb8d36bb8U,0x143c2814U,0xde79a7deU,0x5ee2bc5eU,0x0b1d160bU,0xdb76addbU, + 0xe03bdbe0U,0x32566432U,0x3a4e743aU,0x0a1e140aU,0x49db9249U,0x060a0c06U,0x246c4824U,0x5ce4b85cU, + 0xc25d9fc2U,0xd36ebdd3U,0xacef43acU,0x62a6c462U,0x91a83991U,0x95a43195U,0xe437d3e4U,0x798bf279U, + 0xe732d5e7U,0xc8438bc8U,0x37596e37U,0x6db7da6dU,0x8d8c018dU,0xd564b1d5U,0x4ed29c4eU,0xa9e049a9U, + 0x6cb4d86cU,0x56faac56U,0xf407f3f4U,0xea25cfeaU,0x65afca65U,0x7a8ef47aU,0xaee947aeU,0x08181008U, + 0xbad56fbaU,0x7888f078U,0x256f4a25U,0x2e725c2eU,0x1c24381cU,0xa6f157a6U,0xb4c773b4U,0xc65197c6U, + 0xe823cbe8U,0xdd7ca1ddU,0x749ce874U,0x1f213e1fU,0x4bdd964bU,0xbddc61bdU,0x8b860d8bU,0x8a850f8aU, + 0x7090e070U,0x3e427c3eU,0xb5c471b5U,0x66aacc66U,0x48d89048U,0x03050603U,0xf601f7f6U,0x0e121c0eU, + 0x61a3c261U,0x355f6a35U,0x57f9ae57U,0xb9d069b9U,0x86911786U,0xc15899c1U,0x1d273a1dU,0x9eb9279eU, + 0xe138d9e1U,0xf813ebf8U,0x98b32b98U,0x11332211U,0x69bbd269U,0xd970a9d9U,0x8e89078eU,0x94a73394U, + 0x9bb62d9bU,0x1e223c1eU,0x87921587U,0xe920c9e9U,0xce4987ceU,0x55ffaa55U,0x28785028U,0xdf7aa5dfU, + 0x8c8f038cU,0xa1f859a1U,0x89800989U,0x0d171a0dU,0xbfda65bfU,0xe631d7e6U,0x42c68442U,0x68b8d068U, + 0x41c38241U,0x99b02999U,0x2d775a2dU,0x0f111e0fU,0xb0cb7bb0U,0x54fca854U,0xbbd66dbbU,0x163a2c16U, +}; +static const UINT32 Te3[256]={ + 0x6363a5c6U,0x7c7c84f8U,0x777799eeU,0x7b7b8df6U,0xf2f20dffU,0x6b6bbdd6U,0x6f6fb1deU,0xc5c55491U, + 0x30305060U,0x01010302U,0x6767a9ceU,0x2b2b7d56U,0xfefe19e7U,0xd7d762b5U,0xababe64dU,0x76769aecU, + 0xcaca458fU,0x82829d1fU,0xc9c94089U,0x7d7d87faU,0xfafa15efU,0x5959ebb2U,0x4747c98eU,0xf0f00bfbU, + 0xadadec41U,0xd4d467b3U,0xa2a2fd5fU,0xafafea45U,0x9c9cbf23U,0xa4a4f753U,0x727296e4U,0xc0c05b9bU, + 0xb7b7c275U,0xfdfd1ce1U,0x9393ae3dU,0x26266a4cU,0x36365a6cU,0x3f3f417eU,0xf7f702f5U,0xcccc4f83U, + 0x34345c68U,0xa5a5f451U,0xe5e534d1U,0xf1f108f9U,0x717193e2U,0xd8d873abU,0x31315362U,0x15153f2aU, + 0x04040c08U,0xc7c75295U,0x23236546U,0xc3c35e9dU,0x18182830U,0x9696a137U,0x05050f0aU,0x9a9ab52fU, + 0x0707090eU,0x12123624U,0x80809b1bU,0xe2e23ddfU,0xebeb26cdU,0x2727694eU,0xb2b2cd7fU,0x75759feaU, + 0x09091b12U,0x83839e1dU,0x2c2c7458U,0x1a1a2e34U,0x1b1b2d36U,0x6e6eb2dcU,0x5a5aeeb4U,0xa0a0fb5bU, + 0x5252f6a4U,0x3b3b4d76U,0xd6d661b7U,0xb3b3ce7dU,0x29297b52U,0xe3e33eddU,0x2f2f715eU,0x84849713U, + 0x5353f5a6U,0xd1d168b9U,0x00000000U,0xeded2cc1U,0x20206040U,0xfcfc1fe3U,0xb1b1c879U,0x5b5bedb6U, + 0x6a6abed4U,0xcbcb468dU,0xbebed967U,0x39394b72U,0x4a4ade94U,0x4c4cd498U,0x5858e8b0U,0xcfcf4a85U, + 0xd0d06bbbU,0xefef2ac5U,0xaaaae54fU,0xfbfb16edU,0x4343c586U,0x4d4dd79aU,0x33335566U,0x85859411U, + 0x4545cf8aU,0xf9f910e9U,0x02020604U,0x7f7f81feU,0x5050f0a0U,0x3c3c4478U,0x9f9fba25U,0xa8a8e34bU, + 0x5151f3a2U,0xa3a3fe5dU,0x4040c080U,0x8f8f8a05U,0x9292ad3fU,0x9d9dbc21U,0x38384870U,0xf5f504f1U, + 0xbcbcdf63U,0xb6b6c177U,0xdada75afU,0x21216342U,0x10103020U,0xffff1ae5U,0xf3f30efdU,0xd2d26dbfU, + 0xcdcd4c81U,0x0c0c1418U,0x13133526U,0xecec2fc3U,0x5f5fe1beU,0x9797a235U,0x4444cc88U,0x1717392eU, + 0xc4c45793U,0xa7a7f255U,0x7e7e82fcU,0x3d3d477aU,0x6464acc8U,0x5d5de7baU,0x19192b32U,0x737395e6U, + 0x6060a0c0U,0x81819819U,0x4f4fd19eU,0xdcdc7fa3U,0x22226644U,0x2a2a7e54U,0x9090ab3bU,0x8888830bU, + 0x4646ca8cU,0xeeee29c7U,0xb8b8d36bU,0x14143c28U,0xdede79a7U,0x5e5ee2bcU,0x0b0b1d16U,0xdbdb76adU, + 0xe0e03bdbU,0x32325664U,0x3a3a4e74U,0x0a0a1e14U,0x4949db92U,0x06060a0cU,0x24246c48U,0x5c5ce4b8U, + 0xc2c25d9fU,0xd3d36ebdU,0xacacef43U,0x6262a6c4U,0x9191a839U,0x9595a431U,0xe4e437d3U,0x79798bf2U, + 0xe7e732d5U,0xc8c8438bU,0x3737596eU,0x6d6db7daU,0x8d8d8c01U,0xd5d564b1U,0x4e4ed29cU,0xa9a9e049U, + 0x6c6cb4d8U,0x5656faacU,0xf4f407f3U,0xeaea25cfU,0x6565afcaU,0x7a7a8ef4U,0xaeaee947U,0x08081810U, + 0xbabad56fU,0x787888f0U,0x25256f4aU,0x2e2e725cU,0x1c1c2438U,0xa6a6f157U,0xb4b4c773U,0xc6c65197U, + 0xe8e823cbU,0xdddd7ca1U,0x74749ce8U,0x1f1f213eU,0x4b4bdd96U,0xbdbddc61U,0x8b8b860dU,0x8a8a850fU, + 0x707090e0U,0x3e3e427cU,0xb5b5c471U,0x6666aaccU,0x4848d890U,0x03030506U,0xf6f601f7U,0x0e0e121cU, + 0x6161a3c2U,0x35355f6aU,0x5757f9aeU,0xb9b9d069U,0x86869117U,0xc1c15899U,0x1d1d273aU,0x9e9eb927U, + 0xe1e138d9U,0xf8f813ebU,0x9898b32bU,0x11113322U,0x6969bbd2U,0xd9d970a9U,0x8e8e8907U,0x9494a733U, + 0x9b9bb62dU,0x1e1e223cU,0x87879215U,0xe9e920c9U,0xcece4987U,0x5555ffaaU,0x28287850U,0xdfdf7aa5U, + 0x8c8c8f03U,0xa1a1f859U,0x89898009U,0x0d0d171aU,0xbfbfda65U,0xe6e631d7U,0x4242c684U,0x6868b8d0U, + 0x4141c382U,0x9999b029U,0x2d2d775aU,0x0f0f111eU,0xb0b0cb7bU,0x5454fca8U,0xbbbbd66dU,0x16163a2cU, +}; + +static const UINT32 Td0[256]={ + 0x51f4a750U,0x7e416553U,0x1a17a4c3U,0x3a275e96U,0x3bab6bcbU,0x1f9d45f1U,0xacfa58abU,0x4be30393U, + 0x2030fa55U,0xad766df6U,0x88cc7691U,0xf5024c25U,0x4fe5d7fcU,0xc52acbd7U,0x26354480U,0xb562a38fU, + 0xdeb15a49U,0x25ba1b67U,0x45ea0e98U,0x5dfec0e1U,0xc32f7502U,0x814cf012U,0x8d4697a3U,0x6bd3f9c6U, + 0x038f5fe7U,0x15929c95U,0xbf6d7aebU,0x955259daU,0xd4be832dU,0x587421d3U,0x49e06929U,0x8ec9c844U, + 0x75c2896aU,0xf48e7978U,0x99583e6bU,0x27b971ddU,0xbee14fb6U,0xf088ad17U,0xc920ac66U,0x7dce3ab4U, + 0x63df4a18U,0xe51a3182U,0x97513360U,0x62537f45U,0xb16477e0U,0xbb6bae84U,0xfe81a01cU,0xf9082b94U, + 0x70486858U,0x8f45fd19U,0x94de6c87U,0x527bf8b7U,0xab73d323U,0x724b02e2U,0xe31f8f57U,0x6655ab2aU, + 0xb2eb2807U,0x2fb5c203U,0x86c57b9aU,0xd33708a5U,0x302887f2U,0x23bfa5b2U,0x02036abaU,0xed16825cU, + 0x8acf1c2bU,0xa779b492U,0xf307f2f0U,0x4e69e2a1U,0x65daf4cdU,0x0605bed5U,0xd134621fU,0xc4a6fe8aU, + 0x342e539dU,0xa2f355a0U,0x058ae132U,0xa4f6eb75U,0x0b83ec39U,0x4060efaaU,0x5e719f06U,0xbd6e1051U, + 0x3e218af9U,0x96dd063dU,0xdd3e05aeU,0x4de6bd46U,0x91548db5U,0x71c45d05U,0x0406d46fU,0x605015ffU, + 0x1998fb24U,0xd6bde997U,0x894043ccU,0x67d99e77U,0xb0e842bdU,0x07898b88U,0xe7195b38U,0x79c8eedbU, + 0xa17c0a47U,0x7c420fe9U,0xf8841ec9U,0x00000000U,0x09808683U,0x322bed48U,0x1e1170acU,0x6c5a724eU, + 0xfd0efffbU,0x0f853856U,0x3daed51eU,0x362d3927U,0x0a0fd964U,0x685ca621U,0x9b5b54d1U,0x24362e3aU, + 0x0c0a67b1U,0x9357e70fU,0xb4ee96d2U,0x1b9b919eU,0x80c0c54fU,0x61dc20a2U,0x5a774b69U,0x1c121a16U, + 0xe293ba0aU,0xc0a02ae5U,0x3c22e043U,0x121b171dU,0x0e090d0bU,0xf28bc7adU,0x2db6a8b9U,0x141ea9c8U, + 0x57f11985U,0xaf75074cU,0xee99ddbbU,0xa37f60fdU,0xf701269fU,0x5c72f5bcU,0x44663bc5U,0x5bfb7e34U, + 0x8b432976U,0xcb23c6dcU,0xb6edfc68U,0xb8e4f163U,0xd731dccaU,0x42638510U,0x13972240U,0x84c61120U, + 0x854a247dU,0xd2bb3df8U,0xaef93211U,0xc729a16dU,0x1d9e2f4bU,0xdcb230f3U,0x0d8652ecU,0x77c1e3d0U, + 0x2bb3166cU,0xa970b999U,0x119448faU,0x47e96422U,0xa8fc8cc4U,0xa0f03f1aU,0x567d2cd8U,0x223390efU, + 0x87494ec7U,0xd938d1c1U,0x8ccaa2feU,0x98d40b36U,0xa6f581cfU,0xa57ade28U,0xdab78e26U,0x3fadbfa4U, + 0x2c3a9de4U,0x5078920dU,0x6a5fcc9bU,0x547e4662U,0xf68d13c2U,0x90d8b8e8U,0x2e39f75eU,0x82c3aff5U, + 0x9f5d80beU,0x69d0937cU,0x6fd52da9U,0xcf2512b3U,0xc8ac993bU,0x10187da7U,0xe89c636eU,0xdb3bbb7bU, + 0xcd267809U,0x6e5918f4U,0xec9ab701U,0x834f9aa8U,0xe6956e65U,0xaaffe67eU,0x21bccf08U,0xef15e8e6U, + 0xbae79bd9U,0x4a6f36ceU,0xea9f09d4U,0x29b07cd6U,0x31a4b2afU,0x2a3f2331U,0xc6a59430U,0x35a266c0U, + 0x744ebc37U,0xfc82caa6U,0xe090d0b0U,0x33a7d815U,0xf104984aU,0x41ecdaf7U,0x7fcd500eU,0x1791f62fU, + 0x764dd68dU,0x43efb04dU,0xccaa4d54U,0xe49604dfU,0x9ed1b5e3U,0x4c6a881bU,0xc12c1fb8U,0x4665517fU, + 0x9d5eea04U,0x018c355dU,0xfa877473U,0xfb0b412eU,0xb3671d5aU,0x92dbd252U,0xe9105633U,0x6dd64713U, + 0x9ad7618cU,0x37a10c7aU,0x59f8148eU,0xeb133c89U,0xcea927eeU,0xb761c935U,0xe11ce5edU,0x7a47b13cU, + 0x9cd2df59U,0x55f2733fU,0x1814ce79U,0x73c737bfU,0x53f7cdeaU,0x5ffdaa5bU,0xdf3d6f14U,0x7844db86U, + 0xcaaff381U,0xb968c43eU,0x3824342cU,0xc2a3405fU,0x161dc372U,0xbce2250cU,0x283c498bU,0xff0d9541U, + 0x39a80171U,0x080cb3deU,0xd8b4e49cU,0x6456c190U,0x7bcb8461U,0xd532b670U,0x486c5c74U,0xd0b85742U, +}; +static const UINT32 Td1[256]={ + 0x5051f4a7U,0x537e4165U,0xc31a17a4U,0x963a275eU,0xcb3bab6bU,0xf11f9d45U,0xabacfa58U,0x934be303U, + 0x552030faU,0xf6ad766dU,0x9188cc76U,0x25f5024cU,0xfc4fe5d7U,0xd7c52acbU,0x80263544U,0x8fb562a3U, + 0x49deb15aU,0x6725ba1bU,0x9845ea0eU,0xe15dfec0U,0x02c32f75U,0x12814cf0U,0xa38d4697U,0xc66bd3f9U, + 0xe7038f5fU,0x9515929cU,0xebbf6d7aU,0xda955259U,0x2dd4be83U,0xd3587421U,0x2949e069U,0x448ec9c8U, + 0x6a75c289U,0x78f48e79U,0x6b99583eU,0xdd27b971U,0xb6bee14fU,0x17f088adU,0x66c920acU,0xb47dce3aU, + 0x1863df4aU,0x82e51a31U,0x60975133U,0x4562537fU,0xe0b16477U,0x84bb6baeU,0x1cfe81a0U,0x94f9082bU, + 0x58704868U,0x198f45fdU,0x8794de6cU,0xb7527bf8U,0x23ab73d3U,0xe2724b02U,0x57e31f8fU,0x2a6655abU, + 0x07b2eb28U,0x032fb5c2U,0x9a86c57bU,0xa5d33708U,0xf2302887U,0xb223bfa5U,0xba02036aU,0x5ced1682U, + 0x2b8acf1cU,0x92a779b4U,0xf0f307f2U,0xa14e69e2U,0xcd65daf4U,0xd50605beU,0x1fd13462U,0x8ac4a6feU, + 0x9d342e53U,0xa0a2f355U,0x32058ae1U,0x75a4f6ebU,0x390b83ecU,0xaa4060efU,0x065e719fU,0x51bd6e10U, + 0xf93e218aU,0x3d96dd06U,0xaedd3e05U,0x464de6bdU,0xb591548dU,0x0571c45dU,0x6f0406d4U,0xff605015U, + 0x241998fbU,0x97d6bde9U,0xcc894043U,0x7767d99eU,0xbdb0e842U,0x8807898bU,0x38e7195bU,0xdb79c8eeU, + 0x47a17c0aU,0xe97c420fU,0xc9f8841eU,0x00000000U,0x83098086U,0x48322bedU,0xac1e1170U,0x4e6c5a72U, + 0xfbfd0effU,0x560f8538U,0x1e3daed5U,0x27362d39U,0x640a0fd9U,0x21685ca6U,0xd19b5b54U,0x3a24362eU, + 0xb10c0a67U,0x0f9357e7U,0xd2b4ee96U,0x9e1b9b91U,0x4f80c0c5U,0xa261dc20U,0x695a774bU,0x161c121aU, + 0x0ae293baU,0xe5c0a02aU,0x433c22e0U,0x1d121b17U,0x0b0e090dU,0xadf28bc7U,0xb92db6a8U,0xc8141ea9U, + 0x8557f119U,0x4caf7507U,0xbbee99ddU,0xfda37f60U,0x9ff70126U,0xbc5c72f5U,0xc544663bU,0x345bfb7eU, + 0x768b4329U,0xdccb23c6U,0x68b6edfcU,0x63b8e4f1U,0xcad731dcU,0x10426385U,0x40139722U,0x2084c611U, + 0x7d854a24U,0xf8d2bb3dU,0x11aef932U,0x6dc729a1U,0x4b1d9e2fU,0xf3dcb230U,0xec0d8652U,0xd077c1e3U, + 0x6c2bb316U,0x99a970b9U,0xfa119448U,0x2247e964U,0xc4a8fc8cU,0x1aa0f03fU,0xd8567d2cU,0xef223390U, + 0xc787494eU,0xc1d938d1U,0xfe8ccaa2U,0x3698d40bU,0xcfa6f581U,0x28a57adeU,0x26dab78eU,0xa43fadbfU, + 0xe42c3a9dU,0x0d507892U,0x9b6a5fccU,0x62547e46U,0xc2f68d13U,0xe890d8b8U,0x5e2e39f7U,0xf582c3afU, + 0xbe9f5d80U,0x7c69d093U,0xa96fd52dU,0xb3cf2512U,0x3bc8ac99U,0xa710187dU,0x6ee89c63U,0x7bdb3bbbU, + 0x09cd2678U,0xf46e5918U,0x01ec9ab7U,0xa8834f9aU,0x65e6956eU,0x7eaaffe6U,0x0821bccfU,0xe6ef15e8U, + 0xd9bae79bU,0xce4a6f36U,0xd4ea9f09U,0xd629b07cU,0xaf31a4b2U,0x312a3f23U,0x30c6a594U,0xc035a266U, + 0x37744ebcU,0xa6fc82caU,0xb0e090d0U,0x1533a7d8U,0x4af10498U,0xf741ecdaU,0x0e7fcd50U,0x2f1791f6U, + 0x8d764dd6U,0x4d43efb0U,0x54ccaa4dU,0xdfe49604U,0xe39ed1b5U,0x1b4c6a88U,0xb8c12c1fU,0x7f466551U, + 0x049d5eeaU,0x5d018c35U,0x73fa8774U,0x2efb0b41U,0x5ab3671dU,0x5292dbd2U,0x33e91056U,0x136dd647U, + 0x8c9ad761U,0x7a37a10cU,0x8e59f814U,0x89eb133cU,0xeecea927U,0x35b761c9U,0xede11ce5U,0x3c7a47b1U, + 0x599cd2dfU,0x3f55f273U,0x791814ceU,0xbf73c737U,0xea53f7cdU,0x5b5ffdaaU,0x14df3d6fU,0x867844dbU, + 0x81caaff3U,0x3eb968c4U,0x2c382434U,0x5fc2a340U,0x72161dc3U,0x0cbce225U,0x8b283c49U,0x41ff0d95U, + 0x7139a801U,0xde080cb3U,0x9cd8b4e4U,0x906456c1U,0x617bcb84U,0x70d532b6U,0x74486c5cU,0x42d0b857U, +}; +static const UINT32 Td2[256]={ + 0xa75051f4U,0x65537e41U,0xa4c31a17U,0x5e963a27U,0x6bcb3babU,0x45f11f9dU,0x58abacfaU,0x03934be3U, + 0xfa552030U,0x6df6ad76U,0x769188ccU,0x4c25f502U,0xd7fc4fe5U,0xcbd7c52aU,0x44802635U,0xa38fb562U, + 0x5a49deb1U,0x1b6725baU,0x0e9845eaU,0xc0e15dfeU,0x7502c32fU,0xf012814cU,0x97a38d46U,0xf9c66bd3U, + 0x5fe7038fU,0x9c951592U,0x7aebbf6dU,0x59da9552U,0x832dd4beU,0x21d35874U,0x692949e0U,0xc8448ec9U, + 0x896a75c2U,0x7978f48eU,0x3e6b9958U,0x71dd27b9U,0x4fb6bee1U,0xad17f088U,0xac66c920U,0x3ab47dceU, + 0x4a1863dfU,0x3182e51aU,0x33609751U,0x7f456253U,0x77e0b164U,0xae84bb6bU,0xa01cfe81U,0x2b94f908U, + 0x68587048U,0xfd198f45U,0x6c8794deU,0xf8b7527bU,0xd323ab73U,0x02e2724bU,0x8f57e31fU,0xab2a6655U, + 0x2807b2ebU,0xc2032fb5U,0x7b9a86c5U,0x08a5d337U,0x87f23028U,0xa5b223bfU,0x6aba0203U,0x825ced16U, + 0x1c2b8acfU,0xb492a779U,0xf2f0f307U,0xe2a14e69U,0xf4cd65daU,0xbed50605U,0x621fd134U,0xfe8ac4a6U, + 0x539d342eU,0x55a0a2f3U,0xe132058aU,0xeb75a4f6U,0xec390b83U,0xefaa4060U,0x9f065e71U,0x1051bd6eU, + 0x8af93e21U,0x063d96ddU,0x05aedd3eU,0xbd464de6U,0x8db59154U,0x5d0571c4U,0xd46f0406U,0x15ff6050U, + 0xfb241998U,0xe997d6bdU,0x43cc8940U,0x9e7767d9U,0x42bdb0e8U,0x8b880789U,0x5b38e719U,0xeedb79c8U, + 0x0a47a17cU,0x0fe97c42U,0x1ec9f884U,0x00000000U,0x86830980U,0xed48322bU,0x70ac1e11U,0x724e6c5aU, + 0xfffbfd0eU,0x38560f85U,0xd51e3daeU,0x3927362dU,0xd9640a0fU,0xa621685cU,0x54d19b5bU,0x2e3a2436U, + 0x67b10c0aU,0xe70f9357U,0x96d2b4eeU,0x919e1b9bU,0xc54f80c0U,0x20a261dcU,0x4b695a77U,0x1a161c12U, + 0xba0ae293U,0x2ae5c0a0U,0xe0433c22U,0x171d121bU,0x0d0b0e09U,0xc7adf28bU,0xa8b92db6U,0xa9c8141eU, + 0x198557f1U,0x074caf75U,0xddbbee99U,0x60fda37fU,0x269ff701U,0xf5bc5c72U,0x3bc54466U,0x7e345bfbU, + 0x29768b43U,0xc6dccb23U,0xfc68b6edU,0xf163b8e4U,0xdccad731U,0x85104263U,0x22401397U,0x112084c6U, + 0x247d854aU,0x3df8d2bbU,0x3211aef9U,0xa16dc729U,0x2f4b1d9eU,0x30f3dcb2U,0x52ec0d86U,0xe3d077c1U, + 0x166c2bb3U,0xb999a970U,0x48fa1194U,0x642247e9U,0x8cc4a8fcU,0x3f1aa0f0U,0x2cd8567dU,0x90ef2233U, + 0x4ec78749U,0xd1c1d938U,0xa2fe8ccaU,0x0b3698d4U,0x81cfa6f5U,0xde28a57aU,0x8e26dab7U,0xbfa43fadU, + 0x9de42c3aU,0x920d5078U,0xcc9b6a5fU,0x4662547eU,0x13c2f68dU,0xb8e890d8U,0xf75e2e39U,0xaff582c3U, + 0x80be9f5dU,0x937c69d0U,0x2da96fd5U,0x12b3cf25U,0x993bc8acU,0x7da71018U,0x636ee89cU,0xbb7bdb3bU, + 0x7809cd26U,0x18f46e59U,0xb701ec9aU,0x9aa8834fU,0x6e65e695U,0xe67eaaffU,0xcf0821bcU,0xe8e6ef15U, + 0x9bd9bae7U,0x36ce4a6fU,0x09d4ea9fU,0x7cd629b0U,0xb2af31a4U,0x23312a3fU,0x9430c6a5U,0x66c035a2U, + 0xbc37744eU,0xcaa6fc82U,0xd0b0e090U,0xd81533a7U,0x984af104U,0xdaf741ecU,0x500e7fcdU,0xf62f1791U, + 0xd68d764dU,0xb04d43efU,0x4d54ccaaU,0x04dfe496U,0xb5e39ed1U,0x881b4c6aU,0x1fb8c12cU,0x517f4665U, + 0xea049d5eU,0x355d018cU,0x7473fa87U,0x412efb0bU,0x1d5ab367U,0xd25292dbU,0x5633e910U,0x47136dd6U, + 0x618c9ad7U,0x0c7a37a1U,0x148e59f8U,0x3c89eb13U,0x27eecea9U,0xc935b761U,0xe5ede11cU,0xb13c7a47U, + 0xdf599cd2U,0x733f55f2U,0xce791814U,0x37bf73c7U,0xcdea53f7U,0xaa5b5ffdU,0x6f14df3dU,0xdb867844U, + 0xf381caafU,0xc43eb968U,0x342c3824U,0x405fc2a3U,0xc372161dU,0x250cbce2U,0x498b283cU,0x9541ff0dU, + 0x017139a8U,0xb3de080cU,0xe49cd8b4U,0xc1906456U,0x84617bcbU,0xb670d532U,0x5c74486cU,0x5742d0b8U, +}; +static const UINT32 Td3[256]={ + 0xf4a75051U,0x4165537eU,0x17a4c31aU,0x275e963aU,0xab6bcb3bU,0x9d45f11fU,0xfa58abacU,0xe303934bU, + 0x30fa5520U,0x766df6adU,0xcc769188U,0x024c25f5U,0xe5d7fc4fU,0x2acbd7c5U,0x35448026U,0x62a38fb5U, + 0xb15a49deU,0xba1b6725U,0xea0e9845U,0xfec0e15dU,0x2f7502c3U,0x4cf01281U,0x4697a38dU,0xd3f9c66bU, + 0x8f5fe703U,0x929c9515U,0x6d7aebbfU,0x5259da95U,0xbe832dd4U,0x7421d358U,0xe0692949U,0xc9c8448eU, + 0xc2896a75U,0x8e7978f4U,0x583e6b99U,0xb971dd27U,0xe14fb6beU,0x88ad17f0U,0x20ac66c9U,0xce3ab47dU, + 0xdf4a1863U,0x1a3182e5U,0x51336097U,0x537f4562U,0x6477e0b1U,0x6bae84bbU,0x81a01cfeU,0x082b94f9U, + 0x48685870U,0x45fd198fU,0xde6c8794U,0x7bf8b752U,0x73d323abU,0x4b02e272U,0x1f8f57e3U,0x55ab2a66U, + 0xeb2807b2U,0xb5c2032fU,0xc57b9a86U,0x3708a5d3U,0x2887f230U,0xbfa5b223U,0x036aba02U,0x16825cedU, + 0xcf1c2b8aU,0x79b492a7U,0x07f2f0f3U,0x69e2a14eU,0xdaf4cd65U,0x05bed506U,0x34621fd1U,0xa6fe8ac4U, + 0x2e539d34U,0xf355a0a2U,0x8ae13205U,0xf6eb75a4U,0x83ec390bU,0x60efaa40U,0x719f065eU,0x6e1051bdU, + 0x218af93eU,0xdd063d96U,0x3e05aeddU,0xe6bd464dU,0x548db591U,0xc45d0571U,0x06d46f04U,0x5015ff60U, + 0x98fb2419U,0xbde997d6U,0x4043cc89U,0xd99e7767U,0xe842bdb0U,0x898b8807U,0x195b38e7U,0xc8eedb79U, + 0x7c0a47a1U,0x420fe97cU,0x841ec9f8U,0x00000000U,0x80868309U,0x2bed4832U,0x1170ac1eU,0x5a724e6cU, + 0x0efffbfdU,0x8538560fU,0xaed51e3dU,0x2d392736U,0x0fd9640aU,0x5ca62168U,0x5b54d19bU,0x362e3a24U, + 0x0a67b10cU,0x57e70f93U,0xee96d2b4U,0x9b919e1bU,0xc0c54f80U,0xdc20a261U,0x774b695aU,0x121a161cU, + 0x93ba0ae2U,0xa02ae5c0U,0x22e0433cU,0x1b171d12U,0x090d0b0eU,0x8bc7adf2U,0xb6a8b92dU,0x1ea9c814U, + 0xf1198557U,0x75074cafU,0x99ddbbeeU,0x7f60fda3U,0x01269ff7U,0x72f5bc5cU,0x663bc544U,0xfb7e345bU, + 0x4329768bU,0x23c6dccbU,0xedfc68b6U,0xe4f163b8U,0x31dccad7U,0x63851042U,0x97224013U,0xc6112084U, + 0x4a247d85U,0xbb3df8d2U,0xf93211aeU,0x29a16dc7U,0x9e2f4b1dU,0xb230f3dcU,0x8652ec0dU,0xc1e3d077U, + 0xb3166c2bU,0x70b999a9U,0x9448fa11U,0xe9642247U,0xfc8cc4a8U,0xf03f1aa0U,0x7d2cd856U,0x3390ef22U, + 0x494ec787U,0x38d1c1d9U,0xcaa2fe8cU,0xd40b3698U,0xf581cfa6U,0x7ade28a5U,0xb78e26daU,0xadbfa43fU, + 0x3a9de42cU,0x78920d50U,0x5fcc9b6aU,0x7e466254U,0x8d13c2f6U,0xd8b8e890U,0x39f75e2eU,0xc3aff582U, + 0x5d80be9fU,0xd0937c69U,0xd52da96fU,0x2512b3cfU,0xac993bc8U,0x187da710U,0x9c636ee8U,0x3bbb7bdbU, + 0x267809cdU,0x5918f46eU,0x9ab701ecU,0x4f9aa883U,0x956e65e6U,0xffe67eaaU,0xbccf0821U,0x15e8e6efU, + 0xe79bd9baU,0x6f36ce4aU,0x9f09d4eaU,0xb07cd629U,0xa4b2af31U,0x3f23312aU,0xa59430c6U,0xa266c035U, + 0x4ebc3774U,0x82caa6fcU,0x90d0b0e0U,0xa7d81533U,0x04984af1U,0xecdaf741U,0xcd500e7fU,0x91f62f17U, + 0x4dd68d76U,0xefb04d43U,0xaa4d54ccU,0x9604dfe4U,0xd1b5e39eU,0x6a881b4cU,0x2c1fb8c1U,0x65517f46U, + 0x5eea049dU,0x8c355d01U,0x877473faU,0x0b412efbU,0x671d5ab3U,0xdbd25292U,0x105633e9U,0xd647136dU, + 0xd7618c9aU,0xa10c7a37U,0xf8148e59U,0x133c89ebU,0xa927eeceU,0x61c935b7U,0x1ce5ede1U,0x47b13c7aU, + 0xd2df599cU,0xf2733f55U,0x14ce7918U,0xc737bf73U,0xf7cdea53U,0xfdaa5b5fU,0x3d6f14dfU,0x44db8678U, + 0xaff381caU,0x68c43eb9U,0x24342c38U,0xa3405fc2U,0x1dc37216U,0xe2250cbcU,0x3c498b28U,0x0d9541ffU, + 0xa8017139U,0x0cb3de08U,0xb4e49cd8U,0x56c19064U,0xcb84617bU,0x32b670d5U,0x6c5c7448U,0xb85742d0U, +}; +static const UINT8 Td4[256]={ + 0x52U,0x09U,0x6aU,0xd5U,0x30U,0x36U,0xa5U,0x38U,0xbfU,0x40U,0xa3U,0x9eU,0x81U,0xf3U,0xd7U,0xfbU, + 0x7cU,0xe3U,0x39U,0x82U,0x9bU,0x2fU,0xffU,0x87U,0x34U,0x8eU,0x43U,0x44U,0xc4U,0xdeU,0xe9U,0xcbU, + 0x54U,0x7bU,0x94U,0x32U,0xa6U,0xc2U,0x23U,0x3dU,0xeeU,0x4cU,0x95U,0x0bU,0x42U,0xfaU,0xc3U,0x4eU, + 0x08U,0x2eU,0xa1U,0x66U,0x28U,0xd9U,0x24U,0xb2U,0x76U,0x5bU,0xa2U,0x49U,0x6dU,0x8bU,0xd1U,0x25U, + 0x72U,0xf8U,0xf6U,0x64U,0x86U,0x68U,0x98U,0x16U,0xd4U,0xa4U,0x5cU,0xccU,0x5dU,0x65U,0xb6U,0x92U, + 0x6cU,0x70U,0x48U,0x50U,0xfdU,0xedU,0xb9U,0xdaU,0x5eU,0x15U,0x46U,0x57U,0xa7U,0x8dU,0x9dU,0x84U, + 0x90U,0xd8U,0xabU,0x00U,0x8cU,0xbcU,0xd3U,0x0aU,0xf7U,0xe4U,0x58U,0x05U,0xb8U,0xb3U,0x45U,0x06U, + 0xd0U,0x2cU,0x1eU,0x8fU,0xcaU,0x3fU,0x0fU,0x02U,0xc1U,0xafU,0xbdU,0x03U,0x01U,0x13U,0x8aU,0x6bU, + 0x3aU,0x91U,0x11U,0x41U,0x4fU,0x67U,0xdcU,0xeaU,0x97U,0xf2U,0xcfU,0xceU,0xf0U,0xb4U,0xe6U,0x73U, + 0x96U,0xacU,0x74U,0x22U,0xe7U,0xadU,0x35U,0x85U,0xe2U,0xf9U,0x37U,0xe8U,0x1cU,0x75U,0xdfU,0x6eU, + 0x47U,0xf1U,0x1aU,0x71U,0x1dU,0x29U,0xc5U,0x89U,0x6fU,0xb7U,0x62U,0x0eU,0xaaU,0x18U,0xbeU,0x1bU, + 0xfcU,0x56U,0x3eU,0x4bU,0xc6U,0xd2U,0x79U,0x20U,0x9aU,0xdbU,0xc0U,0xfeU,0x78U,0xcdU,0x5aU,0xf4U, + 0x1fU,0xddU,0xa8U,0x33U,0x88U,0x07U,0xc7U,0x31U,0xb1U,0x12U,0x10U,0x59U,0x27U,0x80U,0xecU,0x5fU, + 0x60U,0x51U,0x7fU,0xa9U,0x19U,0xb5U,0x4aU,0x0dU,0x2dU,0xe5U,0x7aU,0x9fU,0x93U,0xc9U,0x9cU,0xefU, + 0xa0U,0xe0U,0x3bU,0x4dU,0xaeU,0x2aU,0xf5U,0xb0U,0xc8U,0xebU,0xbbU,0x3cU,0x83U,0x53U,0x99U,0x61U, + 0x17U,0x2bU,0x04U,0x7eU,0xbaU,0x77U,0xd6U,0x26U,0xe1U,0x69U,0x14U,0x63U,0x55U,0x21U,0x0cU,0x7dU, +}; +static const UINT32 rcon[]={ + 0x01000000,0x02000000,0x04000000,0x08000000,0x10000000,0x20000000,0x40000000,0x80000000,0x1B000000 +}; +UINT32 decrd[4*15]; +UINT8 aes_iv[16]; + +void aes_init(unsigned char *pass) +{ + UINT32 i=0,j=0,t,*rk; + CopyMem(aes_iv,pass+(pass[0]&0xF),16); + rk=decrd; + rk[0]=GETU32(pass );rk[1]=GETU32(pass+ 4);rk[2]=GETU32(pass+ 8);rk[3]=GETU32(pass+12); + rk[4]=GETU32(pass+16);rk[5]=GETU32(pass+20);rk[6]=GETU32(pass+24);rk[7]=GETU32(pass+28); + while (1) { + t=rk[7];rk[8]=rk[0]^(Te2[(t>>16)&0xff]&0xff000000)^(Te3[(t>>8)&0xff]&0x00ff0000)^ + (Te0[(t)&0xff]&0x0000ff00)^(Te1[(t>>24)]&0x000000ff)^rcon[i]; + rk[9]=rk[1]^rk[8];rk[10]=rk[2]^rk[9];rk[11]=rk[3]^rk[10]; + if(++i==7) break; + t=rk[11];rk[12]=rk[4]^(Te2[(t>>24)]&0xff000000)^(Te3[(t>>16)&0xff]&0x00ff0000)^ + (Te0[(t>>8)&0xff]&0x0000ff00)^(Te1[(t)&0xff]&0x000000ff); + rk[13]=rk[5]^rk[12];rk[14]=rk[6]^rk[13];rk[15]=rk[7]^rk[14];rk+=8; + } + rk=decrd; + for(i=0,j=4*14;i>24)]&0xff]^Td1[Te1[(rk[0]>>16)&0xff]&0xff]^ + Td2[Te1[(rk[0]>>8)&0xff]&0xff]^Td3[Te1[(rk[0])&0xff]&0xff]; + rk[1]=Td0[Te1[(rk[1]>>24)]&0xff]^Td1[Te1[(rk[1]>>16)&0xff]&0xff]^ + Td2[Te1[(rk[1]>>8)&0xff]&0xff]^Td3[Te1[(rk[1])&0xff]&0xff]; + rk[2]=Td0[Te1[(rk[2]>>24)]&0xff]^Td1[Te1[(rk[2]>>16)&0xff]&0xff]^ + Td2[Te1[(rk[2]>>8)&0xff]&0xff]^Td3[Te1[(rk[2])&0xff]&0xff]; + rk[3]=Td0[Te1[(rk[3]>>24)]&0xff]^Td1[Te1[(rk[3]>>16)&0xff]&0xff]^ + Td2[Te1[(rk[3]>>8)&0xff]&0xff]^Td3[Te1[(rk[3])&0xff]&0xff]; + } +} + +void aes_dec(unsigned char *data, UINT32 l) +{ + UINT32 rd[4*15],*rk=rd,n,s0,s1,s2,s3,t0,t1,t2,t3; + unsigned char ivec[16],c[sizeof(ivec)],d,*out=data; + CopyMem(&rd,&decrd,sizeof(rd)); + CopyMem(ivec,aes_iv,sizeof(ivec)); + while(l>=16) { + rk=rd;s0=GETU32(out)^rk[0];s1=GETU32(out+4)^rk[1];s2=GETU32(out+8)^rk[2];s3=GETU32(out+12)^rk[3]; + for(n=14>>1;;){ + t0=Td0[(s0>>24)]^Td1[(s3>>16)&0xff]^Td2[(s2>>8)&0xff]^Td3[(s1)&0xff]^rk[4]; + t1=Td0[(s1>>24)]^Td1[(s0>>16)&0xff]^Td2[(s3>>8)&0xff]^Td3[(s2)&0xff]^rk[5]; + t2=Td0[(s2>>24)]^Td1[(s1>>16)&0xff]^Td2[(s0>>8)&0xff]^Td3[(s3)&0xff]^rk[6]; + t3=Td0[(s3>>24)]^Td1[(s2>>16)&0xff]^Td2[(s1>>8)&0xff]^Td3[(s0)&0xff]^rk[7]; + rk+=8; + if(--n==0) break; + s0=Td0[(t0>>24)]^Td1[(t3>>16)&0xff]^Td2[(t2>>8)&0xff]^Td3[(t1)&0xff]^rk[0]; + s1=Td0[(t1>>24)]^Td1[(t0>>16)&0xff]^Td2[(t3>>8)&0xff]^Td3[(t2)&0xff]^rk[1]; + s2=Td0[(t2>>24)]^Td1[(t1>>16)&0xff]^Td2[(t0>>8)&0xff]^Td3[(t3)&0xff]^rk[2]; + s3=Td0[(t3>>24)]^Td1[(t2>>16)&0xff]^Td2[(t1>>8)&0xff]^Td3[(t0)&0xff]^rk[3]; + } + s0=((uint32_t)Td4[(t0>>24)]<<24)^((uint32_t)Td4[(t3>>16)&0xff]<<16)^ + ((uint32_t)Td4[(t2>>8)&0xff]<<8)^((uint32_t)Td4[(t1)&0xff])^rk[0]; + PUTU32(c,s0); + s1=((uint32_t)Td4[(t1>>24)]<<24)^((uint32_t)Td4[(t0>>16)&0xff]<<16)^ + ((uint32_t)Td4[(t3>>8)&0xff]<<8)^((uint32_t)Td4[(t2)&0xff])^rk[1]; + PUTU32(c+4,s1); + s2=((uint32_t)Td4[(t2>>24)]<<24)^((uint32_t)Td4[(t1>>16)&0xff]<<16)^ + ((uint32_t)Td4[(t0>>8)&0xff]<<8)^((uint32_t)Td4[(t3)&0xff])^rk[2]; + PUTU32(c+8,s2); + s3=((uint32_t)Td4[(t3>>24)]<<24)^((uint32_t)Td4[(t2>>16)&0xff]<<16)^ + ((uint32_t)Td4[(t1>>8)&0xff]<<8)^((uint32_t)Td4[(t0)&0xff])^rk[3]; + PUTU32(c+12,s3); + for(n=0;n<16;n++) {d=out[n];out[n]=c[n]^ivec[n];ivec[n]=d;} + l-=16; + out+=16; + } +} + /** * Read a line from ConIn */ diff --git a/x86_64-efi/fs.h b/x86_64-efi/fs.h index b44822f..3dac5a2 100644 --- a/x86_64-efi/fs.h +++ b/x86_64-efi/fs.h @@ -46,10 +46,6 @@ file_t fsz_initrd(unsigned char *initrd_p, char *kernel) SHA256_CTX ctx; DBG(L" * FS/Z %s\n",a2u(kernel)); //decrypt initrd - if(sb->enchash!=0 && FSZ_SB_EALG(sb->flags)!=0) { - Print(L"BOOTBOOT-PANIC: Unsupported cipher\n"); - return ret; - } while(sb->enchash!=0) { Print(L" * Passphrase? "); l=ReadLine(passphrase,sizeof(passphrase)); @@ -70,16 +66,23 @@ file_t fsz_initrd(unsigned char *initrd_p, char *kernel) SHA256_Init(&ctx); SHA256_Update(&ctx,&sb->encrypt,sizeof(sb->encrypt)); SHA256_Final(iv,&ctx); - for(k=ss,j=1;jnumsec;j++) { - CopyMem(chk,iv,32); - for(i=0;iflags&FSZ_SB_EALG_AESCBC) { + aes_init(iv); + for(k=ss,j=1;jnumsec;k+=ss,j++) { + aes_dec(initrd_p+k,ss); + } + } else { + for(k=ss,j=1;jnumsec;j++) { + CopyMem(chk,iv,32); + for(i=0;iencrypt,sizeof(sb->encrypt)+4);