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