1f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* LibTomCrypt, modular cryptographic library -- Tom St Denis 2f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 3f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * LibTomCrypt is a library that provides various cryptographic 4f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * algorithms in a highly modular and flexible manner. 5f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 6f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * The library is free for all purposes without any express 7f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * guarantee it works. 8f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 9f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com 10f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project */ 11f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/** 12f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @file blowfish.c 13f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project Implementation of the Blowfish block cipher, Tom St Denis 14f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project*/ 15f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "tomcrypt.h" 16f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 17f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef BLOWFISH 18f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 19f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectconst struct ltc_cipher_descriptor blowfish_desc = 20f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{ 21f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project "blowfish", 22f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0, 23f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 8, 56, 8, 16, 24f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project &blowfish_setup, 25f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project &blowfish_ecb_encrypt, 26f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project &blowfish_ecb_decrypt, 27f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project &blowfish_test, 28f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project &blowfish_done, 29f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project &blowfish_keysize, 30f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL 31f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}; 32f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 33f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic const ulong32 ORIG_P[16 + 2] = { 34f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x243F6A88UL, 0x85A308D3UL, 0x13198A2EUL, 0x03707344UL, 35f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xA4093822UL, 0x299F31D0UL, 0x082EFA98UL, 0xEC4E6C89UL, 36f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x452821E6UL, 0x38D01377UL, 0xBE5466CFUL, 0x34E90C6CUL, 37f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xC0AC29B7UL, 0xC97C50DDUL, 0x3F84D5B5UL, 0xB5470917UL, 38f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x9216D5D9UL, 0x8979FB1BUL 39f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}; 40f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 41f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic const ulong32 ORIG_S[4][256] = { 42f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 0xD1310BA6UL, 0x98DFB5ACUL, 0x2FFD72DBUL, 0xD01ADFB7UL, 43f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xB8E1AFEDUL, 0x6A267E96UL, 0xBA7C9045UL, 0xF12C7F99UL, 44f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x24A19947UL, 0xB3916CF7UL, 0x0801F2E2UL, 0x858EFC16UL, 45f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x636920D8UL, 0x71574E69UL, 0xA458FEA3UL, 0xF4933D7EUL, 46f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x0D95748FUL, 0x728EB658UL, 0x718BCD58UL, 0x82154AEEUL, 47f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x7B54A41DUL, 0xC25A59B5UL, 0x9C30D539UL, 0x2AF26013UL, 48f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xC5D1B023UL, 0x286085F0UL, 0xCA417918UL, 0xB8DB38EFUL, 49f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x8E79DCB0UL, 0x603A180EUL, 0x6C9E0E8BUL, 0xB01E8A3EUL, 50f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xD71577C1UL, 0xBD314B27UL, 0x78AF2FDAUL, 0x55605C60UL, 51f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xE65525F3UL, 0xAA55AB94UL, 0x57489862UL, 0x63E81440UL, 52f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x55CA396AUL, 0x2AAB10B6UL, 0xB4CC5C34UL, 0x1141E8CEUL, 53f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xA15486AFUL, 0x7C72E993UL, 0xB3EE1411UL, 0x636FBC2AUL, 54f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x2BA9C55DUL, 0x741831F6UL, 0xCE5C3E16UL, 0x9B87931EUL, 55f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xAFD6BA33UL, 0x6C24CF5CUL, 0x7A325381UL, 0x28958677UL, 56f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x3B8F4898UL, 0x6B4BB9AFUL, 0xC4BFE81BUL, 0x66282193UL, 57f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x61D809CCUL, 0xFB21A991UL, 0x487CAC60UL, 0x5DEC8032UL, 58f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xEF845D5DUL, 0xE98575B1UL, 0xDC262302UL, 0xEB651B88UL, 59f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x23893E81UL, 0xD396ACC5UL, 0x0F6D6FF3UL, 0x83F44239UL, 60f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x2E0B4482UL, 0xA4842004UL, 0x69C8F04AUL, 0x9E1F9B5EUL, 61f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x21C66842UL, 0xF6E96C9AUL, 0x670C9C61UL, 0xABD388F0UL, 62f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x6A51A0D2UL, 0xD8542F68UL, 0x960FA728UL, 0xAB5133A3UL, 63f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x6EEF0B6CUL, 0x137A3BE4UL, 0xBA3BF050UL, 0x7EFB2A98UL, 64f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xA1F1651DUL, 0x39AF0176UL, 0x66CA593EUL, 0x82430E88UL, 65f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x8CEE8619UL, 0x456F9FB4UL, 0x7D84A5C3UL, 0x3B8B5EBEUL, 66f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xE06F75D8UL, 0x85C12073UL, 0x401A449FUL, 0x56C16AA6UL, 67f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x4ED3AA62UL, 0x363F7706UL, 0x1BFEDF72UL, 0x429B023DUL, 68f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x37D0D724UL, 0xD00A1248UL, 0xDB0FEAD3UL, 0x49F1C09BUL, 69f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x075372C9UL, 0x80991B7BUL, 0x25D479D8UL, 0xF6E8DEF7UL, 70f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xE3FE501AUL, 0xB6794C3BUL, 0x976CE0BDUL, 0x04C006BAUL, 71f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xC1A94FB6UL, 0x409F60C4UL, 0x5E5C9EC2UL, 0x196A2463UL, 72f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x68FB6FAFUL, 0x3E6C53B5UL, 0x1339B2EBUL, 0x3B52EC6FUL, 73f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x6DFC511FUL, 0x9B30952CUL, 0xCC814544UL, 0xAF5EBD09UL, 74f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xBEE3D004UL, 0xDE334AFDUL, 0x660F2807UL, 0x192E4BB3UL, 75f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xC0CBA857UL, 0x45C8740FUL, 0xD20B5F39UL, 0xB9D3FBDBUL, 76f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x5579C0BDUL, 0x1A60320AUL, 0xD6A100C6UL, 0x402C7279UL, 77f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x679F25FEUL, 0xFB1FA3CCUL, 0x8EA5E9F8UL, 0xDB3222F8UL, 78f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x3C7516DFUL, 0xFD616B15UL, 0x2F501EC8UL, 0xAD0552ABUL, 79f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x323DB5FAUL, 0xFD238760UL, 0x53317B48UL, 0x3E00DF82UL, 80f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x9E5C57BBUL, 0xCA6F8CA0UL, 0x1A87562EUL, 0xDF1769DBUL, 81f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xD542A8F6UL, 0x287EFFC3UL, 0xAC6732C6UL, 0x8C4F5573UL, 82f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x695B27B0UL, 0xBBCA58C8UL, 0xE1FFA35DUL, 0xB8F011A0UL, 83f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x10FA3D98UL, 0xFD2183B8UL, 0x4AFCB56CUL, 0x2DD1D35BUL, 84f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x9A53E479UL, 0xB6F84565UL, 0xD28E49BCUL, 0x4BFB9790UL, 85f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xE1DDF2DAUL, 0xA4CB7E33UL, 0x62FB1341UL, 0xCEE4C6E8UL, 86f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xEF20CADAUL, 0x36774C01UL, 0xD07E9EFEUL, 0x2BF11FB4UL, 87f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x95DBDA4DUL, 0xAE909198UL, 0xEAAD8E71UL, 0x6B93D5A0UL, 88f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xD08ED1D0UL, 0xAFC725E0UL, 0x8E3C5B2FUL, 0x8E7594B7UL, 89f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x8FF6E2FBUL, 0xF2122B64UL, 0x8888B812UL, 0x900DF01CUL, 90f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x4FAD5EA0UL, 0x688FC31CUL, 0xD1CFF191UL, 0xB3A8C1ADUL, 91f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x2F2F2218UL, 0xBE0E1777UL, 0xEA752DFEUL, 0x8B021FA1UL, 92f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xE5A0CC0FUL, 0xB56F74E8UL, 0x18ACF3D6UL, 0xCE89E299UL, 93f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xB4A84FE0UL, 0xFD13E0B7UL, 0x7CC43B81UL, 0xD2ADA8D9UL, 94f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x165FA266UL, 0x80957705UL, 0x93CC7314UL, 0x211A1477UL, 95f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xE6AD2065UL, 0x77B5FA86UL, 0xC75442F5UL, 0xFB9D35CFUL, 96f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xEBCDAF0CUL, 0x7B3E89A0UL, 0xD6411BD3UL, 0xAE1E7E49UL, 97f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x00250E2DUL, 0x2071B35EUL, 0x226800BBUL, 0x57B8E0AFUL, 98f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x2464369BUL, 0xF009B91EUL, 0x5563911DUL, 0x59DFA6AAUL, 99f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x78C14389UL, 0xD95A537FUL, 0x207D5BA2UL, 0x02E5B9C5UL, 100f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x83260376UL, 0x6295CFA9UL, 0x11C81968UL, 0x4E734A41UL, 101f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xB3472DCAUL, 0x7B14A94AUL, 0x1B510052UL, 0x9A532915UL, 102f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xD60F573FUL, 0xBC9BC6E4UL, 0x2B60A476UL, 0x81E67400UL, 103f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x08BA6FB5UL, 0x571BE91FUL, 0xF296EC6BUL, 0x2A0DD915UL, 104f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xB6636521UL, 0xE7B9F9B6UL, 0xFF34052EUL, 0xC5855664UL, 105f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x53B02D5DUL, 0xA99F8FA1UL, 0x08BA4799UL, 0x6E85076AUL }, 106f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 0x4B7A70E9UL, 0xB5B32944UL, 0xDB75092EUL, 0xC4192623UL, 107f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xAD6EA6B0UL, 0x49A7DF7DUL, 0x9CEE60B8UL, 0x8FEDB266UL, 108f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xECAA8C71UL, 0x699A17FFUL, 0x5664526CUL, 0xC2B19EE1UL, 109f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x193602A5UL, 0x75094C29UL, 0xA0591340UL, 0xE4183A3EUL, 110f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x3F54989AUL, 0x5B429D65UL, 0x6B8FE4D6UL, 0x99F73FD6UL, 111f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xA1D29C07UL, 0xEFE830F5UL, 0x4D2D38E6UL, 0xF0255DC1UL, 112f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x4CDD2086UL, 0x8470EB26UL, 0x6382E9C6UL, 0x021ECC5EUL, 113f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x09686B3FUL, 0x3EBAEFC9UL, 0x3C971814UL, 0x6B6A70A1UL, 114f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x687F3584UL, 0x52A0E286UL, 0xB79C5305UL, 0xAA500737UL, 115f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x3E07841CUL, 0x7FDEAE5CUL, 0x8E7D44ECUL, 0x5716F2B8UL, 116f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xB03ADA37UL, 0xF0500C0DUL, 0xF01C1F04UL, 0x0200B3FFUL, 117f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xAE0CF51AUL, 0x3CB574B2UL, 0x25837A58UL, 0xDC0921BDUL, 118f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xD19113F9UL, 0x7CA92FF6UL, 0x94324773UL, 0x22F54701UL, 119f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x3AE5E581UL, 0x37C2DADCUL, 0xC8B57634UL, 0x9AF3DDA7UL, 120f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xA9446146UL, 0x0FD0030EUL, 0xECC8C73EUL, 0xA4751E41UL, 121f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xE238CD99UL, 0x3BEA0E2FUL, 0x3280BBA1UL, 0x183EB331UL, 122f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x4E548B38UL, 0x4F6DB908UL, 0x6F420D03UL, 0xF60A04BFUL, 123f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x2CB81290UL, 0x24977C79UL, 0x5679B072UL, 0xBCAF89AFUL, 124f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xDE9A771FUL, 0xD9930810UL, 0xB38BAE12UL, 0xDCCF3F2EUL, 125f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x5512721FUL, 0x2E6B7124UL, 0x501ADDE6UL, 0x9F84CD87UL, 126f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x7A584718UL, 0x7408DA17UL, 0xBC9F9ABCUL, 0xE94B7D8CUL, 127f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xEC7AEC3AUL, 0xDB851DFAUL, 0x63094366UL, 0xC464C3D2UL, 128f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xEF1C1847UL, 0x3215D908UL, 0xDD433B37UL, 0x24C2BA16UL, 129f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x12A14D43UL, 0x2A65C451UL, 0x50940002UL, 0x133AE4DDUL, 130f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x71DFF89EUL, 0x10314E55UL, 0x81AC77D6UL, 0x5F11199BUL, 131f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x043556F1UL, 0xD7A3C76BUL, 0x3C11183BUL, 0x5924A509UL, 132f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xF28FE6EDUL, 0x97F1FBFAUL, 0x9EBABF2CUL, 0x1E153C6EUL, 133f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x86E34570UL, 0xEAE96FB1UL, 0x860E5E0AUL, 0x5A3E2AB3UL, 134f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x771FE71CUL, 0x4E3D06FAUL, 0x2965DCB9UL, 0x99E71D0FUL, 135f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x803E89D6UL, 0x5266C825UL, 0x2E4CC978UL, 0x9C10B36AUL, 136f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xC6150EBAUL, 0x94E2EA78UL, 0xA5FC3C53UL, 0x1E0A2DF4UL, 137f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xF2F74EA7UL, 0x361D2B3DUL, 0x1939260FUL, 0x19C27960UL, 138f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x5223A708UL, 0xF71312B6UL, 0xEBADFE6EUL, 0xEAC31F66UL, 139f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xE3BC4595UL, 0xA67BC883UL, 0xB17F37D1UL, 0x018CFF28UL, 140f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xC332DDEFUL, 0xBE6C5AA5UL, 0x65582185UL, 0x68AB9802UL, 141f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xEECEA50FUL, 0xDB2F953BUL, 0x2AEF7DADUL, 0x5B6E2F84UL, 142f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x1521B628UL, 0x29076170UL, 0xECDD4775UL, 0x619F1510UL, 143f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x13CCA830UL, 0xEB61BD96UL, 0x0334FE1EUL, 0xAA0363CFUL, 144f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xB5735C90UL, 0x4C70A239UL, 0xD59E9E0BUL, 0xCBAADE14UL, 145f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xEECC86BCUL, 0x60622CA7UL, 0x9CAB5CABUL, 0xB2F3846EUL, 146f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x648B1EAFUL, 0x19BDF0CAUL, 0xA02369B9UL, 0x655ABB50UL, 147f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x40685A32UL, 0x3C2AB4B3UL, 0x319EE9D5UL, 0xC021B8F7UL, 148f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x9B540B19UL, 0x875FA099UL, 0x95F7997EUL, 0x623D7DA8UL, 149f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xF837889AUL, 0x97E32D77UL, 0x11ED935FUL, 0x16681281UL, 150f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x0E358829UL, 0xC7E61FD6UL, 0x96DEDFA1UL, 0x7858BA99UL, 151f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x57F584A5UL, 0x1B227263UL, 0x9B83C3FFUL, 0x1AC24696UL, 152f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xCDB30AEBUL, 0x532E3054UL, 0x8FD948E4UL, 0x6DBC3128UL, 153f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x58EBF2EFUL, 0x34C6FFEAUL, 0xFE28ED61UL, 0xEE7C3C73UL, 154f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x5D4A14D9UL, 0xE864B7E3UL, 0x42105D14UL, 0x203E13E0UL, 155f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x45EEE2B6UL, 0xA3AAABEAUL, 0xDB6C4F15UL, 0xFACB4FD0UL, 156f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xC742F442UL, 0xEF6ABBB5UL, 0x654F3B1DUL, 0x41CD2105UL, 157f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xD81E799EUL, 0x86854DC7UL, 0xE44B476AUL, 0x3D816250UL, 158f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xCF62A1F2UL, 0x5B8D2646UL, 0xFC8883A0UL, 0xC1C7B6A3UL, 159f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x7F1524C3UL, 0x69CB7492UL, 0x47848A0BUL, 0x5692B285UL, 160f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x095BBF00UL, 0xAD19489DUL, 0x1462B174UL, 0x23820E00UL, 161f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x58428D2AUL, 0x0C55F5EAUL, 0x1DADF43EUL, 0x233F7061UL, 162f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x3372F092UL, 0x8D937E41UL, 0xD65FECF1UL, 0x6C223BDBUL, 163f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x7CDE3759UL, 0xCBEE7460UL, 0x4085F2A7UL, 0xCE77326EUL, 164f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xA6078084UL, 0x19F8509EUL, 0xE8EFD855UL, 0x61D99735UL, 165f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xA969A7AAUL, 0xC50C06C2UL, 0x5A04ABFCUL, 0x800BCADCUL, 166f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x9E447A2EUL, 0xC3453484UL, 0xFDD56705UL, 0x0E1E9EC9UL, 167f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xDB73DBD3UL, 0x105588CDUL, 0x675FDA79UL, 0xE3674340UL, 168f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xC5C43465UL, 0x713E38D8UL, 0x3D28F89EUL, 0xF16DFF20UL, 169f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x153E21E7UL, 0x8FB03D4AUL, 0xE6E39F2BUL, 0xDB83ADF7UL }, 170f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 0xE93D5A68UL, 0x948140F7UL, 0xF64C261CUL, 0x94692934UL, 171f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x411520F7UL, 0x7602D4F7UL, 0xBCF46B2EUL, 0xD4A20068UL, 172f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xD4082471UL, 0x3320F46AUL, 0x43B7D4B7UL, 0x500061AFUL, 173f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x1E39F62EUL, 0x97244546UL, 0x14214F74UL, 0xBF8B8840UL, 174f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x4D95FC1DUL, 0x96B591AFUL, 0x70F4DDD3UL, 0x66A02F45UL, 175f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xBFBC09ECUL, 0x03BD9785UL, 0x7FAC6DD0UL, 0x31CB8504UL, 176f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x96EB27B3UL, 0x55FD3941UL, 0xDA2547E6UL, 0xABCA0A9AUL, 177f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x28507825UL, 0x530429F4UL, 0x0A2C86DAUL, 0xE9B66DFBUL, 178f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x68DC1462UL, 0xD7486900UL, 0x680EC0A4UL, 0x27A18DEEUL, 179f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x4F3FFEA2UL, 0xE887AD8CUL, 0xB58CE006UL, 0x7AF4D6B6UL, 180f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xAACE1E7CUL, 0xD3375FECUL, 0xCE78A399UL, 0x406B2A42UL, 181f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x20FE9E35UL, 0xD9F385B9UL, 0xEE39D7ABUL, 0x3B124E8BUL, 182f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x1DC9FAF7UL, 0x4B6D1856UL, 0x26A36631UL, 0xEAE397B2UL, 183f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x3A6EFA74UL, 0xDD5B4332UL, 0x6841E7F7UL, 0xCA7820FBUL, 184f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xFB0AF54EUL, 0xD8FEB397UL, 0x454056ACUL, 0xBA489527UL, 185f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x55533A3AUL, 0x20838D87UL, 0xFE6BA9B7UL, 0xD096954BUL, 186f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x55A867BCUL, 0xA1159A58UL, 0xCCA92963UL, 0x99E1DB33UL, 187f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xA62A4A56UL, 0x3F3125F9UL, 0x5EF47E1CUL, 0x9029317CUL, 188f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xFDF8E802UL, 0x04272F70UL, 0x80BB155CUL, 0x05282CE3UL, 189f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x95C11548UL, 0xE4C66D22UL, 0x48C1133FUL, 0xC70F86DCUL, 190f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x07F9C9EEUL, 0x41041F0FUL, 0x404779A4UL, 0x5D886E17UL, 191f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x325F51EBUL, 0xD59BC0D1UL, 0xF2BCC18FUL, 0x41113564UL, 192f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x257B7834UL, 0x602A9C60UL, 0xDFF8E8A3UL, 0x1F636C1BUL, 193f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x0E12B4C2UL, 0x02E1329EUL, 0xAF664FD1UL, 0xCAD18115UL, 194f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x6B2395E0UL, 0x333E92E1UL, 0x3B240B62UL, 0xEEBEB922UL, 195f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x85B2A20EUL, 0xE6BA0D99UL, 0xDE720C8CUL, 0x2DA2F728UL, 196f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xD0127845UL, 0x95B794FDUL, 0x647D0862UL, 0xE7CCF5F0UL, 197f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x5449A36FUL, 0x877D48FAUL, 0xC39DFD27UL, 0xF33E8D1EUL, 198f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x0A476341UL, 0x992EFF74UL, 0x3A6F6EABUL, 0xF4F8FD37UL, 199f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xA812DC60UL, 0xA1EBDDF8UL, 0x991BE14CUL, 0xDB6E6B0DUL, 200f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xC67B5510UL, 0x6D672C37UL, 0x2765D43BUL, 0xDCD0E804UL, 201f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xF1290DC7UL, 0xCC00FFA3UL, 0xB5390F92UL, 0x690FED0BUL, 202f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x667B9FFBUL, 0xCEDB7D9CUL, 0xA091CF0BUL, 0xD9155EA3UL, 203f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xBB132F88UL, 0x515BAD24UL, 0x7B9479BFUL, 0x763BD6EBUL, 204f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x37392EB3UL, 0xCC115979UL, 0x8026E297UL, 0xF42E312DUL, 205f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x6842ADA7UL, 0xC66A2B3BUL, 0x12754CCCUL, 0x782EF11CUL, 206f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x6A124237UL, 0xB79251E7UL, 0x06A1BBE6UL, 0x4BFB6350UL, 207f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x1A6B1018UL, 0x11CAEDFAUL, 0x3D25BDD8UL, 0xE2E1C3C9UL, 208f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x44421659UL, 0x0A121386UL, 0xD90CEC6EUL, 0xD5ABEA2AUL, 209f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x64AF674EUL, 0xDA86A85FUL, 0xBEBFE988UL, 0x64E4C3FEUL, 210f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x9DBC8057UL, 0xF0F7C086UL, 0x60787BF8UL, 0x6003604DUL, 211f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xD1FD8346UL, 0xF6381FB0UL, 0x7745AE04UL, 0xD736FCCCUL, 212f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x83426B33UL, 0xF01EAB71UL, 0xB0804187UL, 0x3C005E5FUL, 213f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x77A057BEUL, 0xBDE8AE24UL, 0x55464299UL, 0xBF582E61UL, 214f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x4E58F48FUL, 0xF2DDFDA2UL, 0xF474EF38UL, 0x8789BDC2UL, 215f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x5366F9C3UL, 0xC8B38E74UL, 0xB475F255UL, 0x46FCD9B9UL, 216f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x7AEB2661UL, 0x8B1DDF84UL, 0x846A0E79UL, 0x915F95E2UL, 217f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x466E598EUL, 0x20B45770UL, 0x8CD55591UL, 0xC902DE4CUL, 218f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xB90BACE1UL, 0xBB8205D0UL, 0x11A86248UL, 0x7574A99EUL, 219f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xB77F19B6UL, 0xE0A9DC09UL, 0x662D09A1UL, 0xC4324633UL, 220f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xE85A1F02UL, 0x09F0BE8CUL, 0x4A99A025UL, 0x1D6EFE10UL, 221f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x1AB93D1DUL, 0x0BA5A4DFUL, 0xA186F20FUL, 0x2868F169UL, 222f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xDCB7DA83UL, 0x573906FEUL, 0xA1E2CE9BUL, 0x4FCD7F52UL, 223f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x50115E01UL, 0xA70683FAUL, 0xA002B5C4UL, 0x0DE6D027UL, 224f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x9AF88C27UL, 0x773F8641UL, 0xC3604C06UL, 0x61A806B5UL, 225f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xF0177A28UL, 0xC0F586E0UL, 0x006058AAUL, 0x30DC7D62UL, 226f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x11E69ED7UL, 0x2338EA63UL, 0x53C2DD94UL, 0xC2C21634UL, 227f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xBBCBEE56UL, 0x90BCB6DEUL, 0xEBFC7DA1UL, 0xCE591D76UL, 228f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x6F05E409UL, 0x4B7C0188UL, 0x39720A3DUL, 0x7C927C24UL, 229f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x86E3725FUL, 0x724D9DB9UL, 0x1AC15BB4UL, 0xD39EB8FCUL, 230f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xED545578UL, 0x08FCA5B5UL, 0xD83D7CD3UL, 0x4DAD0FC4UL, 231f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x1E50EF5EUL, 0xB161E6F8UL, 0xA28514D9UL, 0x6C51133CUL, 232f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x6FD5C7E7UL, 0x56E14EC4UL, 0x362ABFCEUL, 0xDDC6C837UL, 233f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xD79A3234UL, 0x92638212UL, 0x670EFA8EUL, 0x406000E0UL }, 234f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 0x3A39CE37UL, 0xD3FAF5CFUL, 0xABC27737UL, 0x5AC52D1BUL, 235f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x5CB0679EUL, 0x4FA33742UL, 0xD3822740UL, 0x99BC9BBEUL, 236f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xD5118E9DUL, 0xBF0F7315UL, 0xD62D1C7EUL, 0xC700C47BUL, 237f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xB78C1B6BUL, 0x21A19045UL, 0xB26EB1BEUL, 0x6A366EB4UL, 238f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x5748AB2FUL, 0xBC946E79UL, 0xC6A376D2UL, 0x6549C2C8UL, 239f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x530FF8EEUL, 0x468DDE7DUL, 0xD5730A1DUL, 0x4CD04DC6UL, 240f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x2939BBDBUL, 0xA9BA4650UL, 0xAC9526E8UL, 0xBE5EE304UL, 241f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xA1FAD5F0UL, 0x6A2D519AUL, 0x63EF8CE2UL, 0x9A86EE22UL, 242f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xC089C2B8UL, 0x43242EF6UL, 0xA51E03AAUL, 0x9CF2D0A4UL, 243f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x83C061BAUL, 0x9BE96A4DUL, 0x8FE51550UL, 0xBA645BD6UL, 244f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x2826A2F9UL, 0xA73A3AE1UL, 0x4BA99586UL, 0xEF5562E9UL, 245f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xC72FEFD3UL, 0xF752F7DAUL, 0x3F046F69UL, 0x77FA0A59UL, 246f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x80E4A915UL, 0x87B08601UL, 0x9B09E6ADUL, 0x3B3EE593UL, 247f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xE990FD5AUL, 0x9E34D797UL, 0x2CF0B7D9UL, 0x022B8B51UL, 248f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x96D5AC3AUL, 0x017DA67DUL, 0xD1CF3ED6UL, 0x7C7D2D28UL, 249f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x1F9F25CFUL, 0xADF2B89BUL, 0x5AD6B472UL, 0x5A88F54CUL, 250f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xE029AC71UL, 0xE019A5E6UL, 0x47B0ACFDUL, 0xED93FA9BUL, 251f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xE8D3C48DUL, 0x283B57CCUL, 0xF8D56629UL, 0x79132E28UL, 252f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x785F0191UL, 0xED756055UL, 0xF7960E44UL, 0xE3D35E8CUL, 253f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x15056DD4UL, 0x88F46DBAUL, 0x03A16125UL, 0x0564F0BDUL, 254f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xC3EB9E15UL, 0x3C9057A2UL, 0x97271AECUL, 0xA93A072AUL, 255f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x1B3F6D9BUL, 0x1E6321F5UL, 0xF59C66FBUL, 0x26DCF319UL, 256f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x7533D928UL, 0xB155FDF5UL, 0x03563482UL, 0x8ABA3CBBUL, 257f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x28517711UL, 0xC20AD9F8UL, 0xABCC5167UL, 0xCCAD925FUL, 258f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x4DE81751UL, 0x3830DC8EUL, 0x379D5862UL, 0x9320F991UL, 259f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xEA7A90C2UL, 0xFB3E7BCEUL, 0x5121CE64UL, 0x774FBE32UL, 260f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xA8B6E37EUL, 0xC3293D46UL, 0x48DE5369UL, 0x6413E680UL, 261f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xA2AE0810UL, 0xDD6DB224UL, 0x69852DFDUL, 0x09072166UL, 262f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xB39A460AUL, 0x6445C0DDUL, 0x586CDECFUL, 0x1C20C8AEUL, 263f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x5BBEF7DDUL, 0x1B588D40UL, 0xCCD2017FUL, 0x6BB4E3BBUL, 264f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xDDA26A7EUL, 0x3A59FF45UL, 0x3E350A44UL, 0xBCB4CDD5UL, 265f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x72EACEA8UL, 0xFA6484BBUL, 0x8D6612AEUL, 0xBF3C6F47UL, 266f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xD29BE463UL, 0x542F5D9EUL, 0xAEC2771BUL, 0xF64E6370UL, 267f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x740E0D8DUL, 0xE75B1357UL, 0xF8721671UL, 0xAF537D5DUL, 268f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x4040CB08UL, 0x4EB4E2CCUL, 0x34D2466AUL, 0x0115AF84UL, 269f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xE1B00428UL, 0x95983A1DUL, 0x06B89FB4UL, 0xCE6EA048UL, 270f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x6F3F3B82UL, 0x3520AB82UL, 0x011A1D4BUL, 0x277227F8UL, 271f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x611560B1UL, 0xE7933FDCUL, 0xBB3A792BUL, 0x344525BDUL, 272f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xA08839E1UL, 0x51CE794BUL, 0x2F32C9B7UL, 0xA01FBAC9UL, 273f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xE01CC87EUL, 0xBCC7D1F6UL, 0xCF0111C3UL, 0xA1E8AAC7UL, 274f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x1A908749UL, 0xD44FBD9AUL, 0xD0DADECBUL, 0xD50ADA38UL, 275f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x0339C32AUL, 0xC6913667UL, 0x8DF9317CUL, 0xE0B12B4FUL, 276f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xF79E59B7UL, 0x43F5BB3AUL, 0xF2D519FFUL, 0x27D9459CUL, 277f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xBF97222CUL, 0x15E6FC2AUL, 0x0F91FC71UL, 0x9B941525UL, 278f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xFAE59361UL, 0xCEB69CEBUL, 0xC2A86459UL, 0x12BAA8D1UL, 279f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xB6C1075EUL, 0xE3056A0CUL, 0x10D25065UL, 0xCB03A442UL, 280f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xE0EC6E0EUL, 0x1698DB3BUL, 0x4C98A0BEUL, 0x3278E964UL, 281f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x9F1F9532UL, 0xE0D392DFUL, 0xD3A0342BUL, 0x8971F21EUL, 282f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x1B0A7441UL, 0x4BA3348CUL, 0xC5BE7120UL, 0xC37632D8UL, 283f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xDF359F8DUL, 0x9B992F2EUL, 0xE60B6F47UL, 0x0FE3F11DUL, 284f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xE54CDA54UL, 0x1EDAD891UL, 0xCE6279CFUL, 0xCD3E7E6FUL, 285f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x1618B166UL, 0xFD2C1D05UL, 0x848FD2C5UL, 0xF6FB2299UL, 286f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xF523F357UL, 0xA6327623UL, 0x93A83531UL, 0x56CCCD02UL, 287f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xACF08162UL, 0x5A75EBB5UL, 0x6E163697UL, 0x88D273CCUL, 288f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xDE966292UL, 0x81B949D0UL, 0x4C50901BUL, 0x71C65614UL, 289f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xE6C6C7BDUL, 0x327A140AUL, 0x45E1D006UL, 0xC3F27B9AUL, 290f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xC9AA53FDUL, 0x62A80F00UL, 0xBB25BFE2UL, 0x35BDD2F6UL, 291f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x71126905UL, 0xB2040222UL, 0xB6CBCF7CUL, 0xCD769C2BUL, 292f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x53113EC0UL, 0x1640E3D3UL, 0x38ABBD60UL, 0x2547ADF0UL, 293f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xBA38209CUL, 0xF746CE76UL, 0x77AFA1C5UL, 0x20756060UL, 294f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x85CBFE4EUL, 0x8AE88DD8UL, 0x7AAAF9B0UL, 0x4CF9AA7EUL, 295f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x1948C25CUL, 0x02FB8A8CUL, 0x01C36AE4UL, 0xD6EBE1F9UL, 296f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0x90D4F869UL, 0xA65CDEA0UL, 0x3F09252DUL, 0xC208E69FUL, 297f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 0xB74E6132UL, 0xCE77E25BUL, 0x578FDFE3UL, 0x3AC372E6UL } 298f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}; 299f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 300f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /** 301f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project Initialize the Blowfish block cipher 302f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @param key The symmetric key you wish to pass 303f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @param keylen The key length in bytes 304f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @param num_rounds The number of rounds desired (0 for default) 305f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @param skey The key in as scheduled by this function. 306f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @return CRYPT_OK if successful 307f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project */ 308f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint blowfish_setup(const unsigned char *key, int keylen, int num_rounds, 309f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project symmetric_key *skey) 310f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{ 311f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project ulong32 x, y, z, A; 312f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project unsigned char B[8]; 313f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 314f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project LTC_ARGCHK(key != NULL); 315f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project LTC_ARGCHK(skey != NULL); 316f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 317f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* check key length */ 318f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (keylen < 8 || keylen > 56) { 319f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return CRYPT_INVALID_KEYSIZE; 320f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 321f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 322f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* check rounds */ 323f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (num_rounds != 0 && num_rounds != 16) { 324f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return CRYPT_INVALID_ROUNDS; 325f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 326f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 327f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* load in key bytes (Supplied by David Hopwood) */ 328f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (x = y = 0; x < 18; x++) { 329f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project A = 0; 330f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (z = 0; z < 4; z++) { 331f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project A = (A << 8) | ((ulong32)key[y++] & 255); 332f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (y == (ulong32)keylen) { 333f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project y = 0; 334f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 335f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 336f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project skey->blowfish.K[x] = ORIG_P[x] ^ A; 337f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 338f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 339f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* copy sboxes */ 340f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (x = 0; x < 4; x++) { 341f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (y = 0; y < 256; y++) { 342f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project skey->blowfish.S[x][y] = ORIG_S[x][y]; 343f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 344f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 345f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 346f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* encrypt K array */ 347f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (x = 0; x < 8; x++) { 348f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project B[x] = 0; 349f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 350f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 351f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (x = 0; x < 18; x += 2) { 352f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* encrypt it */ 353f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project blowfish_ecb_encrypt(B, B, skey); 354f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* copy it */ 355f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project LOAD32H(skey->blowfish.K[x], &B[0]); 356f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project LOAD32H(skey->blowfish.K[x+1], &B[4]); 357f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 358f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 359f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* encrypt S array */ 360f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (x = 0; x < 4; x++) { 361f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (y = 0; y < 256; y += 2) { 362f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* encrypt it */ 363f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project blowfish_ecb_encrypt(B, B, skey); 364f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* copy it */ 365f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project LOAD32H(skey->blowfish.S[x][y], &B[0]); 366f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project LOAD32H(skey->blowfish.S[x][y+1], &B[4]); 367f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 368f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 369f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 370f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_CLEAN_STACK 371f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project zeromem(B, sizeof(B)); 372f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 373f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 374f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return CRYPT_OK; 375f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 376f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 377f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifndef __GNUC__ 378f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define F(x) ((S1[byte(x,3)] + S2[byte(x,2)]) ^ S3[byte(x,1)]) + S4[byte(x,0)] 379f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#else 380f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define F(x) ((skey->blowfish.S[0][byte(x,3)] + skey->blowfish.S[1][byte(x,2)]) ^ skey->blowfish.S[2][byte(x,1)]) + skey->blowfish.S[3][byte(x,0)] 381f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 382f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 383f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/** 384f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project Encrypts a block of text with Blowfish 385f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @param pt The input plaintext (8 bytes) 386f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @param ct The output ciphertext (8 bytes) 387f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @param skey The key as scheduled 388f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @return CRYPT_OK if successful 389f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project*/ 390f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_CLEAN_STACK 391f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int _blowfish_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey) 392f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#else 393f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint blowfish_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey) 394f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 395f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{ 396f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project ulong32 L, R; 397f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project int r; 398f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifndef __GNUC__ 399f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project ulong32 *S1, *S2, *S3, *S4; 400f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 401f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 402f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project LTC_ARGCHK(pt != NULL); 403f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project LTC_ARGCHK(ct != NULL); 404f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project LTC_ARGCHK(skey != NULL); 405f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 406f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifndef __GNUC__ 407f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project S1 = skey->blowfish.S[0]; 408f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project S2 = skey->blowfish.S[1]; 409f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project S3 = skey->blowfish.S[2]; 410f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project S4 = skey->blowfish.S[3]; 411f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 412f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 413f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* load it */ 414f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project LOAD32H(L, &pt[0]); 415f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project LOAD32H(R, &pt[4]); 416f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 417f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* do 16 rounds */ 418f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (r = 0; r < 16; ) { 419f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project L ^= skey->blowfish.K[r++]; R ^= F(L); 420f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project R ^= skey->blowfish.K[r++]; L ^= F(R); 421f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project L ^= skey->blowfish.K[r++]; R ^= F(L); 422f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project R ^= skey->blowfish.K[r++]; L ^= F(R); 423f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 424f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 425f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* last keying */ 426f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project R ^= skey->blowfish.K[17]; 427f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project L ^= skey->blowfish.K[16]; 428f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 429f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* store */ 430f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project STORE32H(R, &ct[0]); 431f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project STORE32H(L, &ct[4]); 432f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 433f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return CRYPT_OK; 434f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 435f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 436f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_CLEAN_STACK 437f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint blowfish_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey) 438f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{ 439f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project int err = _blowfish_ecb_encrypt(pt, ct, skey); 440f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project burn_stack(sizeof(ulong32) * 2 + sizeof(int)); 441f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return err; 442f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 443f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 444f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 445f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/** 446f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project Decrypts a block of text with Blowfish 447f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @param ct The input ciphertext (8 bytes) 448f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @param pt The output plaintext (8 bytes) 449f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @param skey The key as scheduled 450f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @return CRYPT_OK if successful 451f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project*/ 452f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_CLEAN_STACK 453f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int _blowfish_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey) 454f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#else 455f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint blowfish_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey) 456f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 457f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{ 458f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project ulong32 L, R; 459f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project int r; 460f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifndef __GNUC__ 461f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project ulong32 *S1, *S2, *S3, *S4; 462f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 463f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 464f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project LTC_ARGCHK(pt != NULL); 465f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project LTC_ARGCHK(ct != NULL); 466f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project LTC_ARGCHK(skey != NULL); 467f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 468f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifndef __GNUC__ 469f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project S1 = skey->blowfish.S[0]; 470f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project S2 = skey->blowfish.S[1]; 471f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project S3 = skey->blowfish.S[2]; 472f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project S4 = skey->blowfish.S[3]; 473f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 474f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 475f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* load it */ 476f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project LOAD32H(R, &ct[0]); 477f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project LOAD32H(L, &ct[4]); 478f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 479f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* undo last keying */ 480f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project R ^= skey->blowfish.K[17]; 481f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project L ^= skey->blowfish.K[16]; 482f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 483f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* do 16 rounds */ 484f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (r = 15; r > 0; ) { 485f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project L ^= F(R); R ^= skey->blowfish.K[r--]; 486f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project R ^= F(L); L ^= skey->blowfish.K[r--]; 487f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project L ^= F(R); R ^= skey->blowfish.K[r--]; 488f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project R ^= F(L); L ^= skey->blowfish.K[r--]; 489f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 490f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 491f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* store */ 492f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project STORE32H(L, &pt[0]); 493f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project STORE32H(R, &pt[4]); 494f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return CRYPT_OK; 495f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 496f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 497f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_CLEAN_STACK 498f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint blowfish_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey) 499f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{ 500f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project int err = _blowfish_ecb_decrypt(ct, pt, skey); 501f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project burn_stack(sizeof(ulong32) * 2 + sizeof(int)); 502f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return err; 503f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 504f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 505f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 506f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 507f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/** 508f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project Performs a self-test of the Blowfish block cipher 509f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @return CRYPT_OK if functional, CRYPT_NOP if self-test has been disabled 510f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project*/ 511f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint blowfish_test(void) 512f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{ 513f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project #ifndef LTC_TEST 514f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return CRYPT_NOP; 515f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project #else 516f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project int err; 517f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project symmetric_key key; 518f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project static const struct { 519f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project unsigned char key[8], pt[8], ct[8]; 520f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } tests[] = { 521f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 522f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 523f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 524f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 0x4E, 0xF9, 0x97, 0x45, 0x61, 0x98, 0xDD, 0x78} 525f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project }, 526f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 527f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, 528f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, 529f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 0x51, 0x86, 0x6F, 0xD5, 0xB8, 0x5E, 0xCB, 0x8A} 530f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project }, 531f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 532f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 533f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}, 534f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 0x7D, 0x85, 0x6F, 0x9A, 0x61, 0x30, 0x63, 0xF2} 535f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 536f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project }; 537f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project unsigned char tmp[2][8]; 538f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project int x, y; 539f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 540f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (x = 0; x < (int)(sizeof(tests) / sizeof(tests[0])); x++) { 541f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* setup key */ 542f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = blowfish_setup(tests[x].key, 8, 16, &key)) != CRYPT_OK) { 543f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return err; 544f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 545f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 546f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* encrypt and decrypt */ 547f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project blowfish_ecb_encrypt(tests[x].pt, tmp[0], &key); 548f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project blowfish_ecb_decrypt(tmp[0], tmp[1], &key); 549f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 550f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* compare */ 551f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((XMEMCMP(tmp[0], tests[x].ct, 8) != 0) || (XMEMCMP(tmp[1], tests[x].pt, 8) != 0)) { 552f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return CRYPT_FAIL_TESTVECTOR; 553f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 554f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 555f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* now see if we can encrypt all zero bytes 1000 times, decrypt and come back where we started */ 556f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (y = 0; y < 8; y++) tmp[0][y] = 0; 557f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (y = 0; y < 1000; y++) blowfish_ecb_encrypt(tmp[0], tmp[0], &key); 558f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (y = 0; y < 1000; y++) blowfish_ecb_decrypt(tmp[0], tmp[0], &key); 559f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (y = 0; y < 8; y++) if (tmp[0][y] != 0) return CRYPT_FAIL_TESTVECTOR; 560f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 561f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return CRYPT_OK; 562f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project #endif 563f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 564f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 565f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/** Terminate the context 566f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @param skey The scheduled key 567f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project*/ 568f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid blowfish_done(symmetric_key *skey) 569f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{ 570f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 571f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 572f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/** 573f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project Gets suitable key size 574f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @param keysize [in/out] The length of the recommended key (in bytes). This function will store the suitable size back in this variable. 575f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @return CRYPT_OK if the input key size is acceptable. 576f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project*/ 577f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint blowfish_keysize(int *keysize) 578f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{ 579f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project LTC_ARGCHK(keysize != NULL); 580f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 581f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (*keysize < 8) { 582f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return CRYPT_INVALID_KEYSIZE; 583f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } else if (*keysize > 56) { 584f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *keysize = 56; 585f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 586f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return CRYPT_OK; 587f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 588f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 589f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 590f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 591f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 592f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Source: /cvs/libtom/libtomcrypt/src/ciphers/blowfish.c,v $ */ 593f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Revision: 1.12 $ */ 594f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Date: 2006/11/08 23:01:06 $ */ 595