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#include "tomcrypt.h" 12f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 13f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/** 14f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @file ltc_ecc_fp_mulmod.c 15f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project ECC Crypto, Tom St Denis 16f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project*/ 17f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 18f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#if defined(MECC) && defined(MECC_FP) 19f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include <limits.h> 20f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 21f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* number of entries in the cache */ 22f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifndef FP_ENTRIES 23f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define FP_ENTRIES 16 24f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 25f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 26f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* number of bits in LUT */ 27f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifndef FP_LUT 28f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define FP_LUT 8U 29f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 30f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 31f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#if (FP_LUT > 12) || (FP_LUT < 2) 32f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project #error FP_LUT must be between 2 and 12 inclusively 33f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 34f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 35f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/** Our FP cache */ 36f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic struct { 37f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project ecc_point *g, /* cached COPY of base point */ 38f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *LUT[1U<<FP_LUT]; /* fixed point lookup */ 39f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project void *mu; /* copy of the montgomery constant */ 40f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project int lru_count; /* amount of times this entry has been used */ 41f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} fp_cache[FP_ENTRIES]; 42f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 43f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source ProjectLTC_MUTEX_GLOBAL(ltc_ecc_fp_lock) 44f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 45f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* simple table to help direct the generation of the LUT */ 46f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic const struct { 47f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project int ham, terma, termb; 48f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} lut_orders[] = { 49f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 0, 0, 0 }, { 1, 0, 0 }, { 1, 0, 0 }, { 2, 1, 2 }, { 1, 0, 0 }, { 2, 1, 4 }, { 2, 2, 4 }, { 3, 3, 4 }, 50f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 1, 0, 0 }, { 2, 1, 8 }, { 2, 2, 8 }, { 3, 3, 8 }, { 2, 4, 8 }, { 3, 5, 8 }, { 3, 6, 8 }, { 4, 7, 8 }, 51f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 1, 0, 0 }, { 2, 1, 16 }, { 2, 2, 16 }, { 3, 3, 16 }, { 2, 4, 16 }, { 3, 5, 16 }, { 3, 6, 16 }, { 4, 7, 16 }, 52f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 2, 8, 16 }, { 3, 9, 16 }, { 3, 10, 16 }, { 4, 11, 16 }, { 3, 12, 16 }, { 4, 13, 16 }, { 4, 14, 16 }, { 5, 15, 16 }, 53f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 1, 0, 0 }, { 2, 1, 32 }, { 2, 2, 32 }, { 3, 3, 32 }, { 2, 4, 32 }, { 3, 5, 32 }, { 3, 6, 32 }, { 4, 7, 32 }, 54f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 2, 8, 32 }, { 3, 9, 32 }, { 3, 10, 32 }, { 4, 11, 32 }, { 3, 12, 32 }, { 4, 13, 32 }, { 4, 14, 32 }, { 5, 15, 32 }, 55f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 2, 16, 32 }, { 3, 17, 32 }, { 3, 18, 32 }, { 4, 19, 32 }, { 3, 20, 32 }, { 4, 21, 32 }, { 4, 22, 32 }, { 5, 23, 32 }, 56f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 24, 32 }, { 4, 25, 32 }, { 4, 26, 32 }, { 5, 27, 32 }, { 4, 28, 32 }, { 5, 29, 32 }, { 5, 30, 32 }, { 6, 31, 32 }, 57f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#if FP_LUT > 6 58f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 1, 0, 0 }, { 2, 1, 64 }, { 2, 2, 64 }, { 3, 3, 64 }, { 2, 4, 64 }, { 3, 5, 64 }, { 3, 6, 64 }, { 4, 7, 64 }, 59f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 2, 8, 64 }, { 3, 9, 64 }, { 3, 10, 64 }, { 4, 11, 64 }, { 3, 12, 64 }, { 4, 13, 64 }, { 4, 14, 64 }, { 5, 15, 64 }, 60f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 2, 16, 64 }, { 3, 17, 64 }, { 3, 18, 64 }, { 4, 19, 64 }, { 3, 20, 64 }, { 4, 21, 64 }, { 4, 22, 64 }, { 5, 23, 64 }, 61f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 24, 64 }, { 4, 25, 64 }, { 4, 26, 64 }, { 5, 27, 64 }, { 4, 28, 64 }, { 5, 29, 64 }, { 5, 30, 64 }, { 6, 31, 64 }, 62f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 2, 32, 64 }, { 3, 33, 64 }, { 3, 34, 64 }, { 4, 35, 64 }, { 3, 36, 64 }, { 4, 37, 64 }, { 4, 38, 64 }, { 5, 39, 64 }, 63f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 40, 64 }, { 4, 41, 64 }, { 4, 42, 64 }, { 5, 43, 64 }, { 4, 44, 64 }, { 5, 45, 64 }, { 5, 46, 64 }, { 6, 47, 64 }, 64f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 48, 64 }, { 4, 49, 64 }, { 4, 50, 64 }, { 5, 51, 64 }, { 4, 52, 64 }, { 5, 53, 64 }, { 5, 54, 64 }, { 6, 55, 64 }, 65f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 56, 64 }, { 5, 57, 64 }, { 5, 58, 64 }, { 6, 59, 64 }, { 5, 60, 64 }, { 6, 61, 64 }, { 6, 62, 64 }, { 7, 63, 64 }, 66f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#if FP_LUT > 7 67f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 1, 0, 0 }, { 2, 1, 128 }, { 2, 2, 128 }, { 3, 3, 128 }, { 2, 4, 128 }, { 3, 5, 128 }, { 3, 6, 128 }, { 4, 7, 128 }, 68f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 2, 8, 128 }, { 3, 9, 128 }, { 3, 10, 128 }, { 4, 11, 128 }, { 3, 12, 128 }, { 4, 13, 128 }, { 4, 14, 128 }, { 5, 15, 128 }, 69f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 2, 16, 128 }, { 3, 17, 128 }, { 3, 18, 128 }, { 4, 19, 128 }, { 3, 20, 128 }, { 4, 21, 128 }, { 4, 22, 128 }, { 5, 23, 128 }, 70f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 24, 128 }, { 4, 25, 128 }, { 4, 26, 128 }, { 5, 27, 128 }, { 4, 28, 128 }, { 5, 29, 128 }, { 5, 30, 128 }, { 6, 31, 128 }, 71f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 2, 32, 128 }, { 3, 33, 128 }, { 3, 34, 128 }, { 4, 35, 128 }, { 3, 36, 128 }, { 4, 37, 128 }, { 4, 38, 128 }, { 5, 39, 128 }, 72f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 40, 128 }, { 4, 41, 128 }, { 4, 42, 128 }, { 5, 43, 128 }, { 4, 44, 128 }, { 5, 45, 128 }, { 5, 46, 128 }, { 6, 47, 128 }, 73f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 48, 128 }, { 4, 49, 128 }, { 4, 50, 128 }, { 5, 51, 128 }, { 4, 52, 128 }, { 5, 53, 128 }, { 5, 54, 128 }, { 6, 55, 128 }, 74f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 56, 128 }, { 5, 57, 128 }, { 5, 58, 128 }, { 6, 59, 128 }, { 5, 60, 128 }, { 6, 61, 128 }, { 6, 62, 128 }, { 7, 63, 128 }, 75f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 2, 64, 128 }, { 3, 65, 128 }, { 3, 66, 128 }, { 4, 67, 128 }, { 3, 68, 128 }, { 4, 69, 128 }, { 4, 70, 128 }, { 5, 71, 128 }, 76f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 72, 128 }, { 4, 73, 128 }, { 4, 74, 128 }, { 5, 75, 128 }, { 4, 76, 128 }, { 5, 77, 128 }, { 5, 78, 128 }, { 6, 79, 128 }, 77f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 80, 128 }, { 4, 81, 128 }, { 4, 82, 128 }, { 5, 83, 128 }, { 4, 84, 128 }, { 5, 85, 128 }, { 5, 86, 128 }, { 6, 87, 128 }, 78f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 88, 128 }, { 5, 89, 128 }, { 5, 90, 128 }, { 6, 91, 128 }, { 5, 92, 128 }, { 6, 93, 128 }, { 6, 94, 128 }, { 7, 95, 128 }, 79f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 96, 128 }, { 4, 97, 128 }, { 4, 98, 128 }, { 5, 99, 128 }, { 4, 100, 128 }, { 5, 101, 128 }, { 5, 102, 128 }, { 6, 103, 128 }, 80f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 104, 128 }, { 5, 105, 128 }, { 5, 106, 128 }, { 6, 107, 128 }, { 5, 108, 128 }, { 6, 109, 128 }, { 6, 110, 128 }, { 7, 111, 128 }, 81f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 112, 128 }, { 5, 113, 128 }, { 5, 114, 128 }, { 6, 115, 128 }, { 5, 116, 128 }, { 6, 117, 128 }, { 6, 118, 128 }, { 7, 119, 128 }, 82f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 120, 128 }, { 6, 121, 128 }, { 6, 122, 128 }, { 7, 123, 128 }, { 6, 124, 128 }, { 7, 125, 128 }, { 7, 126, 128 }, { 8, 127, 128 }, 83f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#if FP_LUT > 8 84f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 1, 0, 0 }, { 2, 1, 256 }, { 2, 2, 256 }, { 3, 3, 256 }, { 2, 4, 256 }, { 3, 5, 256 }, { 3, 6, 256 }, { 4, 7, 256 }, 85f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 2, 8, 256 }, { 3, 9, 256 }, { 3, 10, 256 }, { 4, 11, 256 }, { 3, 12, 256 }, { 4, 13, 256 }, { 4, 14, 256 }, { 5, 15, 256 }, 86f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 2, 16, 256 }, { 3, 17, 256 }, { 3, 18, 256 }, { 4, 19, 256 }, { 3, 20, 256 }, { 4, 21, 256 }, { 4, 22, 256 }, { 5, 23, 256 }, 87f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 24, 256 }, { 4, 25, 256 }, { 4, 26, 256 }, { 5, 27, 256 }, { 4, 28, 256 }, { 5, 29, 256 }, { 5, 30, 256 }, { 6, 31, 256 }, 88f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 2, 32, 256 }, { 3, 33, 256 }, { 3, 34, 256 }, { 4, 35, 256 }, { 3, 36, 256 }, { 4, 37, 256 }, { 4, 38, 256 }, { 5, 39, 256 }, 89f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 40, 256 }, { 4, 41, 256 }, { 4, 42, 256 }, { 5, 43, 256 }, { 4, 44, 256 }, { 5, 45, 256 }, { 5, 46, 256 }, { 6, 47, 256 }, 90f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 48, 256 }, { 4, 49, 256 }, { 4, 50, 256 }, { 5, 51, 256 }, { 4, 52, 256 }, { 5, 53, 256 }, { 5, 54, 256 }, { 6, 55, 256 }, 91f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 56, 256 }, { 5, 57, 256 }, { 5, 58, 256 }, { 6, 59, 256 }, { 5, 60, 256 }, { 6, 61, 256 }, { 6, 62, 256 }, { 7, 63, 256 }, 92f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 2, 64, 256 }, { 3, 65, 256 }, { 3, 66, 256 }, { 4, 67, 256 }, { 3, 68, 256 }, { 4, 69, 256 }, { 4, 70, 256 }, { 5, 71, 256 }, 93f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 72, 256 }, { 4, 73, 256 }, { 4, 74, 256 }, { 5, 75, 256 }, { 4, 76, 256 }, { 5, 77, 256 }, { 5, 78, 256 }, { 6, 79, 256 }, 94f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 80, 256 }, { 4, 81, 256 }, { 4, 82, 256 }, { 5, 83, 256 }, { 4, 84, 256 }, { 5, 85, 256 }, { 5, 86, 256 }, { 6, 87, 256 }, 95f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 88, 256 }, { 5, 89, 256 }, { 5, 90, 256 }, { 6, 91, 256 }, { 5, 92, 256 }, { 6, 93, 256 }, { 6, 94, 256 }, { 7, 95, 256 }, 96f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 96, 256 }, { 4, 97, 256 }, { 4, 98, 256 }, { 5, 99, 256 }, { 4, 100, 256 }, { 5, 101, 256 }, { 5, 102, 256 }, { 6, 103, 256 }, 97f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 104, 256 }, { 5, 105, 256 }, { 5, 106, 256 }, { 6, 107, 256 }, { 5, 108, 256 }, { 6, 109, 256 }, { 6, 110, 256 }, { 7, 111, 256 }, 98f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 112, 256 }, { 5, 113, 256 }, { 5, 114, 256 }, { 6, 115, 256 }, { 5, 116, 256 }, { 6, 117, 256 }, { 6, 118, 256 }, { 7, 119, 256 }, 99f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 120, 256 }, { 6, 121, 256 }, { 6, 122, 256 }, { 7, 123, 256 }, { 6, 124, 256 }, { 7, 125, 256 }, { 7, 126, 256 }, { 8, 127, 256 }, 100f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 2, 128, 256 }, { 3, 129, 256 }, { 3, 130, 256 }, { 4, 131, 256 }, { 3, 132, 256 }, { 4, 133, 256 }, { 4, 134, 256 }, { 5, 135, 256 }, 101f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 136, 256 }, { 4, 137, 256 }, { 4, 138, 256 }, { 5, 139, 256 }, { 4, 140, 256 }, { 5, 141, 256 }, { 5, 142, 256 }, { 6, 143, 256 }, 102f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 144, 256 }, { 4, 145, 256 }, { 4, 146, 256 }, { 5, 147, 256 }, { 4, 148, 256 }, { 5, 149, 256 }, { 5, 150, 256 }, { 6, 151, 256 }, 103f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 152, 256 }, { 5, 153, 256 }, { 5, 154, 256 }, { 6, 155, 256 }, { 5, 156, 256 }, { 6, 157, 256 }, { 6, 158, 256 }, { 7, 159, 256 }, 104f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 160, 256 }, { 4, 161, 256 }, { 4, 162, 256 }, { 5, 163, 256 }, { 4, 164, 256 }, { 5, 165, 256 }, { 5, 166, 256 }, { 6, 167, 256 }, 105f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 168, 256 }, { 5, 169, 256 }, { 5, 170, 256 }, { 6, 171, 256 }, { 5, 172, 256 }, { 6, 173, 256 }, { 6, 174, 256 }, { 7, 175, 256 }, 106f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 176, 256 }, { 5, 177, 256 }, { 5, 178, 256 }, { 6, 179, 256 }, { 5, 180, 256 }, { 6, 181, 256 }, { 6, 182, 256 }, { 7, 183, 256 }, 107f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 184, 256 }, { 6, 185, 256 }, { 6, 186, 256 }, { 7, 187, 256 }, { 6, 188, 256 }, { 7, 189, 256 }, { 7, 190, 256 }, { 8, 191, 256 }, 108f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 192, 256 }, { 4, 193, 256 }, { 4, 194, 256 }, { 5, 195, 256 }, { 4, 196, 256 }, { 5, 197, 256 }, { 5, 198, 256 }, { 6, 199, 256 }, 109f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 200, 256 }, { 5, 201, 256 }, { 5, 202, 256 }, { 6, 203, 256 }, { 5, 204, 256 }, { 6, 205, 256 }, { 6, 206, 256 }, { 7, 207, 256 }, 110f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 208, 256 }, { 5, 209, 256 }, { 5, 210, 256 }, { 6, 211, 256 }, { 5, 212, 256 }, { 6, 213, 256 }, { 6, 214, 256 }, { 7, 215, 256 }, 111f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 216, 256 }, { 6, 217, 256 }, { 6, 218, 256 }, { 7, 219, 256 }, { 6, 220, 256 }, { 7, 221, 256 }, { 7, 222, 256 }, { 8, 223, 256 }, 112f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 224, 256 }, { 5, 225, 256 }, { 5, 226, 256 }, { 6, 227, 256 }, { 5, 228, 256 }, { 6, 229, 256 }, { 6, 230, 256 }, { 7, 231, 256 }, 113f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 232, 256 }, { 6, 233, 256 }, { 6, 234, 256 }, { 7, 235, 256 }, { 6, 236, 256 }, { 7, 237, 256 }, { 7, 238, 256 }, { 8, 239, 256 }, 114f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 240, 256 }, { 6, 241, 256 }, { 6, 242, 256 }, { 7, 243, 256 }, { 6, 244, 256 }, { 7, 245, 256 }, { 7, 246, 256 }, { 8, 247, 256 }, 115f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 248, 256 }, { 7, 249, 256 }, { 7, 250, 256 }, { 8, 251, 256 }, { 7, 252, 256 }, { 8, 253, 256 }, { 8, 254, 256 }, { 9, 255, 256 }, 116f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#if FP_LUT > 9 117f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 1, 0, 0 }, { 2, 1, 512 }, { 2, 2, 512 }, { 3, 3, 512 }, { 2, 4, 512 }, { 3, 5, 512 }, { 3, 6, 512 }, { 4, 7, 512 }, 118f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 2, 8, 512 }, { 3, 9, 512 }, { 3, 10, 512 }, { 4, 11, 512 }, { 3, 12, 512 }, { 4, 13, 512 }, { 4, 14, 512 }, { 5, 15, 512 }, 119f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 2, 16, 512 }, { 3, 17, 512 }, { 3, 18, 512 }, { 4, 19, 512 }, { 3, 20, 512 }, { 4, 21, 512 }, { 4, 22, 512 }, { 5, 23, 512 }, 120f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 24, 512 }, { 4, 25, 512 }, { 4, 26, 512 }, { 5, 27, 512 }, { 4, 28, 512 }, { 5, 29, 512 }, { 5, 30, 512 }, { 6, 31, 512 }, 121f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 2, 32, 512 }, { 3, 33, 512 }, { 3, 34, 512 }, { 4, 35, 512 }, { 3, 36, 512 }, { 4, 37, 512 }, { 4, 38, 512 }, { 5, 39, 512 }, 122f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 40, 512 }, { 4, 41, 512 }, { 4, 42, 512 }, { 5, 43, 512 }, { 4, 44, 512 }, { 5, 45, 512 }, { 5, 46, 512 }, { 6, 47, 512 }, 123f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 48, 512 }, { 4, 49, 512 }, { 4, 50, 512 }, { 5, 51, 512 }, { 4, 52, 512 }, { 5, 53, 512 }, { 5, 54, 512 }, { 6, 55, 512 }, 124f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 56, 512 }, { 5, 57, 512 }, { 5, 58, 512 }, { 6, 59, 512 }, { 5, 60, 512 }, { 6, 61, 512 }, { 6, 62, 512 }, { 7, 63, 512 }, 125f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 2, 64, 512 }, { 3, 65, 512 }, { 3, 66, 512 }, { 4, 67, 512 }, { 3, 68, 512 }, { 4, 69, 512 }, { 4, 70, 512 }, { 5, 71, 512 }, 126f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 72, 512 }, { 4, 73, 512 }, { 4, 74, 512 }, { 5, 75, 512 }, { 4, 76, 512 }, { 5, 77, 512 }, { 5, 78, 512 }, { 6, 79, 512 }, 127f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 80, 512 }, { 4, 81, 512 }, { 4, 82, 512 }, { 5, 83, 512 }, { 4, 84, 512 }, { 5, 85, 512 }, { 5, 86, 512 }, { 6, 87, 512 }, 128f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 88, 512 }, { 5, 89, 512 }, { 5, 90, 512 }, { 6, 91, 512 }, { 5, 92, 512 }, { 6, 93, 512 }, { 6, 94, 512 }, { 7, 95, 512 }, 129f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 96, 512 }, { 4, 97, 512 }, { 4, 98, 512 }, { 5, 99, 512 }, { 4, 100, 512 }, { 5, 101, 512 }, { 5, 102, 512 }, { 6, 103, 512 }, 130f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 104, 512 }, { 5, 105, 512 }, { 5, 106, 512 }, { 6, 107, 512 }, { 5, 108, 512 }, { 6, 109, 512 }, { 6, 110, 512 }, { 7, 111, 512 }, 131f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 112, 512 }, { 5, 113, 512 }, { 5, 114, 512 }, { 6, 115, 512 }, { 5, 116, 512 }, { 6, 117, 512 }, { 6, 118, 512 }, { 7, 119, 512 }, 132f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 120, 512 }, { 6, 121, 512 }, { 6, 122, 512 }, { 7, 123, 512 }, { 6, 124, 512 }, { 7, 125, 512 }, { 7, 126, 512 }, { 8, 127, 512 }, 133f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 2, 128, 512 }, { 3, 129, 512 }, { 3, 130, 512 }, { 4, 131, 512 }, { 3, 132, 512 }, { 4, 133, 512 }, { 4, 134, 512 }, { 5, 135, 512 }, 134f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 136, 512 }, { 4, 137, 512 }, { 4, 138, 512 }, { 5, 139, 512 }, { 4, 140, 512 }, { 5, 141, 512 }, { 5, 142, 512 }, { 6, 143, 512 }, 135f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 144, 512 }, { 4, 145, 512 }, { 4, 146, 512 }, { 5, 147, 512 }, { 4, 148, 512 }, { 5, 149, 512 }, { 5, 150, 512 }, { 6, 151, 512 }, 136f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 152, 512 }, { 5, 153, 512 }, { 5, 154, 512 }, { 6, 155, 512 }, { 5, 156, 512 }, { 6, 157, 512 }, { 6, 158, 512 }, { 7, 159, 512 }, 137f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 160, 512 }, { 4, 161, 512 }, { 4, 162, 512 }, { 5, 163, 512 }, { 4, 164, 512 }, { 5, 165, 512 }, { 5, 166, 512 }, { 6, 167, 512 }, 138f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 168, 512 }, { 5, 169, 512 }, { 5, 170, 512 }, { 6, 171, 512 }, { 5, 172, 512 }, { 6, 173, 512 }, { 6, 174, 512 }, { 7, 175, 512 }, 139f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 176, 512 }, { 5, 177, 512 }, { 5, 178, 512 }, { 6, 179, 512 }, { 5, 180, 512 }, { 6, 181, 512 }, { 6, 182, 512 }, { 7, 183, 512 }, 140f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 184, 512 }, { 6, 185, 512 }, { 6, 186, 512 }, { 7, 187, 512 }, { 6, 188, 512 }, { 7, 189, 512 }, { 7, 190, 512 }, { 8, 191, 512 }, 141f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 192, 512 }, { 4, 193, 512 }, { 4, 194, 512 }, { 5, 195, 512 }, { 4, 196, 512 }, { 5, 197, 512 }, { 5, 198, 512 }, { 6, 199, 512 }, 142f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 200, 512 }, { 5, 201, 512 }, { 5, 202, 512 }, { 6, 203, 512 }, { 5, 204, 512 }, { 6, 205, 512 }, { 6, 206, 512 }, { 7, 207, 512 }, 143f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 208, 512 }, { 5, 209, 512 }, { 5, 210, 512 }, { 6, 211, 512 }, { 5, 212, 512 }, { 6, 213, 512 }, { 6, 214, 512 }, { 7, 215, 512 }, 144f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 216, 512 }, { 6, 217, 512 }, { 6, 218, 512 }, { 7, 219, 512 }, { 6, 220, 512 }, { 7, 221, 512 }, { 7, 222, 512 }, { 8, 223, 512 }, 145f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 224, 512 }, { 5, 225, 512 }, { 5, 226, 512 }, { 6, 227, 512 }, { 5, 228, 512 }, { 6, 229, 512 }, { 6, 230, 512 }, { 7, 231, 512 }, 146f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 232, 512 }, { 6, 233, 512 }, { 6, 234, 512 }, { 7, 235, 512 }, { 6, 236, 512 }, { 7, 237, 512 }, { 7, 238, 512 }, { 8, 239, 512 }, 147f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 240, 512 }, { 6, 241, 512 }, { 6, 242, 512 }, { 7, 243, 512 }, { 6, 244, 512 }, { 7, 245, 512 }, { 7, 246, 512 }, { 8, 247, 512 }, 148f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 248, 512 }, { 7, 249, 512 }, { 7, 250, 512 }, { 8, 251, 512 }, { 7, 252, 512 }, { 8, 253, 512 }, { 8, 254, 512 }, { 9, 255, 512 }, 149f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 2, 256, 512 }, { 3, 257, 512 }, { 3, 258, 512 }, { 4, 259, 512 }, { 3, 260, 512 }, { 4, 261, 512 }, { 4, 262, 512 }, { 5, 263, 512 }, 150f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 264, 512 }, { 4, 265, 512 }, { 4, 266, 512 }, { 5, 267, 512 }, { 4, 268, 512 }, { 5, 269, 512 }, { 5, 270, 512 }, { 6, 271, 512 }, 151f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 272, 512 }, { 4, 273, 512 }, { 4, 274, 512 }, { 5, 275, 512 }, { 4, 276, 512 }, { 5, 277, 512 }, { 5, 278, 512 }, { 6, 279, 512 }, 152f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 280, 512 }, { 5, 281, 512 }, { 5, 282, 512 }, { 6, 283, 512 }, { 5, 284, 512 }, { 6, 285, 512 }, { 6, 286, 512 }, { 7, 287, 512 }, 153f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 288, 512 }, { 4, 289, 512 }, { 4, 290, 512 }, { 5, 291, 512 }, { 4, 292, 512 }, { 5, 293, 512 }, { 5, 294, 512 }, { 6, 295, 512 }, 154f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 296, 512 }, { 5, 297, 512 }, { 5, 298, 512 }, { 6, 299, 512 }, { 5, 300, 512 }, { 6, 301, 512 }, { 6, 302, 512 }, { 7, 303, 512 }, 155f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 304, 512 }, { 5, 305, 512 }, { 5, 306, 512 }, { 6, 307, 512 }, { 5, 308, 512 }, { 6, 309, 512 }, { 6, 310, 512 }, { 7, 311, 512 }, 156f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 312, 512 }, { 6, 313, 512 }, { 6, 314, 512 }, { 7, 315, 512 }, { 6, 316, 512 }, { 7, 317, 512 }, { 7, 318, 512 }, { 8, 319, 512 }, 157f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 320, 512 }, { 4, 321, 512 }, { 4, 322, 512 }, { 5, 323, 512 }, { 4, 324, 512 }, { 5, 325, 512 }, { 5, 326, 512 }, { 6, 327, 512 }, 158f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 328, 512 }, { 5, 329, 512 }, { 5, 330, 512 }, { 6, 331, 512 }, { 5, 332, 512 }, { 6, 333, 512 }, { 6, 334, 512 }, { 7, 335, 512 }, 159f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 336, 512 }, { 5, 337, 512 }, { 5, 338, 512 }, { 6, 339, 512 }, { 5, 340, 512 }, { 6, 341, 512 }, { 6, 342, 512 }, { 7, 343, 512 }, 160f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 344, 512 }, { 6, 345, 512 }, { 6, 346, 512 }, { 7, 347, 512 }, { 6, 348, 512 }, { 7, 349, 512 }, { 7, 350, 512 }, { 8, 351, 512 }, 161f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 352, 512 }, { 5, 353, 512 }, { 5, 354, 512 }, { 6, 355, 512 }, { 5, 356, 512 }, { 6, 357, 512 }, { 6, 358, 512 }, { 7, 359, 512 }, 162f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 360, 512 }, { 6, 361, 512 }, { 6, 362, 512 }, { 7, 363, 512 }, { 6, 364, 512 }, { 7, 365, 512 }, { 7, 366, 512 }, { 8, 367, 512 }, 163f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 368, 512 }, { 6, 369, 512 }, { 6, 370, 512 }, { 7, 371, 512 }, { 6, 372, 512 }, { 7, 373, 512 }, { 7, 374, 512 }, { 8, 375, 512 }, 164f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 376, 512 }, { 7, 377, 512 }, { 7, 378, 512 }, { 8, 379, 512 }, { 7, 380, 512 }, { 8, 381, 512 }, { 8, 382, 512 }, { 9, 383, 512 }, 165f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 384, 512 }, { 4, 385, 512 }, { 4, 386, 512 }, { 5, 387, 512 }, { 4, 388, 512 }, { 5, 389, 512 }, { 5, 390, 512 }, { 6, 391, 512 }, 166f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 392, 512 }, { 5, 393, 512 }, { 5, 394, 512 }, { 6, 395, 512 }, { 5, 396, 512 }, { 6, 397, 512 }, { 6, 398, 512 }, { 7, 399, 512 }, 167f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 400, 512 }, { 5, 401, 512 }, { 5, 402, 512 }, { 6, 403, 512 }, { 5, 404, 512 }, { 6, 405, 512 }, { 6, 406, 512 }, { 7, 407, 512 }, 168f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 408, 512 }, { 6, 409, 512 }, { 6, 410, 512 }, { 7, 411, 512 }, { 6, 412, 512 }, { 7, 413, 512 }, { 7, 414, 512 }, { 8, 415, 512 }, 169f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 416, 512 }, { 5, 417, 512 }, { 5, 418, 512 }, { 6, 419, 512 }, { 5, 420, 512 }, { 6, 421, 512 }, { 6, 422, 512 }, { 7, 423, 512 }, 170f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 424, 512 }, { 6, 425, 512 }, { 6, 426, 512 }, { 7, 427, 512 }, { 6, 428, 512 }, { 7, 429, 512 }, { 7, 430, 512 }, { 8, 431, 512 }, 171f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 432, 512 }, { 6, 433, 512 }, { 6, 434, 512 }, { 7, 435, 512 }, { 6, 436, 512 }, { 7, 437, 512 }, { 7, 438, 512 }, { 8, 439, 512 }, 172f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 440, 512 }, { 7, 441, 512 }, { 7, 442, 512 }, { 8, 443, 512 }, { 7, 444, 512 }, { 8, 445, 512 }, { 8, 446, 512 }, { 9, 447, 512 }, 173f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 448, 512 }, { 5, 449, 512 }, { 5, 450, 512 }, { 6, 451, 512 }, { 5, 452, 512 }, { 6, 453, 512 }, { 6, 454, 512 }, { 7, 455, 512 }, 174f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 456, 512 }, { 6, 457, 512 }, { 6, 458, 512 }, { 7, 459, 512 }, { 6, 460, 512 }, { 7, 461, 512 }, { 7, 462, 512 }, { 8, 463, 512 }, 175f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 464, 512 }, { 6, 465, 512 }, { 6, 466, 512 }, { 7, 467, 512 }, { 6, 468, 512 }, { 7, 469, 512 }, { 7, 470, 512 }, { 8, 471, 512 }, 176f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 472, 512 }, { 7, 473, 512 }, { 7, 474, 512 }, { 8, 475, 512 }, { 7, 476, 512 }, { 8, 477, 512 }, { 8, 478, 512 }, { 9, 479, 512 }, 177f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 480, 512 }, { 6, 481, 512 }, { 6, 482, 512 }, { 7, 483, 512 }, { 6, 484, 512 }, { 7, 485, 512 }, { 7, 486, 512 }, { 8, 487, 512 }, 178f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 488, 512 }, { 7, 489, 512 }, { 7, 490, 512 }, { 8, 491, 512 }, { 7, 492, 512 }, { 8, 493, 512 }, { 8, 494, 512 }, { 9, 495, 512 }, 179f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 496, 512 }, { 7, 497, 512 }, { 7, 498, 512 }, { 8, 499, 512 }, { 7, 500, 512 }, { 8, 501, 512 }, { 8, 502, 512 }, { 9, 503, 512 }, 180f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 7, 504, 512 }, { 8, 505, 512 }, { 8, 506, 512 }, { 9, 507, 512 }, { 8, 508, 512 }, { 9, 509, 512 }, { 9, 510, 512 }, { 10, 511, 512 }, 181f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#if FP_LUT > 10 182f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 1, 0, 0 }, { 2, 1, 1024 }, { 2, 2, 1024 }, { 3, 3, 1024 }, { 2, 4, 1024 }, { 3, 5, 1024 }, { 3, 6, 1024 }, { 4, 7, 1024 }, 183f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 2, 8, 1024 }, { 3, 9, 1024 }, { 3, 10, 1024 }, { 4, 11, 1024 }, { 3, 12, 1024 }, { 4, 13, 1024 }, { 4, 14, 1024 }, { 5, 15, 1024 }, 184f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 2, 16, 1024 }, { 3, 17, 1024 }, { 3, 18, 1024 }, { 4, 19, 1024 }, { 3, 20, 1024 }, { 4, 21, 1024 }, { 4, 22, 1024 }, { 5, 23, 1024 }, 185f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 24, 1024 }, { 4, 25, 1024 }, { 4, 26, 1024 }, { 5, 27, 1024 }, { 4, 28, 1024 }, { 5, 29, 1024 }, { 5, 30, 1024 }, { 6, 31, 1024 }, 186f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 2, 32, 1024 }, { 3, 33, 1024 }, { 3, 34, 1024 }, { 4, 35, 1024 }, { 3, 36, 1024 }, { 4, 37, 1024 }, { 4, 38, 1024 }, { 5, 39, 1024 }, 187f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 40, 1024 }, { 4, 41, 1024 }, { 4, 42, 1024 }, { 5, 43, 1024 }, { 4, 44, 1024 }, { 5, 45, 1024 }, { 5, 46, 1024 }, { 6, 47, 1024 }, 188f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 48, 1024 }, { 4, 49, 1024 }, { 4, 50, 1024 }, { 5, 51, 1024 }, { 4, 52, 1024 }, { 5, 53, 1024 }, { 5, 54, 1024 }, { 6, 55, 1024 }, 189f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 56, 1024 }, { 5, 57, 1024 }, { 5, 58, 1024 }, { 6, 59, 1024 }, { 5, 60, 1024 }, { 6, 61, 1024 }, { 6, 62, 1024 }, { 7, 63, 1024 }, 190f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 2, 64, 1024 }, { 3, 65, 1024 }, { 3, 66, 1024 }, { 4, 67, 1024 }, { 3, 68, 1024 }, { 4, 69, 1024 }, { 4, 70, 1024 }, { 5, 71, 1024 }, 191f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 72, 1024 }, { 4, 73, 1024 }, { 4, 74, 1024 }, { 5, 75, 1024 }, { 4, 76, 1024 }, { 5, 77, 1024 }, { 5, 78, 1024 }, { 6, 79, 1024 }, 192f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 80, 1024 }, { 4, 81, 1024 }, { 4, 82, 1024 }, { 5, 83, 1024 }, { 4, 84, 1024 }, { 5, 85, 1024 }, { 5, 86, 1024 }, { 6, 87, 1024 }, 193f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 88, 1024 }, { 5, 89, 1024 }, { 5, 90, 1024 }, { 6, 91, 1024 }, { 5, 92, 1024 }, { 6, 93, 1024 }, { 6, 94, 1024 }, { 7, 95, 1024 }, 194f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 96, 1024 }, { 4, 97, 1024 }, { 4, 98, 1024 }, { 5, 99, 1024 }, { 4, 100, 1024 }, { 5, 101, 1024 }, { 5, 102, 1024 }, { 6, 103, 1024 }, 195f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 104, 1024 }, { 5, 105, 1024 }, { 5, 106, 1024 }, { 6, 107, 1024 }, { 5, 108, 1024 }, { 6, 109, 1024 }, { 6, 110, 1024 }, { 7, 111, 1024 }, 196f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 112, 1024 }, { 5, 113, 1024 }, { 5, 114, 1024 }, { 6, 115, 1024 }, { 5, 116, 1024 }, { 6, 117, 1024 }, { 6, 118, 1024 }, { 7, 119, 1024 }, 197f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 120, 1024 }, { 6, 121, 1024 }, { 6, 122, 1024 }, { 7, 123, 1024 }, { 6, 124, 1024 }, { 7, 125, 1024 }, { 7, 126, 1024 }, { 8, 127, 1024 }, 198f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 2, 128, 1024 }, { 3, 129, 1024 }, { 3, 130, 1024 }, { 4, 131, 1024 }, { 3, 132, 1024 }, { 4, 133, 1024 }, { 4, 134, 1024 }, { 5, 135, 1024 }, 199f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 136, 1024 }, { 4, 137, 1024 }, { 4, 138, 1024 }, { 5, 139, 1024 }, { 4, 140, 1024 }, { 5, 141, 1024 }, { 5, 142, 1024 }, { 6, 143, 1024 }, 200f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 144, 1024 }, { 4, 145, 1024 }, { 4, 146, 1024 }, { 5, 147, 1024 }, { 4, 148, 1024 }, { 5, 149, 1024 }, { 5, 150, 1024 }, { 6, 151, 1024 }, 201f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 152, 1024 }, { 5, 153, 1024 }, { 5, 154, 1024 }, { 6, 155, 1024 }, { 5, 156, 1024 }, { 6, 157, 1024 }, { 6, 158, 1024 }, { 7, 159, 1024 }, 202f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 160, 1024 }, { 4, 161, 1024 }, { 4, 162, 1024 }, { 5, 163, 1024 }, { 4, 164, 1024 }, { 5, 165, 1024 }, { 5, 166, 1024 }, { 6, 167, 1024 }, 203f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 168, 1024 }, { 5, 169, 1024 }, { 5, 170, 1024 }, { 6, 171, 1024 }, { 5, 172, 1024 }, { 6, 173, 1024 }, { 6, 174, 1024 }, { 7, 175, 1024 }, 204f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 176, 1024 }, { 5, 177, 1024 }, { 5, 178, 1024 }, { 6, 179, 1024 }, { 5, 180, 1024 }, { 6, 181, 1024 }, { 6, 182, 1024 }, { 7, 183, 1024 }, 205f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 184, 1024 }, { 6, 185, 1024 }, { 6, 186, 1024 }, { 7, 187, 1024 }, { 6, 188, 1024 }, { 7, 189, 1024 }, { 7, 190, 1024 }, { 8, 191, 1024 }, 206f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 192, 1024 }, { 4, 193, 1024 }, { 4, 194, 1024 }, { 5, 195, 1024 }, { 4, 196, 1024 }, { 5, 197, 1024 }, { 5, 198, 1024 }, { 6, 199, 1024 }, 207f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 200, 1024 }, { 5, 201, 1024 }, { 5, 202, 1024 }, { 6, 203, 1024 }, { 5, 204, 1024 }, { 6, 205, 1024 }, { 6, 206, 1024 }, { 7, 207, 1024 }, 208f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 208, 1024 }, { 5, 209, 1024 }, { 5, 210, 1024 }, { 6, 211, 1024 }, { 5, 212, 1024 }, { 6, 213, 1024 }, { 6, 214, 1024 }, { 7, 215, 1024 }, 209f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 216, 1024 }, { 6, 217, 1024 }, { 6, 218, 1024 }, { 7, 219, 1024 }, { 6, 220, 1024 }, { 7, 221, 1024 }, { 7, 222, 1024 }, { 8, 223, 1024 }, 210f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 224, 1024 }, { 5, 225, 1024 }, { 5, 226, 1024 }, { 6, 227, 1024 }, { 5, 228, 1024 }, { 6, 229, 1024 }, { 6, 230, 1024 }, { 7, 231, 1024 }, 211f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 232, 1024 }, { 6, 233, 1024 }, { 6, 234, 1024 }, { 7, 235, 1024 }, { 6, 236, 1024 }, { 7, 237, 1024 }, { 7, 238, 1024 }, { 8, 239, 1024 }, 212f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 240, 1024 }, { 6, 241, 1024 }, { 6, 242, 1024 }, { 7, 243, 1024 }, { 6, 244, 1024 }, { 7, 245, 1024 }, { 7, 246, 1024 }, { 8, 247, 1024 }, 213f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 248, 1024 }, { 7, 249, 1024 }, { 7, 250, 1024 }, { 8, 251, 1024 }, { 7, 252, 1024 }, { 8, 253, 1024 }, { 8, 254, 1024 }, { 9, 255, 1024 }, 214f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 2, 256, 1024 }, { 3, 257, 1024 }, { 3, 258, 1024 }, { 4, 259, 1024 }, { 3, 260, 1024 }, { 4, 261, 1024 }, { 4, 262, 1024 }, { 5, 263, 1024 }, 215f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 264, 1024 }, { 4, 265, 1024 }, { 4, 266, 1024 }, { 5, 267, 1024 }, { 4, 268, 1024 }, { 5, 269, 1024 }, { 5, 270, 1024 }, { 6, 271, 1024 }, 216f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 272, 1024 }, { 4, 273, 1024 }, { 4, 274, 1024 }, { 5, 275, 1024 }, { 4, 276, 1024 }, { 5, 277, 1024 }, { 5, 278, 1024 }, { 6, 279, 1024 }, 217f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 280, 1024 }, { 5, 281, 1024 }, { 5, 282, 1024 }, { 6, 283, 1024 }, { 5, 284, 1024 }, { 6, 285, 1024 }, { 6, 286, 1024 }, { 7, 287, 1024 }, 218f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 288, 1024 }, { 4, 289, 1024 }, { 4, 290, 1024 }, { 5, 291, 1024 }, { 4, 292, 1024 }, { 5, 293, 1024 }, { 5, 294, 1024 }, { 6, 295, 1024 }, 219f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 296, 1024 }, { 5, 297, 1024 }, { 5, 298, 1024 }, { 6, 299, 1024 }, { 5, 300, 1024 }, { 6, 301, 1024 }, { 6, 302, 1024 }, { 7, 303, 1024 }, 220f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 304, 1024 }, { 5, 305, 1024 }, { 5, 306, 1024 }, { 6, 307, 1024 }, { 5, 308, 1024 }, { 6, 309, 1024 }, { 6, 310, 1024 }, { 7, 311, 1024 }, 221f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 312, 1024 }, { 6, 313, 1024 }, { 6, 314, 1024 }, { 7, 315, 1024 }, { 6, 316, 1024 }, { 7, 317, 1024 }, { 7, 318, 1024 }, { 8, 319, 1024 }, 222f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 320, 1024 }, { 4, 321, 1024 }, { 4, 322, 1024 }, { 5, 323, 1024 }, { 4, 324, 1024 }, { 5, 325, 1024 }, { 5, 326, 1024 }, { 6, 327, 1024 }, 223f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 328, 1024 }, { 5, 329, 1024 }, { 5, 330, 1024 }, { 6, 331, 1024 }, { 5, 332, 1024 }, { 6, 333, 1024 }, { 6, 334, 1024 }, { 7, 335, 1024 }, 224f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 336, 1024 }, { 5, 337, 1024 }, { 5, 338, 1024 }, { 6, 339, 1024 }, { 5, 340, 1024 }, { 6, 341, 1024 }, { 6, 342, 1024 }, { 7, 343, 1024 }, 225f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 344, 1024 }, { 6, 345, 1024 }, { 6, 346, 1024 }, { 7, 347, 1024 }, { 6, 348, 1024 }, { 7, 349, 1024 }, { 7, 350, 1024 }, { 8, 351, 1024 }, 226f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 352, 1024 }, { 5, 353, 1024 }, { 5, 354, 1024 }, { 6, 355, 1024 }, { 5, 356, 1024 }, { 6, 357, 1024 }, { 6, 358, 1024 }, { 7, 359, 1024 }, 227f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 360, 1024 }, { 6, 361, 1024 }, { 6, 362, 1024 }, { 7, 363, 1024 }, { 6, 364, 1024 }, { 7, 365, 1024 }, { 7, 366, 1024 }, { 8, 367, 1024 }, 228f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 368, 1024 }, { 6, 369, 1024 }, { 6, 370, 1024 }, { 7, 371, 1024 }, { 6, 372, 1024 }, { 7, 373, 1024 }, { 7, 374, 1024 }, { 8, 375, 1024 }, 229f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 376, 1024 }, { 7, 377, 1024 }, { 7, 378, 1024 }, { 8, 379, 1024 }, { 7, 380, 1024 }, { 8, 381, 1024 }, { 8, 382, 1024 }, { 9, 383, 1024 }, 230f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 384, 1024 }, { 4, 385, 1024 }, { 4, 386, 1024 }, { 5, 387, 1024 }, { 4, 388, 1024 }, { 5, 389, 1024 }, { 5, 390, 1024 }, { 6, 391, 1024 }, 231f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 392, 1024 }, { 5, 393, 1024 }, { 5, 394, 1024 }, { 6, 395, 1024 }, { 5, 396, 1024 }, { 6, 397, 1024 }, { 6, 398, 1024 }, { 7, 399, 1024 }, 232f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 400, 1024 }, { 5, 401, 1024 }, { 5, 402, 1024 }, { 6, 403, 1024 }, { 5, 404, 1024 }, { 6, 405, 1024 }, { 6, 406, 1024 }, { 7, 407, 1024 }, 233f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 408, 1024 }, { 6, 409, 1024 }, { 6, 410, 1024 }, { 7, 411, 1024 }, { 6, 412, 1024 }, { 7, 413, 1024 }, { 7, 414, 1024 }, { 8, 415, 1024 }, 234f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 416, 1024 }, { 5, 417, 1024 }, { 5, 418, 1024 }, { 6, 419, 1024 }, { 5, 420, 1024 }, { 6, 421, 1024 }, { 6, 422, 1024 }, { 7, 423, 1024 }, 235f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 424, 1024 }, { 6, 425, 1024 }, { 6, 426, 1024 }, { 7, 427, 1024 }, { 6, 428, 1024 }, { 7, 429, 1024 }, { 7, 430, 1024 }, { 8, 431, 1024 }, 236f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 432, 1024 }, { 6, 433, 1024 }, { 6, 434, 1024 }, { 7, 435, 1024 }, { 6, 436, 1024 }, { 7, 437, 1024 }, { 7, 438, 1024 }, { 8, 439, 1024 }, 237f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 440, 1024 }, { 7, 441, 1024 }, { 7, 442, 1024 }, { 8, 443, 1024 }, { 7, 444, 1024 }, { 8, 445, 1024 }, { 8, 446, 1024 }, { 9, 447, 1024 }, 238f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 448, 1024 }, { 5, 449, 1024 }, { 5, 450, 1024 }, { 6, 451, 1024 }, { 5, 452, 1024 }, { 6, 453, 1024 }, { 6, 454, 1024 }, { 7, 455, 1024 }, 239f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 456, 1024 }, { 6, 457, 1024 }, { 6, 458, 1024 }, { 7, 459, 1024 }, { 6, 460, 1024 }, { 7, 461, 1024 }, { 7, 462, 1024 }, { 8, 463, 1024 }, 240f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 464, 1024 }, { 6, 465, 1024 }, { 6, 466, 1024 }, { 7, 467, 1024 }, { 6, 468, 1024 }, { 7, 469, 1024 }, { 7, 470, 1024 }, { 8, 471, 1024 }, 241f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 472, 1024 }, { 7, 473, 1024 }, { 7, 474, 1024 }, { 8, 475, 1024 }, { 7, 476, 1024 }, { 8, 477, 1024 }, { 8, 478, 1024 }, { 9, 479, 1024 }, 242f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 480, 1024 }, { 6, 481, 1024 }, { 6, 482, 1024 }, { 7, 483, 1024 }, { 6, 484, 1024 }, { 7, 485, 1024 }, { 7, 486, 1024 }, { 8, 487, 1024 }, 243f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 488, 1024 }, { 7, 489, 1024 }, { 7, 490, 1024 }, { 8, 491, 1024 }, { 7, 492, 1024 }, { 8, 493, 1024 }, { 8, 494, 1024 }, { 9, 495, 1024 }, 244f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 496, 1024 }, { 7, 497, 1024 }, { 7, 498, 1024 }, { 8, 499, 1024 }, { 7, 500, 1024 }, { 8, 501, 1024 }, { 8, 502, 1024 }, { 9, 503, 1024 }, 245f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 7, 504, 1024 }, { 8, 505, 1024 }, { 8, 506, 1024 }, { 9, 507, 1024 }, { 8, 508, 1024 }, { 9, 509, 1024 }, { 9, 510, 1024 }, { 10, 511, 1024 }, 246f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 2, 512, 1024 }, { 3, 513, 1024 }, { 3, 514, 1024 }, { 4, 515, 1024 }, { 3, 516, 1024 }, { 4, 517, 1024 }, { 4, 518, 1024 }, { 5, 519, 1024 }, 247f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 520, 1024 }, { 4, 521, 1024 }, { 4, 522, 1024 }, { 5, 523, 1024 }, { 4, 524, 1024 }, { 5, 525, 1024 }, { 5, 526, 1024 }, { 6, 527, 1024 }, 248f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 528, 1024 }, { 4, 529, 1024 }, { 4, 530, 1024 }, { 5, 531, 1024 }, { 4, 532, 1024 }, { 5, 533, 1024 }, { 5, 534, 1024 }, { 6, 535, 1024 }, 249f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 536, 1024 }, { 5, 537, 1024 }, { 5, 538, 1024 }, { 6, 539, 1024 }, { 5, 540, 1024 }, { 6, 541, 1024 }, { 6, 542, 1024 }, { 7, 543, 1024 }, 250f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 544, 1024 }, { 4, 545, 1024 }, { 4, 546, 1024 }, { 5, 547, 1024 }, { 4, 548, 1024 }, { 5, 549, 1024 }, { 5, 550, 1024 }, { 6, 551, 1024 }, 251f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 552, 1024 }, { 5, 553, 1024 }, { 5, 554, 1024 }, { 6, 555, 1024 }, { 5, 556, 1024 }, { 6, 557, 1024 }, { 6, 558, 1024 }, { 7, 559, 1024 }, 252f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 560, 1024 }, { 5, 561, 1024 }, { 5, 562, 1024 }, { 6, 563, 1024 }, { 5, 564, 1024 }, { 6, 565, 1024 }, { 6, 566, 1024 }, { 7, 567, 1024 }, 253f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 568, 1024 }, { 6, 569, 1024 }, { 6, 570, 1024 }, { 7, 571, 1024 }, { 6, 572, 1024 }, { 7, 573, 1024 }, { 7, 574, 1024 }, { 8, 575, 1024 }, 254f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 576, 1024 }, { 4, 577, 1024 }, { 4, 578, 1024 }, { 5, 579, 1024 }, { 4, 580, 1024 }, { 5, 581, 1024 }, { 5, 582, 1024 }, { 6, 583, 1024 }, 255f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 584, 1024 }, { 5, 585, 1024 }, { 5, 586, 1024 }, { 6, 587, 1024 }, { 5, 588, 1024 }, { 6, 589, 1024 }, { 6, 590, 1024 }, { 7, 591, 1024 }, 256f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 592, 1024 }, { 5, 593, 1024 }, { 5, 594, 1024 }, { 6, 595, 1024 }, { 5, 596, 1024 }, { 6, 597, 1024 }, { 6, 598, 1024 }, { 7, 599, 1024 }, 257f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 600, 1024 }, { 6, 601, 1024 }, { 6, 602, 1024 }, { 7, 603, 1024 }, { 6, 604, 1024 }, { 7, 605, 1024 }, { 7, 606, 1024 }, { 8, 607, 1024 }, 258f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 608, 1024 }, { 5, 609, 1024 }, { 5, 610, 1024 }, { 6, 611, 1024 }, { 5, 612, 1024 }, { 6, 613, 1024 }, { 6, 614, 1024 }, { 7, 615, 1024 }, 259f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 616, 1024 }, { 6, 617, 1024 }, { 6, 618, 1024 }, { 7, 619, 1024 }, { 6, 620, 1024 }, { 7, 621, 1024 }, { 7, 622, 1024 }, { 8, 623, 1024 }, 260f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 624, 1024 }, { 6, 625, 1024 }, { 6, 626, 1024 }, { 7, 627, 1024 }, { 6, 628, 1024 }, { 7, 629, 1024 }, { 7, 630, 1024 }, { 8, 631, 1024 }, 261f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 632, 1024 }, { 7, 633, 1024 }, { 7, 634, 1024 }, { 8, 635, 1024 }, { 7, 636, 1024 }, { 8, 637, 1024 }, { 8, 638, 1024 }, { 9, 639, 1024 }, 262f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 640, 1024 }, { 4, 641, 1024 }, { 4, 642, 1024 }, { 5, 643, 1024 }, { 4, 644, 1024 }, { 5, 645, 1024 }, { 5, 646, 1024 }, { 6, 647, 1024 }, 263f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 648, 1024 }, { 5, 649, 1024 }, { 5, 650, 1024 }, { 6, 651, 1024 }, { 5, 652, 1024 }, { 6, 653, 1024 }, { 6, 654, 1024 }, { 7, 655, 1024 }, 264f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 656, 1024 }, { 5, 657, 1024 }, { 5, 658, 1024 }, { 6, 659, 1024 }, { 5, 660, 1024 }, { 6, 661, 1024 }, { 6, 662, 1024 }, { 7, 663, 1024 }, 265f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 664, 1024 }, { 6, 665, 1024 }, { 6, 666, 1024 }, { 7, 667, 1024 }, { 6, 668, 1024 }, { 7, 669, 1024 }, { 7, 670, 1024 }, { 8, 671, 1024 }, 266f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 672, 1024 }, { 5, 673, 1024 }, { 5, 674, 1024 }, { 6, 675, 1024 }, { 5, 676, 1024 }, { 6, 677, 1024 }, { 6, 678, 1024 }, { 7, 679, 1024 }, 267f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 680, 1024 }, { 6, 681, 1024 }, { 6, 682, 1024 }, { 7, 683, 1024 }, { 6, 684, 1024 }, { 7, 685, 1024 }, { 7, 686, 1024 }, { 8, 687, 1024 }, 268f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 688, 1024 }, { 6, 689, 1024 }, { 6, 690, 1024 }, { 7, 691, 1024 }, { 6, 692, 1024 }, { 7, 693, 1024 }, { 7, 694, 1024 }, { 8, 695, 1024 }, 269f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 696, 1024 }, { 7, 697, 1024 }, { 7, 698, 1024 }, { 8, 699, 1024 }, { 7, 700, 1024 }, { 8, 701, 1024 }, { 8, 702, 1024 }, { 9, 703, 1024 }, 270f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 704, 1024 }, { 5, 705, 1024 }, { 5, 706, 1024 }, { 6, 707, 1024 }, { 5, 708, 1024 }, { 6, 709, 1024 }, { 6, 710, 1024 }, { 7, 711, 1024 }, 271f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 712, 1024 }, { 6, 713, 1024 }, { 6, 714, 1024 }, { 7, 715, 1024 }, { 6, 716, 1024 }, { 7, 717, 1024 }, { 7, 718, 1024 }, { 8, 719, 1024 }, 272f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 720, 1024 }, { 6, 721, 1024 }, { 6, 722, 1024 }, { 7, 723, 1024 }, { 6, 724, 1024 }, { 7, 725, 1024 }, { 7, 726, 1024 }, { 8, 727, 1024 }, 273f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 728, 1024 }, { 7, 729, 1024 }, { 7, 730, 1024 }, { 8, 731, 1024 }, { 7, 732, 1024 }, { 8, 733, 1024 }, { 8, 734, 1024 }, { 9, 735, 1024 }, 274f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 736, 1024 }, { 6, 737, 1024 }, { 6, 738, 1024 }, { 7, 739, 1024 }, { 6, 740, 1024 }, { 7, 741, 1024 }, { 7, 742, 1024 }, { 8, 743, 1024 }, 275f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 744, 1024 }, { 7, 745, 1024 }, { 7, 746, 1024 }, { 8, 747, 1024 }, { 7, 748, 1024 }, { 8, 749, 1024 }, { 8, 750, 1024 }, { 9, 751, 1024 }, 276f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 752, 1024 }, { 7, 753, 1024 }, { 7, 754, 1024 }, { 8, 755, 1024 }, { 7, 756, 1024 }, { 8, 757, 1024 }, { 8, 758, 1024 }, { 9, 759, 1024 }, 277f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 7, 760, 1024 }, { 8, 761, 1024 }, { 8, 762, 1024 }, { 9, 763, 1024 }, { 8, 764, 1024 }, { 9, 765, 1024 }, { 9, 766, 1024 }, { 10, 767, 1024 }, 278f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 768, 1024 }, { 4, 769, 1024 }, { 4, 770, 1024 }, { 5, 771, 1024 }, { 4, 772, 1024 }, { 5, 773, 1024 }, { 5, 774, 1024 }, { 6, 775, 1024 }, 279f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 776, 1024 }, { 5, 777, 1024 }, { 5, 778, 1024 }, { 6, 779, 1024 }, { 5, 780, 1024 }, { 6, 781, 1024 }, { 6, 782, 1024 }, { 7, 783, 1024 }, 280f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 784, 1024 }, { 5, 785, 1024 }, { 5, 786, 1024 }, { 6, 787, 1024 }, { 5, 788, 1024 }, { 6, 789, 1024 }, { 6, 790, 1024 }, { 7, 791, 1024 }, 281f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 792, 1024 }, { 6, 793, 1024 }, { 6, 794, 1024 }, { 7, 795, 1024 }, { 6, 796, 1024 }, { 7, 797, 1024 }, { 7, 798, 1024 }, { 8, 799, 1024 }, 282f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 800, 1024 }, { 5, 801, 1024 }, { 5, 802, 1024 }, { 6, 803, 1024 }, { 5, 804, 1024 }, { 6, 805, 1024 }, { 6, 806, 1024 }, { 7, 807, 1024 }, 283f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 808, 1024 }, { 6, 809, 1024 }, { 6, 810, 1024 }, { 7, 811, 1024 }, { 6, 812, 1024 }, { 7, 813, 1024 }, { 7, 814, 1024 }, { 8, 815, 1024 }, 284f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 816, 1024 }, { 6, 817, 1024 }, { 6, 818, 1024 }, { 7, 819, 1024 }, { 6, 820, 1024 }, { 7, 821, 1024 }, { 7, 822, 1024 }, { 8, 823, 1024 }, 285f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 824, 1024 }, { 7, 825, 1024 }, { 7, 826, 1024 }, { 8, 827, 1024 }, { 7, 828, 1024 }, { 8, 829, 1024 }, { 8, 830, 1024 }, { 9, 831, 1024 }, 286f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 832, 1024 }, { 5, 833, 1024 }, { 5, 834, 1024 }, { 6, 835, 1024 }, { 5, 836, 1024 }, { 6, 837, 1024 }, { 6, 838, 1024 }, { 7, 839, 1024 }, 287f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 840, 1024 }, { 6, 841, 1024 }, { 6, 842, 1024 }, { 7, 843, 1024 }, { 6, 844, 1024 }, { 7, 845, 1024 }, { 7, 846, 1024 }, { 8, 847, 1024 }, 288f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 848, 1024 }, { 6, 849, 1024 }, { 6, 850, 1024 }, { 7, 851, 1024 }, { 6, 852, 1024 }, { 7, 853, 1024 }, { 7, 854, 1024 }, { 8, 855, 1024 }, 289f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 856, 1024 }, { 7, 857, 1024 }, { 7, 858, 1024 }, { 8, 859, 1024 }, { 7, 860, 1024 }, { 8, 861, 1024 }, { 8, 862, 1024 }, { 9, 863, 1024 }, 290f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 864, 1024 }, { 6, 865, 1024 }, { 6, 866, 1024 }, { 7, 867, 1024 }, { 6, 868, 1024 }, { 7, 869, 1024 }, { 7, 870, 1024 }, { 8, 871, 1024 }, 291f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 872, 1024 }, { 7, 873, 1024 }, { 7, 874, 1024 }, { 8, 875, 1024 }, { 7, 876, 1024 }, { 8, 877, 1024 }, { 8, 878, 1024 }, { 9, 879, 1024 }, 292f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 880, 1024 }, { 7, 881, 1024 }, { 7, 882, 1024 }, { 8, 883, 1024 }, { 7, 884, 1024 }, { 8, 885, 1024 }, { 8, 886, 1024 }, { 9, 887, 1024 }, 293f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 7, 888, 1024 }, { 8, 889, 1024 }, { 8, 890, 1024 }, { 9, 891, 1024 }, { 8, 892, 1024 }, { 9, 893, 1024 }, { 9, 894, 1024 }, { 10, 895, 1024 }, 294f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 896, 1024 }, { 5, 897, 1024 }, { 5, 898, 1024 }, { 6, 899, 1024 }, { 5, 900, 1024 }, { 6, 901, 1024 }, { 6, 902, 1024 }, { 7, 903, 1024 }, 295f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 904, 1024 }, { 6, 905, 1024 }, { 6, 906, 1024 }, { 7, 907, 1024 }, { 6, 908, 1024 }, { 7, 909, 1024 }, { 7, 910, 1024 }, { 8, 911, 1024 }, 296f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 912, 1024 }, { 6, 913, 1024 }, { 6, 914, 1024 }, { 7, 915, 1024 }, { 6, 916, 1024 }, { 7, 917, 1024 }, { 7, 918, 1024 }, { 8, 919, 1024 }, 297f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 920, 1024 }, { 7, 921, 1024 }, { 7, 922, 1024 }, { 8, 923, 1024 }, { 7, 924, 1024 }, { 8, 925, 1024 }, { 8, 926, 1024 }, { 9, 927, 1024 }, 298f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 928, 1024 }, { 6, 929, 1024 }, { 6, 930, 1024 }, { 7, 931, 1024 }, { 6, 932, 1024 }, { 7, 933, 1024 }, { 7, 934, 1024 }, { 8, 935, 1024 }, 299f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 936, 1024 }, { 7, 937, 1024 }, { 7, 938, 1024 }, { 8, 939, 1024 }, { 7, 940, 1024 }, { 8, 941, 1024 }, { 8, 942, 1024 }, { 9, 943, 1024 }, 300f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 944, 1024 }, { 7, 945, 1024 }, { 7, 946, 1024 }, { 8, 947, 1024 }, { 7, 948, 1024 }, { 8, 949, 1024 }, { 8, 950, 1024 }, { 9, 951, 1024 }, 301f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 7, 952, 1024 }, { 8, 953, 1024 }, { 8, 954, 1024 }, { 9, 955, 1024 }, { 8, 956, 1024 }, { 9, 957, 1024 }, { 9, 958, 1024 }, { 10, 959, 1024 }, 302f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 960, 1024 }, { 6, 961, 1024 }, { 6, 962, 1024 }, { 7, 963, 1024 }, { 6, 964, 1024 }, { 7, 965, 1024 }, { 7, 966, 1024 }, { 8, 967, 1024 }, 303f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 968, 1024 }, { 7, 969, 1024 }, { 7, 970, 1024 }, { 8, 971, 1024 }, { 7, 972, 1024 }, { 8, 973, 1024 }, { 8, 974, 1024 }, { 9, 975, 1024 }, 304f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 976, 1024 }, { 7, 977, 1024 }, { 7, 978, 1024 }, { 8, 979, 1024 }, { 7, 980, 1024 }, { 8, 981, 1024 }, { 8, 982, 1024 }, { 9, 983, 1024 }, 305f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 7, 984, 1024 }, { 8, 985, 1024 }, { 8, 986, 1024 }, { 9, 987, 1024 }, { 8, 988, 1024 }, { 9, 989, 1024 }, { 9, 990, 1024 }, { 10, 991, 1024 }, 306f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 992, 1024 }, { 7, 993, 1024 }, { 7, 994, 1024 }, { 8, 995, 1024 }, { 7, 996, 1024 }, { 8, 997, 1024 }, { 8, 998, 1024 }, { 9, 999, 1024 }, 307f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 7, 1000, 1024 }, { 8, 1001, 1024 }, { 8, 1002, 1024 }, { 9, 1003, 1024 }, { 8, 1004, 1024 }, { 9, 1005, 1024 }, { 9, 1006, 1024 }, { 10, 1007, 1024 }, 308f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 7, 1008, 1024 }, { 8, 1009, 1024 }, { 8, 1010, 1024 }, { 9, 1011, 1024 }, { 8, 1012, 1024 }, { 9, 1013, 1024 }, { 9, 1014, 1024 }, { 10, 1015, 1024 }, 309f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 8, 1016, 1024 }, { 9, 1017, 1024 }, { 9, 1018, 1024 }, { 10, 1019, 1024 }, { 9, 1020, 1024 }, { 10, 1021, 1024 }, { 10, 1022, 1024 }, { 11, 1023, 1024 }, 310f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#if FP_LUT > 11 311f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 1, 0, 0 }, { 2, 1, 2048 }, { 2, 2, 2048 }, { 3, 3, 2048 }, { 2, 4, 2048 }, { 3, 5, 2048 }, { 3, 6, 2048 }, { 4, 7, 2048 }, 312f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 2, 8, 2048 }, { 3, 9, 2048 }, { 3, 10, 2048 }, { 4, 11, 2048 }, { 3, 12, 2048 }, { 4, 13, 2048 }, { 4, 14, 2048 }, { 5, 15, 2048 }, 313f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 2, 16, 2048 }, { 3, 17, 2048 }, { 3, 18, 2048 }, { 4, 19, 2048 }, { 3, 20, 2048 }, { 4, 21, 2048 }, { 4, 22, 2048 }, { 5, 23, 2048 }, 314f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 24, 2048 }, { 4, 25, 2048 }, { 4, 26, 2048 }, { 5, 27, 2048 }, { 4, 28, 2048 }, { 5, 29, 2048 }, { 5, 30, 2048 }, { 6, 31, 2048 }, 315f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 2, 32, 2048 }, { 3, 33, 2048 }, { 3, 34, 2048 }, { 4, 35, 2048 }, { 3, 36, 2048 }, { 4, 37, 2048 }, { 4, 38, 2048 }, { 5, 39, 2048 }, 316f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 40, 2048 }, { 4, 41, 2048 }, { 4, 42, 2048 }, { 5, 43, 2048 }, { 4, 44, 2048 }, { 5, 45, 2048 }, { 5, 46, 2048 }, { 6, 47, 2048 }, 317f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 48, 2048 }, { 4, 49, 2048 }, { 4, 50, 2048 }, { 5, 51, 2048 }, { 4, 52, 2048 }, { 5, 53, 2048 }, { 5, 54, 2048 }, { 6, 55, 2048 }, 318f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 56, 2048 }, { 5, 57, 2048 }, { 5, 58, 2048 }, { 6, 59, 2048 }, { 5, 60, 2048 }, { 6, 61, 2048 }, { 6, 62, 2048 }, { 7, 63, 2048 }, 319f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 2, 64, 2048 }, { 3, 65, 2048 }, { 3, 66, 2048 }, { 4, 67, 2048 }, { 3, 68, 2048 }, { 4, 69, 2048 }, { 4, 70, 2048 }, { 5, 71, 2048 }, 320f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 72, 2048 }, { 4, 73, 2048 }, { 4, 74, 2048 }, { 5, 75, 2048 }, { 4, 76, 2048 }, { 5, 77, 2048 }, { 5, 78, 2048 }, { 6, 79, 2048 }, 321f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 80, 2048 }, { 4, 81, 2048 }, { 4, 82, 2048 }, { 5, 83, 2048 }, { 4, 84, 2048 }, { 5, 85, 2048 }, { 5, 86, 2048 }, { 6, 87, 2048 }, 322f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 88, 2048 }, { 5, 89, 2048 }, { 5, 90, 2048 }, { 6, 91, 2048 }, { 5, 92, 2048 }, { 6, 93, 2048 }, { 6, 94, 2048 }, { 7, 95, 2048 }, 323f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 96, 2048 }, { 4, 97, 2048 }, { 4, 98, 2048 }, { 5, 99, 2048 }, { 4, 100, 2048 }, { 5, 101, 2048 }, { 5, 102, 2048 }, { 6, 103, 2048 }, 324f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 104, 2048 }, { 5, 105, 2048 }, { 5, 106, 2048 }, { 6, 107, 2048 }, { 5, 108, 2048 }, { 6, 109, 2048 }, { 6, 110, 2048 }, { 7, 111, 2048 }, 325f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 112, 2048 }, { 5, 113, 2048 }, { 5, 114, 2048 }, { 6, 115, 2048 }, { 5, 116, 2048 }, { 6, 117, 2048 }, { 6, 118, 2048 }, { 7, 119, 2048 }, 326f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 120, 2048 }, { 6, 121, 2048 }, { 6, 122, 2048 }, { 7, 123, 2048 }, { 6, 124, 2048 }, { 7, 125, 2048 }, { 7, 126, 2048 }, { 8, 127, 2048 }, 327f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 2, 128, 2048 }, { 3, 129, 2048 }, { 3, 130, 2048 }, { 4, 131, 2048 }, { 3, 132, 2048 }, { 4, 133, 2048 }, { 4, 134, 2048 }, { 5, 135, 2048 }, 328f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 136, 2048 }, { 4, 137, 2048 }, { 4, 138, 2048 }, { 5, 139, 2048 }, { 4, 140, 2048 }, { 5, 141, 2048 }, { 5, 142, 2048 }, { 6, 143, 2048 }, 329f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 144, 2048 }, { 4, 145, 2048 }, { 4, 146, 2048 }, { 5, 147, 2048 }, { 4, 148, 2048 }, { 5, 149, 2048 }, { 5, 150, 2048 }, { 6, 151, 2048 }, 330f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 152, 2048 }, { 5, 153, 2048 }, { 5, 154, 2048 }, { 6, 155, 2048 }, { 5, 156, 2048 }, { 6, 157, 2048 }, { 6, 158, 2048 }, { 7, 159, 2048 }, 331f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 160, 2048 }, { 4, 161, 2048 }, { 4, 162, 2048 }, { 5, 163, 2048 }, { 4, 164, 2048 }, { 5, 165, 2048 }, { 5, 166, 2048 }, { 6, 167, 2048 }, 332f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 168, 2048 }, { 5, 169, 2048 }, { 5, 170, 2048 }, { 6, 171, 2048 }, { 5, 172, 2048 }, { 6, 173, 2048 }, { 6, 174, 2048 }, { 7, 175, 2048 }, 333f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 176, 2048 }, { 5, 177, 2048 }, { 5, 178, 2048 }, { 6, 179, 2048 }, { 5, 180, 2048 }, { 6, 181, 2048 }, { 6, 182, 2048 }, { 7, 183, 2048 }, 334f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 184, 2048 }, { 6, 185, 2048 }, { 6, 186, 2048 }, { 7, 187, 2048 }, { 6, 188, 2048 }, { 7, 189, 2048 }, { 7, 190, 2048 }, { 8, 191, 2048 }, 335f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 192, 2048 }, { 4, 193, 2048 }, { 4, 194, 2048 }, { 5, 195, 2048 }, { 4, 196, 2048 }, { 5, 197, 2048 }, { 5, 198, 2048 }, { 6, 199, 2048 }, 336f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 200, 2048 }, { 5, 201, 2048 }, { 5, 202, 2048 }, { 6, 203, 2048 }, { 5, 204, 2048 }, { 6, 205, 2048 }, { 6, 206, 2048 }, { 7, 207, 2048 }, 337f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 208, 2048 }, { 5, 209, 2048 }, { 5, 210, 2048 }, { 6, 211, 2048 }, { 5, 212, 2048 }, { 6, 213, 2048 }, { 6, 214, 2048 }, { 7, 215, 2048 }, 338f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 216, 2048 }, { 6, 217, 2048 }, { 6, 218, 2048 }, { 7, 219, 2048 }, { 6, 220, 2048 }, { 7, 221, 2048 }, { 7, 222, 2048 }, { 8, 223, 2048 }, 339f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 224, 2048 }, { 5, 225, 2048 }, { 5, 226, 2048 }, { 6, 227, 2048 }, { 5, 228, 2048 }, { 6, 229, 2048 }, { 6, 230, 2048 }, { 7, 231, 2048 }, 340f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 232, 2048 }, { 6, 233, 2048 }, { 6, 234, 2048 }, { 7, 235, 2048 }, { 6, 236, 2048 }, { 7, 237, 2048 }, { 7, 238, 2048 }, { 8, 239, 2048 }, 341f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 240, 2048 }, { 6, 241, 2048 }, { 6, 242, 2048 }, { 7, 243, 2048 }, { 6, 244, 2048 }, { 7, 245, 2048 }, { 7, 246, 2048 }, { 8, 247, 2048 }, 342f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 248, 2048 }, { 7, 249, 2048 }, { 7, 250, 2048 }, { 8, 251, 2048 }, { 7, 252, 2048 }, { 8, 253, 2048 }, { 8, 254, 2048 }, { 9, 255, 2048 }, 343f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 2, 256, 2048 }, { 3, 257, 2048 }, { 3, 258, 2048 }, { 4, 259, 2048 }, { 3, 260, 2048 }, { 4, 261, 2048 }, { 4, 262, 2048 }, { 5, 263, 2048 }, 344f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 264, 2048 }, { 4, 265, 2048 }, { 4, 266, 2048 }, { 5, 267, 2048 }, { 4, 268, 2048 }, { 5, 269, 2048 }, { 5, 270, 2048 }, { 6, 271, 2048 }, 345f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 272, 2048 }, { 4, 273, 2048 }, { 4, 274, 2048 }, { 5, 275, 2048 }, { 4, 276, 2048 }, { 5, 277, 2048 }, { 5, 278, 2048 }, { 6, 279, 2048 }, 346f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 280, 2048 }, { 5, 281, 2048 }, { 5, 282, 2048 }, { 6, 283, 2048 }, { 5, 284, 2048 }, { 6, 285, 2048 }, { 6, 286, 2048 }, { 7, 287, 2048 }, 347f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 288, 2048 }, { 4, 289, 2048 }, { 4, 290, 2048 }, { 5, 291, 2048 }, { 4, 292, 2048 }, { 5, 293, 2048 }, { 5, 294, 2048 }, { 6, 295, 2048 }, 348f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 296, 2048 }, { 5, 297, 2048 }, { 5, 298, 2048 }, { 6, 299, 2048 }, { 5, 300, 2048 }, { 6, 301, 2048 }, { 6, 302, 2048 }, { 7, 303, 2048 }, 349f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 304, 2048 }, { 5, 305, 2048 }, { 5, 306, 2048 }, { 6, 307, 2048 }, { 5, 308, 2048 }, { 6, 309, 2048 }, { 6, 310, 2048 }, { 7, 311, 2048 }, 350f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 312, 2048 }, { 6, 313, 2048 }, { 6, 314, 2048 }, { 7, 315, 2048 }, { 6, 316, 2048 }, { 7, 317, 2048 }, { 7, 318, 2048 }, { 8, 319, 2048 }, 351f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 320, 2048 }, { 4, 321, 2048 }, { 4, 322, 2048 }, { 5, 323, 2048 }, { 4, 324, 2048 }, { 5, 325, 2048 }, { 5, 326, 2048 }, { 6, 327, 2048 }, 352f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 328, 2048 }, { 5, 329, 2048 }, { 5, 330, 2048 }, { 6, 331, 2048 }, { 5, 332, 2048 }, { 6, 333, 2048 }, { 6, 334, 2048 }, { 7, 335, 2048 }, 353f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 336, 2048 }, { 5, 337, 2048 }, { 5, 338, 2048 }, { 6, 339, 2048 }, { 5, 340, 2048 }, { 6, 341, 2048 }, { 6, 342, 2048 }, { 7, 343, 2048 }, 354f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 344, 2048 }, { 6, 345, 2048 }, { 6, 346, 2048 }, { 7, 347, 2048 }, { 6, 348, 2048 }, { 7, 349, 2048 }, { 7, 350, 2048 }, { 8, 351, 2048 }, 355f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 352, 2048 }, { 5, 353, 2048 }, { 5, 354, 2048 }, { 6, 355, 2048 }, { 5, 356, 2048 }, { 6, 357, 2048 }, { 6, 358, 2048 }, { 7, 359, 2048 }, 356f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 360, 2048 }, { 6, 361, 2048 }, { 6, 362, 2048 }, { 7, 363, 2048 }, { 6, 364, 2048 }, { 7, 365, 2048 }, { 7, 366, 2048 }, { 8, 367, 2048 }, 357f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 368, 2048 }, { 6, 369, 2048 }, { 6, 370, 2048 }, { 7, 371, 2048 }, { 6, 372, 2048 }, { 7, 373, 2048 }, { 7, 374, 2048 }, { 8, 375, 2048 }, 358f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 376, 2048 }, { 7, 377, 2048 }, { 7, 378, 2048 }, { 8, 379, 2048 }, { 7, 380, 2048 }, { 8, 381, 2048 }, { 8, 382, 2048 }, { 9, 383, 2048 }, 359f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 384, 2048 }, { 4, 385, 2048 }, { 4, 386, 2048 }, { 5, 387, 2048 }, { 4, 388, 2048 }, { 5, 389, 2048 }, { 5, 390, 2048 }, { 6, 391, 2048 }, 360f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 392, 2048 }, { 5, 393, 2048 }, { 5, 394, 2048 }, { 6, 395, 2048 }, { 5, 396, 2048 }, { 6, 397, 2048 }, { 6, 398, 2048 }, { 7, 399, 2048 }, 361f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 400, 2048 }, { 5, 401, 2048 }, { 5, 402, 2048 }, { 6, 403, 2048 }, { 5, 404, 2048 }, { 6, 405, 2048 }, { 6, 406, 2048 }, { 7, 407, 2048 }, 362f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 408, 2048 }, { 6, 409, 2048 }, { 6, 410, 2048 }, { 7, 411, 2048 }, { 6, 412, 2048 }, { 7, 413, 2048 }, { 7, 414, 2048 }, { 8, 415, 2048 }, 363f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 416, 2048 }, { 5, 417, 2048 }, { 5, 418, 2048 }, { 6, 419, 2048 }, { 5, 420, 2048 }, { 6, 421, 2048 }, { 6, 422, 2048 }, { 7, 423, 2048 }, 364f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 424, 2048 }, { 6, 425, 2048 }, { 6, 426, 2048 }, { 7, 427, 2048 }, { 6, 428, 2048 }, { 7, 429, 2048 }, { 7, 430, 2048 }, { 8, 431, 2048 }, 365f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 432, 2048 }, { 6, 433, 2048 }, { 6, 434, 2048 }, { 7, 435, 2048 }, { 6, 436, 2048 }, { 7, 437, 2048 }, { 7, 438, 2048 }, { 8, 439, 2048 }, 366f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 440, 2048 }, { 7, 441, 2048 }, { 7, 442, 2048 }, { 8, 443, 2048 }, { 7, 444, 2048 }, { 8, 445, 2048 }, { 8, 446, 2048 }, { 9, 447, 2048 }, 367f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 448, 2048 }, { 5, 449, 2048 }, { 5, 450, 2048 }, { 6, 451, 2048 }, { 5, 452, 2048 }, { 6, 453, 2048 }, { 6, 454, 2048 }, { 7, 455, 2048 }, 368f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 456, 2048 }, { 6, 457, 2048 }, { 6, 458, 2048 }, { 7, 459, 2048 }, { 6, 460, 2048 }, { 7, 461, 2048 }, { 7, 462, 2048 }, { 8, 463, 2048 }, 369f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 464, 2048 }, { 6, 465, 2048 }, { 6, 466, 2048 }, { 7, 467, 2048 }, { 6, 468, 2048 }, { 7, 469, 2048 }, { 7, 470, 2048 }, { 8, 471, 2048 }, 370f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 472, 2048 }, { 7, 473, 2048 }, { 7, 474, 2048 }, { 8, 475, 2048 }, { 7, 476, 2048 }, { 8, 477, 2048 }, { 8, 478, 2048 }, { 9, 479, 2048 }, 371f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 480, 2048 }, { 6, 481, 2048 }, { 6, 482, 2048 }, { 7, 483, 2048 }, { 6, 484, 2048 }, { 7, 485, 2048 }, { 7, 486, 2048 }, { 8, 487, 2048 }, 372f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 488, 2048 }, { 7, 489, 2048 }, { 7, 490, 2048 }, { 8, 491, 2048 }, { 7, 492, 2048 }, { 8, 493, 2048 }, { 8, 494, 2048 }, { 9, 495, 2048 }, 373f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 496, 2048 }, { 7, 497, 2048 }, { 7, 498, 2048 }, { 8, 499, 2048 }, { 7, 500, 2048 }, { 8, 501, 2048 }, { 8, 502, 2048 }, { 9, 503, 2048 }, 374f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 7, 504, 2048 }, { 8, 505, 2048 }, { 8, 506, 2048 }, { 9, 507, 2048 }, { 8, 508, 2048 }, { 9, 509, 2048 }, { 9, 510, 2048 }, { 10, 511, 2048 }, 375f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 2, 512, 2048 }, { 3, 513, 2048 }, { 3, 514, 2048 }, { 4, 515, 2048 }, { 3, 516, 2048 }, { 4, 517, 2048 }, { 4, 518, 2048 }, { 5, 519, 2048 }, 376f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 520, 2048 }, { 4, 521, 2048 }, { 4, 522, 2048 }, { 5, 523, 2048 }, { 4, 524, 2048 }, { 5, 525, 2048 }, { 5, 526, 2048 }, { 6, 527, 2048 }, 377f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 528, 2048 }, { 4, 529, 2048 }, { 4, 530, 2048 }, { 5, 531, 2048 }, { 4, 532, 2048 }, { 5, 533, 2048 }, { 5, 534, 2048 }, { 6, 535, 2048 }, 378f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 536, 2048 }, { 5, 537, 2048 }, { 5, 538, 2048 }, { 6, 539, 2048 }, { 5, 540, 2048 }, { 6, 541, 2048 }, { 6, 542, 2048 }, { 7, 543, 2048 }, 379f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 544, 2048 }, { 4, 545, 2048 }, { 4, 546, 2048 }, { 5, 547, 2048 }, { 4, 548, 2048 }, { 5, 549, 2048 }, { 5, 550, 2048 }, { 6, 551, 2048 }, 380f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 552, 2048 }, { 5, 553, 2048 }, { 5, 554, 2048 }, { 6, 555, 2048 }, { 5, 556, 2048 }, { 6, 557, 2048 }, { 6, 558, 2048 }, { 7, 559, 2048 }, 381f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 560, 2048 }, { 5, 561, 2048 }, { 5, 562, 2048 }, { 6, 563, 2048 }, { 5, 564, 2048 }, { 6, 565, 2048 }, { 6, 566, 2048 }, { 7, 567, 2048 }, 382f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 568, 2048 }, { 6, 569, 2048 }, { 6, 570, 2048 }, { 7, 571, 2048 }, { 6, 572, 2048 }, { 7, 573, 2048 }, { 7, 574, 2048 }, { 8, 575, 2048 }, 383f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 576, 2048 }, { 4, 577, 2048 }, { 4, 578, 2048 }, { 5, 579, 2048 }, { 4, 580, 2048 }, { 5, 581, 2048 }, { 5, 582, 2048 }, { 6, 583, 2048 }, 384f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 584, 2048 }, { 5, 585, 2048 }, { 5, 586, 2048 }, { 6, 587, 2048 }, { 5, 588, 2048 }, { 6, 589, 2048 }, { 6, 590, 2048 }, { 7, 591, 2048 }, 385f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 592, 2048 }, { 5, 593, 2048 }, { 5, 594, 2048 }, { 6, 595, 2048 }, { 5, 596, 2048 }, { 6, 597, 2048 }, { 6, 598, 2048 }, { 7, 599, 2048 }, 386f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 600, 2048 }, { 6, 601, 2048 }, { 6, 602, 2048 }, { 7, 603, 2048 }, { 6, 604, 2048 }, { 7, 605, 2048 }, { 7, 606, 2048 }, { 8, 607, 2048 }, 387f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 608, 2048 }, { 5, 609, 2048 }, { 5, 610, 2048 }, { 6, 611, 2048 }, { 5, 612, 2048 }, { 6, 613, 2048 }, { 6, 614, 2048 }, { 7, 615, 2048 }, 388f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 616, 2048 }, { 6, 617, 2048 }, { 6, 618, 2048 }, { 7, 619, 2048 }, { 6, 620, 2048 }, { 7, 621, 2048 }, { 7, 622, 2048 }, { 8, 623, 2048 }, 389f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 624, 2048 }, { 6, 625, 2048 }, { 6, 626, 2048 }, { 7, 627, 2048 }, { 6, 628, 2048 }, { 7, 629, 2048 }, { 7, 630, 2048 }, { 8, 631, 2048 }, 390f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 632, 2048 }, { 7, 633, 2048 }, { 7, 634, 2048 }, { 8, 635, 2048 }, { 7, 636, 2048 }, { 8, 637, 2048 }, { 8, 638, 2048 }, { 9, 639, 2048 }, 391f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 640, 2048 }, { 4, 641, 2048 }, { 4, 642, 2048 }, { 5, 643, 2048 }, { 4, 644, 2048 }, { 5, 645, 2048 }, { 5, 646, 2048 }, { 6, 647, 2048 }, 392f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 648, 2048 }, { 5, 649, 2048 }, { 5, 650, 2048 }, { 6, 651, 2048 }, { 5, 652, 2048 }, { 6, 653, 2048 }, { 6, 654, 2048 }, { 7, 655, 2048 }, 393f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 656, 2048 }, { 5, 657, 2048 }, { 5, 658, 2048 }, { 6, 659, 2048 }, { 5, 660, 2048 }, { 6, 661, 2048 }, { 6, 662, 2048 }, { 7, 663, 2048 }, 394f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 664, 2048 }, { 6, 665, 2048 }, { 6, 666, 2048 }, { 7, 667, 2048 }, { 6, 668, 2048 }, { 7, 669, 2048 }, { 7, 670, 2048 }, { 8, 671, 2048 }, 395f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 672, 2048 }, { 5, 673, 2048 }, { 5, 674, 2048 }, { 6, 675, 2048 }, { 5, 676, 2048 }, { 6, 677, 2048 }, { 6, 678, 2048 }, { 7, 679, 2048 }, 396f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 680, 2048 }, { 6, 681, 2048 }, { 6, 682, 2048 }, { 7, 683, 2048 }, { 6, 684, 2048 }, { 7, 685, 2048 }, { 7, 686, 2048 }, { 8, 687, 2048 }, 397f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 688, 2048 }, { 6, 689, 2048 }, { 6, 690, 2048 }, { 7, 691, 2048 }, { 6, 692, 2048 }, { 7, 693, 2048 }, { 7, 694, 2048 }, { 8, 695, 2048 }, 398f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 696, 2048 }, { 7, 697, 2048 }, { 7, 698, 2048 }, { 8, 699, 2048 }, { 7, 700, 2048 }, { 8, 701, 2048 }, { 8, 702, 2048 }, { 9, 703, 2048 }, 399f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 704, 2048 }, { 5, 705, 2048 }, { 5, 706, 2048 }, { 6, 707, 2048 }, { 5, 708, 2048 }, { 6, 709, 2048 }, { 6, 710, 2048 }, { 7, 711, 2048 }, 400f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 712, 2048 }, { 6, 713, 2048 }, { 6, 714, 2048 }, { 7, 715, 2048 }, { 6, 716, 2048 }, { 7, 717, 2048 }, { 7, 718, 2048 }, { 8, 719, 2048 }, 401f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 720, 2048 }, { 6, 721, 2048 }, { 6, 722, 2048 }, { 7, 723, 2048 }, { 6, 724, 2048 }, { 7, 725, 2048 }, { 7, 726, 2048 }, { 8, 727, 2048 }, 402f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 728, 2048 }, { 7, 729, 2048 }, { 7, 730, 2048 }, { 8, 731, 2048 }, { 7, 732, 2048 }, { 8, 733, 2048 }, { 8, 734, 2048 }, { 9, 735, 2048 }, 403f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 736, 2048 }, { 6, 737, 2048 }, { 6, 738, 2048 }, { 7, 739, 2048 }, { 6, 740, 2048 }, { 7, 741, 2048 }, { 7, 742, 2048 }, { 8, 743, 2048 }, 404f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 744, 2048 }, { 7, 745, 2048 }, { 7, 746, 2048 }, { 8, 747, 2048 }, { 7, 748, 2048 }, { 8, 749, 2048 }, { 8, 750, 2048 }, { 9, 751, 2048 }, 405f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 752, 2048 }, { 7, 753, 2048 }, { 7, 754, 2048 }, { 8, 755, 2048 }, { 7, 756, 2048 }, { 8, 757, 2048 }, { 8, 758, 2048 }, { 9, 759, 2048 }, 406f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 7, 760, 2048 }, { 8, 761, 2048 }, { 8, 762, 2048 }, { 9, 763, 2048 }, { 8, 764, 2048 }, { 9, 765, 2048 }, { 9, 766, 2048 }, { 10, 767, 2048 }, 407f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 768, 2048 }, { 4, 769, 2048 }, { 4, 770, 2048 }, { 5, 771, 2048 }, { 4, 772, 2048 }, { 5, 773, 2048 }, { 5, 774, 2048 }, { 6, 775, 2048 }, 408f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 776, 2048 }, { 5, 777, 2048 }, { 5, 778, 2048 }, { 6, 779, 2048 }, { 5, 780, 2048 }, { 6, 781, 2048 }, { 6, 782, 2048 }, { 7, 783, 2048 }, 409f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 784, 2048 }, { 5, 785, 2048 }, { 5, 786, 2048 }, { 6, 787, 2048 }, { 5, 788, 2048 }, { 6, 789, 2048 }, { 6, 790, 2048 }, { 7, 791, 2048 }, 410f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 792, 2048 }, { 6, 793, 2048 }, { 6, 794, 2048 }, { 7, 795, 2048 }, { 6, 796, 2048 }, { 7, 797, 2048 }, { 7, 798, 2048 }, { 8, 799, 2048 }, 411f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 800, 2048 }, { 5, 801, 2048 }, { 5, 802, 2048 }, { 6, 803, 2048 }, { 5, 804, 2048 }, { 6, 805, 2048 }, { 6, 806, 2048 }, { 7, 807, 2048 }, 412f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 808, 2048 }, { 6, 809, 2048 }, { 6, 810, 2048 }, { 7, 811, 2048 }, { 6, 812, 2048 }, { 7, 813, 2048 }, { 7, 814, 2048 }, { 8, 815, 2048 }, 413f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 816, 2048 }, { 6, 817, 2048 }, { 6, 818, 2048 }, { 7, 819, 2048 }, { 6, 820, 2048 }, { 7, 821, 2048 }, { 7, 822, 2048 }, { 8, 823, 2048 }, 414f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 824, 2048 }, { 7, 825, 2048 }, { 7, 826, 2048 }, { 8, 827, 2048 }, { 7, 828, 2048 }, { 8, 829, 2048 }, { 8, 830, 2048 }, { 9, 831, 2048 }, 415f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 832, 2048 }, { 5, 833, 2048 }, { 5, 834, 2048 }, { 6, 835, 2048 }, { 5, 836, 2048 }, { 6, 837, 2048 }, { 6, 838, 2048 }, { 7, 839, 2048 }, 416f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 840, 2048 }, { 6, 841, 2048 }, { 6, 842, 2048 }, { 7, 843, 2048 }, { 6, 844, 2048 }, { 7, 845, 2048 }, { 7, 846, 2048 }, { 8, 847, 2048 }, 417f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 848, 2048 }, { 6, 849, 2048 }, { 6, 850, 2048 }, { 7, 851, 2048 }, { 6, 852, 2048 }, { 7, 853, 2048 }, { 7, 854, 2048 }, { 8, 855, 2048 }, 418f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 856, 2048 }, { 7, 857, 2048 }, { 7, 858, 2048 }, { 8, 859, 2048 }, { 7, 860, 2048 }, { 8, 861, 2048 }, { 8, 862, 2048 }, { 9, 863, 2048 }, 419f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 864, 2048 }, { 6, 865, 2048 }, { 6, 866, 2048 }, { 7, 867, 2048 }, { 6, 868, 2048 }, { 7, 869, 2048 }, { 7, 870, 2048 }, { 8, 871, 2048 }, 420f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 872, 2048 }, { 7, 873, 2048 }, { 7, 874, 2048 }, { 8, 875, 2048 }, { 7, 876, 2048 }, { 8, 877, 2048 }, { 8, 878, 2048 }, { 9, 879, 2048 }, 421f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 880, 2048 }, { 7, 881, 2048 }, { 7, 882, 2048 }, { 8, 883, 2048 }, { 7, 884, 2048 }, { 8, 885, 2048 }, { 8, 886, 2048 }, { 9, 887, 2048 }, 422f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 7, 888, 2048 }, { 8, 889, 2048 }, { 8, 890, 2048 }, { 9, 891, 2048 }, { 8, 892, 2048 }, { 9, 893, 2048 }, { 9, 894, 2048 }, { 10, 895, 2048 }, 423f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 896, 2048 }, { 5, 897, 2048 }, { 5, 898, 2048 }, { 6, 899, 2048 }, { 5, 900, 2048 }, { 6, 901, 2048 }, { 6, 902, 2048 }, { 7, 903, 2048 }, 424f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 904, 2048 }, { 6, 905, 2048 }, { 6, 906, 2048 }, { 7, 907, 2048 }, { 6, 908, 2048 }, { 7, 909, 2048 }, { 7, 910, 2048 }, { 8, 911, 2048 }, 425f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 912, 2048 }, { 6, 913, 2048 }, { 6, 914, 2048 }, { 7, 915, 2048 }, { 6, 916, 2048 }, { 7, 917, 2048 }, { 7, 918, 2048 }, { 8, 919, 2048 }, 426f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 920, 2048 }, { 7, 921, 2048 }, { 7, 922, 2048 }, { 8, 923, 2048 }, { 7, 924, 2048 }, { 8, 925, 2048 }, { 8, 926, 2048 }, { 9, 927, 2048 }, 427f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 928, 2048 }, { 6, 929, 2048 }, { 6, 930, 2048 }, { 7, 931, 2048 }, { 6, 932, 2048 }, { 7, 933, 2048 }, { 7, 934, 2048 }, { 8, 935, 2048 }, 428f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 936, 2048 }, { 7, 937, 2048 }, { 7, 938, 2048 }, { 8, 939, 2048 }, { 7, 940, 2048 }, { 8, 941, 2048 }, { 8, 942, 2048 }, { 9, 943, 2048 }, 429f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 944, 2048 }, { 7, 945, 2048 }, { 7, 946, 2048 }, { 8, 947, 2048 }, { 7, 948, 2048 }, { 8, 949, 2048 }, { 8, 950, 2048 }, { 9, 951, 2048 }, 430f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 7, 952, 2048 }, { 8, 953, 2048 }, { 8, 954, 2048 }, { 9, 955, 2048 }, { 8, 956, 2048 }, { 9, 957, 2048 }, { 9, 958, 2048 }, { 10, 959, 2048 }, 431f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 960, 2048 }, { 6, 961, 2048 }, { 6, 962, 2048 }, { 7, 963, 2048 }, { 6, 964, 2048 }, { 7, 965, 2048 }, { 7, 966, 2048 }, { 8, 967, 2048 }, 432f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 968, 2048 }, { 7, 969, 2048 }, { 7, 970, 2048 }, { 8, 971, 2048 }, { 7, 972, 2048 }, { 8, 973, 2048 }, { 8, 974, 2048 }, { 9, 975, 2048 }, 433f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 976, 2048 }, { 7, 977, 2048 }, { 7, 978, 2048 }, { 8, 979, 2048 }, { 7, 980, 2048 }, { 8, 981, 2048 }, { 8, 982, 2048 }, { 9, 983, 2048 }, 434f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 7, 984, 2048 }, { 8, 985, 2048 }, { 8, 986, 2048 }, { 9, 987, 2048 }, { 8, 988, 2048 }, { 9, 989, 2048 }, { 9, 990, 2048 }, { 10, 991, 2048 }, 435f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 992, 2048 }, { 7, 993, 2048 }, { 7, 994, 2048 }, { 8, 995, 2048 }, { 7, 996, 2048 }, { 8, 997, 2048 }, { 8, 998, 2048 }, { 9, 999, 2048 }, 436f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 7, 1000, 2048 }, { 8, 1001, 2048 }, { 8, 1002, 2048 }, { 9, 1003, 2048 }, { 8, 1004, 2048 }, { 9, 1005, 2048 }, { 9, 1006, 2048 }, { 10, 1007, 2048 }, 437f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 7, 1008, 2048 }, { 8, 1009, 2048 }, { 8, 1010, 2048 }, { 9, 1011, 2048 }, { 8, 1012, 2048 }, { 9, 1013, 2048 }, { 9, 1014, 2048 }, { 10, 1015, 2048 }, 438f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 8, 1016, 2048 }, { 9, 1017, 2048 }, { 9, 1018, 2048 }, { 10, 1019, 2048 }, { 9, 1020, 2048 }, { 10, 1021, 2048 }, { 10, 1022, 2048 }, { 11, 1023, 2048 }, 439f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 2, 1024, 2048 }, { 3, 1025, 2048 }, { 3, 1026, 2048 }, { 4, 1027, 2048 }, { 3, 1028, 2048 }, { 4, 1029, 2048 }, { 4, 1030, 2048 }, { 5, 1031, 2048 }, 440f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 1032, 2048 }, { 4, 1033, 2048 }, { 4, 1034, 2048 }, { 5, 1035, 2048 }, { 4, 1036, 2048 }, { 5, 1037, 2048 }, { 5, 1038, 2048 }, { 6, 1039, 2048 }, 441f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 1040, 2048 }, { 4, 1041, 2048 }, { 4, 1042, 2048 }, { 5, 1043, 2048 }, { 4, 1044, 2048 }, { 5, 1045, 2048 }, { 5, 1046, 2048 }, { 6, 1047, 2048 }, 442f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 1048, 2048 }, { 5, 1049, 2048 }, { 5, 1050, 2048 }, { 6, 1051, 2048 }, { 5, 1052, 2048 }, { 6, 1053, 2048 }, { 6, 1054, 2048 }, { 7, 1055, 2048 }, 443f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 1056, 2048 }, { 4, 1057, 2048 }, { 4, 1058, 2048 }, { 5, 1059, 2048 }, { 4, 1060, 2048 }, { 5, 1061, 2048 }, { 5, 1062, 2048 }, { 6, 1063, 2048 }, 444f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 1064, 2048 }, { 5, 1065, 2048 }, { 5, 1066, 2048 }, { 6, 1067, 2048 }, { 5, 1068, 2048 }, { 6, 1069, 2048 }, { 6, 1070, 2048 }, { 7, 1071, 2048 }, 445f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 1072, 2048 }, { 5, 1073, 2048 }, { 5, 1074, 2048 }, { 6, 1075, 2048 }, { 5, 1076, 2048 }, { 6, 1077, 2048 }, { 6, 1078, 2048 }, { 7, 1079, 2048 }, 446f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 1080, 2048 }, { 6, 1081, 2048 }, { 6, 1082, 2048 }, { 7, 1083, 2048 }, { 6, 1084, 2048 }, { 7, 1085, 2048 }, { 7, 1086, 2048 }, { 8, 1087, 2048 }, 447f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 1088, 2048 }, { 4, 1089, 2048 }, { 4, 1090, 2048 }, { 5, 1091, 2048 }, { 4, 1092, 2048 }, { 5, 1093, 2048 }, { 5, 1094, 2048 }, { 6, 1095, 2048 }, 448f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 1096, 2048 }, { 5, 1097, 2048 }, { 5, 1098, 2048 }, { 6, 1099, 2048 }, { 5, 1100, 2048 }, { 6, 1101, 2048 }, { 6, 1102, 2048 }, { 7, 1103, 2048 }, 449f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 1104, 2048 }, { 5, 1105, 2048 }, { 5, 1106, 2048 }, { 6, 1107, 2048 }, { 5, 1108, 2048 }, { 6, 1109, 2048 }, { 6, 1110, 2048 }, { 7, 1111, 2048 }, 450f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 1112, 2048 }, { 6, 1113, 2048 }, { 6, 1114, 2048 }, { 7, 1115, 2048 }, { 6, 1116, 2048 }, { 7, 1117, 2048 }, { 7, 1118, 2048 }, { 8, 1119, 2048 }, 451f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 1120, 2048 }, { 5, 1121, 2048 }, { 5, 1122, 2048 }, { 6, 1123, 2048 }, { 5, 1124, 2048 }, { 6, 1125, 2048 }, { 6, 1126, 2048 }, { 7, 1127, 2048 }, 452f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 1128, 2048 }, { 6, 1129, 2048 }, { 6, 1130, 2048 }, { 7, 1131, 2048 }, { 6, 1132, 2048 }, { 7, 1133, 2048 }, { 7, 1134, 2048 }, { 8, 1135, 2048 }, 453f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 1136, 2048 }, { 6, 1137, 2048 }, { 6, 1138, 2048 }, { 7, 1139, 2048 }, { 6, 1140, 2048 }, { 7, 1141, 2048 }, { 7, 1142, 2048 }, { 8, 1143, 2048 }, 454f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 1144, 2048 }, { 7, 1145, 2048 }, { 7, 1146, 2048 }, { 8, 1147, 2048 }, { 7, 1148, 2048 }, { 8, 1149, 2048 }, { 8, 1150, 2048 }, { 9, 1151, 2048 }, 455f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 1152, 2048 }, { 4, 1153, 2048 }, { 4, 1154, 2048 }, { 5, 1155, 2048 }, { 4, 1156, 2048 }, { 5, 1157, 2048 }, { 5, 1158, 2048 }, { 6, 1159, 2048 }, 456f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 1160, 2048 }, { 5, 1161, 2048 }, { 5, 1162, 2048 }, { 6, 1163, 2048 }, { 5, 1164, 2048 }, { 6, 1165, 2048 }, { 6, 1166, 2048 }, { 7, 1167, 2048 }, 457f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 1168, 2048 }, { 5, 1169, 2048 }, { 5, 1170, 2048 }, { 6, 1171, 2048 }, { 5, 1172, 2048 }, { 6, 1173, 2048 }, { 6, 1174, 2048 }, { 7, 1175, 2048 }, 458f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 1176, 2048 }, { 6, 1177, 2048 }, { 6, 1178, 2048 }, { 7, 1179, 2048 }, { 6, 1180, 2048 }, { 7, 1181, 2048 }, { 7, 1182, 2048 }, { 8, 1183, 2048 }, 459f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 1184, 2048 }, { 5, 1185, 2048 }, { 5, 1186, 2048 }, { 6, 1187, 2048 }, { 5, 1188, 2048 }, { 6, 1189, 2048 }, { 6, 1190, 2048 }, { 7, 1191, 2048 }, 460f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 1192, 2048 }, { 6, 1193, 2048 }, { 6, 1194, 2048 }, { 7, 1195, 2048 }, { 6, 1196, 2048 }, { 7, 1197, 2048 }, { 7, 1198, 2048 }, { 8, 1199, 2048 }, 461f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 1200, 2048 }, { 6, 1201, 2048 }, { 6, 1202, 2048 }, { 7, 1203, 2048 }, { 6, 1204, 2048 }, { 7, 1205, 2048 }, { 7, 1206, 2048 }, { 8, 1207, 2048 }, 462f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 1208, 2048 }, { 7, 1209, 2048 }, { 7, 1210, 2048 }, { 8, 1211, 2048 }, { 7, 1212, 2048 }, { 8, 1213, 2048 }, { 8, 1214, 2048 }, { 9, 1215, 2048 }, 463f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 1216, 2048 }, { 5, 1217, 2048 }, { 5, 1218, 2048 }, { 6, 1219, 2048 }, { 5, 1220, 2048 }, { 6, 1221, 2048 }, { 6, 1222, 2048 }, { 7, 1223, 2048 }, 464f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 1224, 2048 }, { 6, 1225, 2048 }, { 6, 1226, 2048 }, { 7, 1227, 2048 }, { 6, 1228, 2048 }, { 7, 1229, 2048 }, { 7, 1230, 2048 }, { 8, 1231, 2048 }, 465f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 1232, 2048 }, { 6, 1233, 2048 }, { 6, 1234, 2048 }, { 7, 1235, 2048 }, { 6, 1236, 2048 }, { 7, 1237, 2048 }, { 7, 1238, 2048 }, { 8, 1239, 2048 }, 466f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 1240, 2048 }, { 7, 1241, 2048 }, { 7, 1242, 2048 }, { 8, 1243, 2048 }, { 7, 1244, 2048 }, { 8, 1245, 2048 }, { 8, 1246, 2048 }, { 9, 1247, 2048 }, 467f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 1248, 2048 }, { 6, 1249, 2048 }, { 6, 1250, 2048 }, { 7, 1251, 2048 }, { 6, 1252, 2048 }, { 7, 1253, 2048 }, { 7, 1254, 2048 }, { 8, 1255, 2048 }, 468f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 1256, 2048 }, { 7, 1257, 2048 }, { 7, 1258, 2048 }, { 8, 1259, 2048 }, { 7, 1260, 2048 }, { 8, 1261, 2048 }, { 8, 1262, 2048 }, { 9, 1263, 2048 }, 469f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 1264, 2048 }, { 7, 1265, 2048 }, { 7, 1266, 2048 }, { 8, 1267, 2048 }, { 7, 1268, 2048 }, { 8, 1269, 2048 }, { 8, 1270, 2048 }, { 9, 1271, 2048 }, 470f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 7, 1272, 2048 }, { 8, 1273, 2048 }, { 8, 1274, 2048 }, { 9, 1275, 2048 }, { 8, 1276, 2048 }, { 9, 1277, 2048 }, { 9, 1278, 2048 }, { 10, 1279, 2048 }, 471f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 1280, 2048 }, { 4, 1281, 2048 }, { 4, 1282, 2048 }, { 5, 1283, 2048 }, { 4, 1284, 2048 }, { 5, 1285, 2048 }, { 5, 1286, 2048 }, { 6, 1287, 2048 }, 472f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 1288, 2048 }, { 5, 1289, 2048 }, { 5, 1290, 2048 }, { 6, 1291, 2048 }, { 5, 1292, 2048 }, { 6, 1293, 2048 }, { 6, 1294, 2048 }, { 7, 1295, 2048 }, 473f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 1296, 2048 }, { 5, 1297, 2048 }, { 5, 1298, 2048 }, { 6, 1299, 2048 }, { 5, 1300, 2048 }, { 6, 1301, 2048 }, { 6, 1302, 2048 }, { 7, 1303, 2048 }, 474f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 1304, 2048 }, { 6, 1305, 2048 }, { 6, 1306, 2048 }, { 7, 1307, 2048 }, { 6, 1308, 2048 }, { 7, 1309, 2048 }, { 7, 1310, 2048 }, { 8, 1311, 2048 }, 475f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 1312, 2048 }, { 5, 1313, 2048 }, { 5, 1314, 2048 }, { 6, 1315, 2048 }, { 5, 1316, 2048 }, { 6, 1317, 2048 }, { 6, 1318, 2048 }, { 7, 1319, 2048 }, 476f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 1320, 2048 }, { 6, 1321, 2048 }, { 6, 1322, 2048 }, { 7, 1323, 2048 }, { 6, 1324, 2048 }, { 7, 1325, 2048 }, { 7, 1326, 2048 }, { 8, 1327, 2048 }, 477f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 1328, 2048 }, { 6, 1329, 2048 }, { 6, 1330, 2048 }, { 7, 1331, 2048 }, { 6, 1332, 2048 }, { 7, 1333, 2048 }, { 7, 1334, 2048 }, { 8, 1335, 2048 }, 478f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 1336, 2048 }, { 7, 1337, 2048 }, { 7, 1338, 2048 }, { 8, 1339, 2048 }, { 7, 1340, 2048 }, { 8, 1341, 2048 }, { 8, 1342, 2048 }, { 9, 1343, 2048 }, 479f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 1344, 2048 }, { 5, 1345, 2048 }, { 5, 1346, 2048 }, { 6, 1347, 2048 }, { 5, 1348, 2048 }, { 6, 1349, 2048 }, { 6, 1350, 2048 }, { 7, 1351, 2048 }, 480f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 1352, 2048 }, { 6, 1353, 2048 }, { 6, 1354, 2048 }, { 7, 1355, 2048 }, { 6, 1356, 2048 }, { 7, 1357, 2048 }, { 7, 1358, 2048 }, { 8, 1359, 2048 }, 481f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 1360, 2048 }, { 6, 1361, 2048 }, { 6, 1362, 2048 }, { 7, 1363, 2048 }, { 6, 1364, 2048 }, { 7, 1365, 2048 }, { 7, 1366, 2048 }, { 8, 1367, 2048 }, 482f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 1368, 2048 }, { 7, 1369, 2048 }, { 7, 1370, 2048 }, { 8, 1371, 2048 }, { 7, 1372, 2048 }, { 8, 1373, 2048 }, { 8, 1374, 2048 }, { 9, 1375, 2048 }, 483f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 1376, 2048 }, { 6, 1377, 2048 }, { 6, 1378, 2048 }, { 7, 1379, 2048 }, { 6, 1380, 2048 }, { 7, 1381, 2048 }, { 7, 1382, 2048 }, { 8, 1383, 2048 }, 484f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 1384, 2048 }, { 7, 1385, 2048 }, { 7, 1386, 2048 }, { 8, 1387, 2048 }, { 7, 1388, 2048 }, { 8, 1389, 2048 }, { 8, 1390, 2048 }, { 9, 1391, 2048 }, 485f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 1392, 2048 }, { 7, 1393, 2048 }, { 7, 1394, 2048 }, { 8, 1395, 2048 }, { 7, 1396, 2048 }, { 8, 1397, 2048 }, { 8, 1398, 2048 }, { 9, 1399, 2048 }, 486f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 7, 1400, 2048 }, { 8, 1401, 2048 }, { 8, 1402, 2048 }, { 9, 1403, 2048 }, { 8, 1404, 2048 }, { 9, 1405, 2048 }, { 9, 1406, 2048 }, { 10, 1407, 2048 }, 487f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 1408, 2048 }, { 5, 1409, 2048 }, { 5, 1410, 2048 }, { 6, 1411, 2048 }, { 5, 1412, 2048 }, { 6, 1413, 2048 }, { 6, 1414, 2048 }, { 7, 1415, 2048 }, 488f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 1416, 2048 }, { 6, 1417, 2048 }, { 6, 1418, 2048 }, { 7, 1419, 2048 }, { 6, 1420, 2048 }, { 7, 1421, 2048 }, { 7, 1422, 2048 }, { 8, 1423, 2048 }, 489f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 1424, 2048 }, { 6, 1425, 2048 }, { 6, 1426, 2048 }, { 7, 1427, 2048 }, { 6, 1428, 2048 }, { 7, 1429, 2048 }, { 7, 1430, 2048 }, { 8, 1431, 2048 }, 490f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 1432, 2048 }, { 7, 1433, 2048 }, { 7, 1434, 2048 }, { 8, 1435, 2048 }, { 7, 1436, 2048 }, { 8, 1437, 2048 }, { 8, 1438, 2048 }, { 9, 1439, 2048 }, 491f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 1440, 2048 }, { 6, 1441, 2048 }, { 6, 1442, 2048 }, { 7, 1443, 2048 }, { 6, 1444, 2048 }, { 7, 1445, 2048 }, { 7, 1446, 2048 }, { 8, 1447, 2048 }, 492f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 1448, 2048 }, { 7, 1449, 2048 }, { 7, 1450, 2048 }, { 8, 1451, 2048 }, { 7, 1452, 2048 }, { 8, 1453, 2048 }, { 8, 1454, 2048 }, { 9, 1455, 2048 }, 493f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 1456, 2048 }, { 7, 1457, 2048 }, { 7, 1458, 2048 }, { 8, 1459, 2048 }, { 7, 1460, 2048 }, { 8, 1461, 2048 }, { 8, 1462, 2048 }, { 9, 1463, 2048 }, 494f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 7, 1464, 2048 }, { 8, 1465, 2048 }, { 8, 1466, 2048 }, { 9, 1467, 2048 }, { 8, 1468, 2048 }, { 9, 1469, 2048 }, { 9, 1470, 2048 }, { 10, 1471, 2048 }, 495f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 1472, 2048 }, { 6, 1473, 2048 }, { 6, 1474, 2048 }, { 7, 1475, 2048 }, { 6, 1476, 2048 }, { 7, 1477, 2048 }, { 7, 1478, 2048 }, { 8, 1479, 2048 }, 496f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 1480, 2048 }, { 7, 1481, 2048 }, { 7, 1482, 2048 }, { 8, 1483, 2048 }, { 7, 1484, 2048 }, { 8, 1485, 2048 }, { 8, 1486, 2048 }, { 9, 1487, 2048 }, 497f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 1488, 2048 }, { 7, 1489, 2048 }, { 7, 1490, 2048 }, { 8, 1491, 2048 }, { 7, 1492, 2048 }, { 8, 1493, 2048 }, { 8, 1494, 2048 }, { 9, 1495, 2048 }, 498f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 7, 1496, 2048 }, { 8, 1497, 2048 }, { 8, 1498, 2048 }, { 9, 1499, 2048 }, { 8, 1500, 2048 }, { 9, 1501, 2048 }, { 9, 1502, 2048 }, { 10, 1503, 2048 }, 499f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 1504, 2048 }, { 7, 1505, 2048 }, { 7, 1506, 2048 }, { 8, 1507, 2048 }, { 7, 1508, 2048 }, { 8, 1509, 2048 }, { 8, 1510, 2048 }, { 9, 1511, 2048 }, 500f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 7, 1512, 2048 }, { 8, 1513, 2048 }, { 8, 1514, 2048 }, { 9, 1515, 2048 }, { 8, 1516, 2048 }, { 9, 1517, 2048 }, { 9, 1518, 2048 }, { 10, 1519, 2048 }, 501f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 7, 1520, 2048 }, { 8, 1521, 2048 }, { 8, 1522, 2048 }, { 9, 1523, 2048 }, { 8, 1524, 2048 }, { 9, 1525, 2048 }, { 9, 1526, 2048 }, { 10, 1527, 2048 }, 502f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 8, 1528, 2048 }, { 9, 1529, 2048 }, { 9, 1530, 2048 }, { 10, 1531, 2048 }, { 9, 1532, 2048 }, { 10, 1533, 2048 }, { 10, 1534, 2048 }, { 11, 1535, 2048 }, 503f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 3, 1536, 2048 }, { 4, 1537, 2048 }, { 4, 1538, 2048 }, { 5, 1539, 2048 }, { 4, 1540, 2048 }, { 5, 1541, 2048 }, { 5, 1542, 2048 }, { 6, 1543, 2048 }, 504f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 1544, 2048 }, { 5, 1545, 2048 }, { 5, 1546, 2048 }, { 6, 1547, 2048 }, { 5, 1548, 2048 }, { 6, 1549, 2048 }, { 6, 1550, 2048 }, { 7, 1551, 2048 }, 505f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 1552, 2048 }, { 5, 1553, 2048 }, { 5, 1554, 2048 }, { 6, 1555, 2048 }, { 5, 1556, 2048 }, { 6, 1557, 2048 }, { 6, 1558, 2048 }, { 7, 1559, 2048 }, 506f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 1560, 2048 }, { 6, 1561, 2048 }, { 6, 1562, 2048 }, { 7, 1563, 2048 }, { 6, 1564, 2048 }, { 7, 1565, 2048 }, { 7, 1566, 2048 }, { 8, 1567, 2048 }, 507f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 1568, 2048 }, { 5, 1569, 2048 }, { 5, 1570, 2048 }, { 6, 1571, 2048 }, { 5, 1572, 2048 }, { 6, 1573, 2048 }, { 6, 1574, 2048 }, { 7, 1575, 2048 }, 508f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 1576, 2048 }, { 6, 1577, 2048 }, { 6, 1578, 2048 }, { 7, 1579, 2048 }, { 6, 1580, 2048 }, { 7, 1581, 2048 }, { 7, 1582, 2048 }, { 8, 1583, 2048 }, 509f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 1584, 2048 }, { 6, 1585, 2048 }, { 6, 1586, 2048 }, { 7, 1587, 2048 }, { 6, 1588, 2048 }, { 7, 1589, 2048 }, { 7, 1590, 2048 }, { 8, 1591, 2048 }, 510f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 1592, 2048 }, { 7, 1593, 2048 }, { 7, 1594, 2048 }, { 8, 1595, 2048 }, { 7, 1596, 2048 }, { 8, 1597, 2048 }, { 8, 1598, 2048 }, { 9, 1599, 2048 }, 511f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 1600, 2048 }, { 5, 1601, 2048 }, { 5, 1602, 2048 }, { 6, 1603, 2048 }, { 5, 1604, 2048 }, { 6, 1605, 2048 }, { 6, 1606, 2048 }, { 7, 1607, 2048 }, 512f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 1608, 2048 }, { 6, 1609, 2048 }, { 6, 1610, 2048 }, { 7, 1611, 2048 }, { 6, 1612, 2048 }, { 7, 1613, 2048 }, { 7, 1614, 2048 }, { 8, 1615, 2048 }, 513f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 1616, 2048 }, { 6, 1617, 2048 }, { 6, 1618, 2048 }, { 7, 1619, 2048 }, { 6, 1620, 2048 }, { 7, 1621, 2048 }, { 7, 1622, 2048 }, { 8, 1623, 2048 }, 514f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 1624, 2048 }, { 7, 1625, 2048 }, { 7, 1626, 2048 }, { 8, 1627, 2048 }, { 7, 1628, 2048 }, { 8, 1629, 2048 }, { 8, 1630, 2048 }, { 9, 1631, 2048 }, 515f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 1632, 2048 }, { 6, 1633, 2048 }, { 6, 1634, 2048 }, { 7, 1635, 2048 }, { 6, 1636, 2048 }, { 7, 1637, 2048 }, { 7, 1638, 2048 }, { 8, 1639, 2048 }, 516f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 1640, 2048 }, { 7, 1641, 2048 }, { 7, 1642, 2048 }, { 8, 1643, 2048 }, { 7, 1644, 2048 }, { 8, 1645, 2048 }, { 8, 1646, 2048 }, { 9, 1647, 2048 }, 517f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 1648, 2048 }, { 7, 1649, 2048 }, { 7, 1650, 2048 }, { 8, 1651, 2048 }, { 7, 1652, 2048 }, { 8, 1653, 2048 }, { 8, 1654, 2048 }, { 9, 1655, 2048 }, 518f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 7, 1656, 2048 }, { 8, 1657, 2048 }, { 8, 1658, 2048 }, { 9, 1659, 2048 }, { 8, 1660, 2048 }, { 9, 1661, 2048 }, { 9, 1662, 2048 }, { 10, 1663, 2048 }, 519f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 1664, 2048 }, { 5, 1665, 2048 }, { 5, 1666, 2048 }, { 6, 1667, 2048 }, { 5, 1668, 2048 }, { 6, 1669, 2048 }, { 6, 1670, 2048 }, { 7, 1671, 2048 }, 520f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 1672, 2048 }, { 6, 1673, 2048 }, { 6, 1674, 2048 }, { 7, 1675, 2048 }, { 6, 1676, 2048 }, { 7, 1677, 2048 }, { 7, 1678, 2048 }, { 8, 1679, 2048 }, 521f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 1680, 2048 }, { 6, 1681, 2048 }, { 6, 1682, 2048 }, { 7, 1683, 2048 }, { 6, 1684, 2048 }, { 7, 1685, 2048 }, { 7, 1686, 2048 }, { 8, 1687, 2048 }, 522f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 1688, 2048 }, { 7, 1689, 2048 }, { 7, 1690, 2048 }, { 8, 1691, 2048 }, { 7, 1692, 2048 }, { 8, 1693, 2048 }, { 8, 1694, 2048 }, { 9, 1695, 2048 }, 523f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 1696, 2048 }, { 6, 1697, 2048 }, { 6, 1698, 2048 }, { 7, 1699, 2048 }, { 6, 1700, 2048 }, { 7, 1701, 2048 }, { 7, 1702, 2048 }, { 8, 1703, 2048 }, 524f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 1704, 2048 }, { 7, 1705, 2048 }, { 7, 1706, 2048 }, { 8, 1707, 2048 }, { 7, 1708, 2048 }, { 8, 1709, 2048 }, { 8, 1710, 2048 }, { 9, 1711, 2048 }, 525f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 1712, 2048 }, { 7, 1713, 2048 }, { 7, 1714, 2048 }, { 8, 1715, 2048 }, { 7, 1716, 2048 }, { 8, 1717, 2048 }, { 8, 1718, 2048 }, { 9, 1719, 2048 }, 526f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 7, 1720, 2048 }, { 8, 1721, 2048 }, { 8, 1722, 2048 }, { 9, 1723, 2048 }, { 8, 1724, 2048 }, { 9, 1725, 2048 }, { 9, 1726, 2048 }, { 10, 1727, 2048 }, 527f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 1728, 2048 }, { 6, 1729, 2048 }, { 6, 1730, 2048 }, { 7, 1731, 2048 }, { 6, 1732, 2048 }, { 7, 1733, 2048 }, { 7, 1734, 2048 }, { 8, 1735, 2048 }, 528f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 1736, 2048 }, { 7, 1737, 2048 }, { 7, 1738, 2048 }, { 8, 1739, 2048 }, { 7, 1740, 2048 }, { 8, 1741, 2048 }, { 8, 1742, 2048 }, { 9, 1743, 2048 }, 529f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 1744, 2048 }, { 7, 1745, 2048 }, { 7, 1746, 2048 }, { 8, 1747, 2048 }, { 7, 1748, 2048 }, { 8, 1749, 2048 }, { 8, 1750, 2048 }, { 9, 1751, 2048 }, 530f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 7, 1752, 2048 }, { 8, 1753, 2048 }, { 8, 1754, 2048 }, { 9, 1755, 2048 }, { 8, 1756, 2048 }, { 9, 1757, 2048 }, { 9, 1758, 2048 }, { 10, 1759, 2048 }, 531f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 1760, 2048 }, { 7, 1761, 2048 }, { 7, 1762, 2048 }, { 8, 1763, 2048 }, { 7, 1764, 2048 }, { 8, 1765, 2048 }, { 8, 1766, 2048 }, { 9, 1767, 2048 }, 532f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 7, 1768, 2048 }, { 8, 1769, 2048 }, { 8, 1770, 2048 }, { 9, 1771, 2048 }, { 8, 1772, 2048 }, { 9, 1773, 2048 }, { 9, 1774, 2048 }, { 10, 1775, 2048 }, 533f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 7, 1776, 2048 }, { 8, 1777, 2048 }, { 8, 1778, 2048 }, { 9, 1779, 2048 }, { 8, 1780, 2048 }, { 9, 1781, 2048 }, { 9, 1782, 2048 }, { 10, 1783, 2048 }, 534f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 8, 1784, 2048 }, { 9, 1785, 2048 }, { 9, 1786, 2048 }, { 10, 1787, 2048 }, { 9, 1788, 2048 }, { 10, 1789, 2048 }, { 10, 1790, 2048 }, { 11, 1791, 2048 }, 535f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 4, 1792, 2048 }, { 5, 1793, 2048 }, { 5, 1794, 2048 }, { 6, 1795, 2048 }, { 5, 1796, 2048 }, { 6, 1797, 2048 }, { 6, 1798, 2048 }, { 7, 1799, 2048 }, 536f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 1800, 2048 }, { 6, 1801, 2048 }, { 6, 1802, 2048 }, { 7, 1803, 2048 }, { 6, 1804, 2048 }, { 7, 1805, 2048 }, { 7, 1806, 2048 }, { 8, 1807, 2048 }, 537f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 1808, 2048 }, { 6, 1809, 2048 }, { 6, 1810, 2048 }, { 7, 1811, 2048 }, { 6, 1812, 2048 }, { 7, 1813, 2048 }, { 7, 1814, 2048 }, { 8, 1815, 2048 }, 538f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 1816, 2048 }, { 7, 1817, 2048 }, { 7, 1818, 2048 }, { 8, 1819, 2048 }, { 7, 1820, 2048 }, { 8, 1821, 2048 }, { 8, 1822, 2048 }, { 9, 1823, 2048 }, 539f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 1824, 2048 }, { 6, 1825, 2048 }, { 6, 1826, 2048 }, { 7, 1827, 2048 }, { 6, 1828, 2048 }, { 7, 1829, 2048 }, { 7, 1830, 2048 }, { 8, 1831, 2048 }, 540f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 1832, 2048 }, { 7, 1833, 2048 }, { 7, 1834, 2048 }, { 8, 1835, 2048 }, { 7, 1836, 2048 }, { 8, 1837, 2048 }, { 8, 1838, 2048 }, { 9, 1839, 2048 }, 541f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 1840, 2048 }, { 7, 1841, 2048 }, { 7, 1842, 2048 }, { 8, 1843, 2048 }, { 7, 1844, 2048 }, { 8, 1845, 2048 }, { 8, 1846, 2048 }, { 9, 1847, 2048 }, 542f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 7, 1848, 2048 }, { 8, 1849, 2048 }, { 8, 1850, 2048 }, { 9, 1851, 2048 }, { 8, 1852, 2048 }, { 9, 1853, 2048 }, { 9, 1854, 2048 }, { 10, 1855, 2048 }, 543f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 1856, 2048 }, { 6, 1857, 2048 }, { 6, 1858, 2048 }, { 7, 1859, 2048 }, { 6, 1860, 2048 }, { 7, 1861, 2048 }, { 7, 1862, 2048 }, { 8, 1863, 2048 }, 544f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 1864, 2048 }, { 7, 1865, 2048 }, { 7, 1866, 2048 }, { 8, 1867, 2048 }, { 7, 1868, 2048 }, { 8, 1869, 2048 }, { 8, 1870, 2048 }, { 9, 1871, 2048 }, 545f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 1872, 2048 }, { 7, 1873, 2048 }, { 7, 1874, 2048 }, { 8, 1875, 2048 }, { 7, 1876, 2048 }, { 8, 1877, 2048 }, { 8, 1878, 2048 }, { 9, 1879, 2048 }, 546f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 7, 1880, 2048 }, { 8, 1881, 2048 }, { 8, 1882, 2048 }, { 9, 1883, 2048 }, { 8, 1884, 2048 }, { 9, 1885, 2048 }, { 9, 1886, 2048 }, { 10, 1887, 2048 }, 547f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 1888, 2048 }, { 7, 1889, 2048 }, { 7, 1890, 2048 }, { 8, 1891, 2048 }, { 7, 1892, 2048 }, { 8, 1893, 2048 }, { 8, 1894, 2048 }, { 9, 1895, 2048 }, 548f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 7, 1896, 2048 }, { 8, 1897, 2048 }, { 8, 1898, 2048 }, { 9, 1899, 2048 }, { 8, 1900, 2048 }, { 9, 1901, 2048 }, { 9, 1902, 2048 }, { 10, 1903, 2048 }, 549f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 7, 1904, 2048 }, { 8, 1905, 2048 }, { 8, 1906, 2048 }, { 9, 1907, 2048 }, { 8, 1908, 2048 }, { 9, 1909, 2048 }, { 9, 1910, 2048 }, { 10, 1911, 2048 }, 550f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 8, 1912, 2048 }, { 9, 1913, 2048 }, { 9, 1914, 2048 }, { 10, 1915, 2048 }, { 9, 1916, 2048 }, { 10, 1917, 2048 }, { 10, 1918, 2048 }, { 11, 1919, 2048 }, 551f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 5, 1920, 2048 }, { 6, 1921, 2048 }, { 6, 1922, 2048 }, { 7, 1923, 2048 }, { 6, 1924, 2048 }, { 7, 1925, 2048 }, { 7, 1926, 2048 }, { 8, 1927, 2048 }, 552f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 1928, 2048 }, { 7, 1929, 2048 }, { 7, 1930, 2048 }, { 8, 1931, 2048 }, { 7, 1932, 2048 }, { 8, 1933, 2048 }, { 8, 1934, 2048 }, { 9, 1935, 2048 }, 553f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 1936, 2048 }, { 7, 1937, 2048 }, { 7, 1938, 2048 }, { 8, 1939, 2048 }, { 7, 1940, 2048 }, { 8, 1941, 2048 }, { 8, 1942, 2048 }, { 9, 1943, 2048 }, 554f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 7, 1944, 2048 }, { 8, 1945, 2048 }, { 8, 1946, 2048 }, { 9, 1947, 2048 }, { 8, 1948, 2048 }, { 9, 1949, 2048 }, { 9, 1950, 2048 }, { 10, 1951, 2048 }, 555f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 1952, 2048 }, { 7, 1953, 2048 }, { 7, 1954, 2048 }, { 8, 1955, 2048 }, { 7, 1956, 2048 }, { 8, 1957, 2048 }, { 8, 1958, 2048 }, { 9, 1959, 2048 }, 556f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 7, 1960, 2048 }, { 8, 1961, 2048 }, { 8, 1962, 2048 }, { 9, 1963, 2048 }, { 8, 1964, 2048 }, { 9, 1965, 2048 }, { 9, 1966, 2048 }, { 10, 1967, 2048 }, 557f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 7, 1968, 2048 }, { 8, 1969, 2048 }, { 8, 1970, 2048 }, { 9, 1971, 2048 }, { 8, 1972, 2048 }, { 9, 1973, 2048 }, { 9, 1974, 2048 }, { 10, 1975, 2048 }, 558f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 8, 1976, 2048 }, { 9, 1977, 2048 }, { 9, 1978, 2048 }, { 10, 1979, 2048 }, { 9, 1980, 2048 }, { 10, 1981, 2048 }, { 10, 1982, 2048 }, { 11, 1983, 2048 }, 559f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 6, 1984, 2048 }, { 7, 1985, 2048 }, { 7, 1986, 2048 }, { 8, 1987, 2048 }, { 7, 1988, 2048 }, { 8, 1989, 2048 }, { 8, 1990, 2048 }, { 9, 1991, 2048 }, 560f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 7, 1992, 2048 }, { 8, 1993, 2048 }, { 8, 1994, 2048 }, { 9, 1995, 2048 }, { 8, 1996, 2048 }, { 9, 1997, 2048 }, { 9, 1998, 2048 }, { 10, 1999, 2048 }, 561f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 7, 2000, 2048 }, { 8, 2001, 2048 }, { 8, 2002, 2048 }, { 9, 2003, 2048 }, { 8, 2004, 2048 }, { 9, 2005, 2048 }, { 9, 2006, 2048 }, { 10, 2007, 2048 }, 562f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 8, 2008, 2048 }, { 9, 2009, 2048 }, { 9, 2010, 2048 }, { 10, 2011, 2048 }, { 9, 2012, 2048 }, { 10, 2013, 2048 }, { 10, 2014, 2048 }, { 11, 2015, 2048 }, 563f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 7, 2016, 2048 }, { 8, 2017, 2048 }, { 8, 2018, 2048 }, { 9, 2019, 2048 }, { 8, 2020, 2048 }, { 9, 2021, 2048 }, { 9, 2022, 2048 }, { 10, 2023, 2048 }, 564f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 8, 2024, 2048 }, { 9, 2025, 2048 }, { 9, 2026, 2048 }, { 10, 2027, 2048 }, { 9, 2028, 2048 }, { 10, 2029, 2048 }, { 10, 2030, 2048 }, { 11, 2031, 2048 }, 565f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 8, 2032, 2048 }, { 9, 2033, 2048 }, { 9, 2034, 2048 }, { 10, 2035, 2048 }, { 9, 2036, 2048 }, { 10, 2037, 2048 }, { 10, 2038, 2048 }, { 11, 2039, 2048 }, 566f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project { 9, 2040, 2048 }, { 10, 2041, 2048 }, { 10, 2042, 2048 }, { 11, 2043, 2048 }, { 10, 2044, 2048 }, { 11, 2045, 2048 }, { 11, 2046, 2048 }, { 12, 2047, 2048 }, 567f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 568f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 569f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 570f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 571f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 572f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 573f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}; 574f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 575f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* find a hole and free as required */ 576f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int find_hole(void) 577f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{ 578f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project unsigned x; 579f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project int y, z; 580f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (z = 0, y = INT_MAX, x = 0; x < FP_ENTRIES; x++) { 581f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (fp_cache[x].lru_count < y) { 582f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project z = x; 583f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project y = fp_cache[x].lru_count; 584f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 585f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 586f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 587f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* decrease all */ 588f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (x = 0; x < FP_ENTRIES; x++) { 589f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (fp_cache[x].lru_count > 3) { 590f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project --(fp_cache[x].lru_count); 591f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 592f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 593f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 594f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* free entry z */ 595f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (fp_cache[z].g) { 596f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (fp_cache[z].mu != NULL) { 597f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project mp_clear(fp_cache[z].mu); 598f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project fp_cache[z].mu = NULL; 599f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 600f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project ltc_ecc_del_point(fp_cache[z].g); 601f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project fp_cache[z].g = NULL; 602f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (x = 0; x < (1U<<FP_LUT); x++) { 603f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project ltc_ecc_del_point(fp_cache[z].LUT[x]); 604f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project fp_cache[z].LUT[x] = NULL; 605f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 606f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project fp_cache[z].lru_count = 0; 607f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 608f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return z; 609f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 610f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 611f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* determine if a base is already in the cache and if so, where */ 612f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int find_base(ecc_point *g) 613f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{ 614f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project int x; 615f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (x = 0; x < FP_ENTRIES; x++) { 616f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (fp_cache[x].g != NULL && 617f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project mp_cmp(fp_cache[x].g->x, g->x) == LTC_MP_EQ && 618f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project mp_cmp(fp_cache[x].g->y, g->y) == LTC_MP_EQ && 619f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project mp_cmp(fp_cache[x].g->z, g->z) == LTC_MP_EQ) { 620f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project break; 621f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 622f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 623f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (x == FP_ENTRIES) { 624f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project x = -1; 625f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 626f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return x; 627f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 628f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 629f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* add a new base to the cache */ 630f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int add_entry(int idx, ecc_point *g) 631f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{ 632f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project unsigned x, y; 633f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 634f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* allocate base and LUT */ 635f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project fp_cache[idx].g = ltc_ecc_new_point(); 636f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (fp_cache[idx].g == NULL) { 637f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return CRYPT_MEM; 638f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 639f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 640f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* copy x and y */ 641f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((mp_copy(g->x, fp_cache[idx].g->x) != CRYPT_OK) || 642f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project (mp_copy(g->y, fp_cache[idx].g->y) != CRYPT_OK) || 643f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project (mp_copy(g->z, fp_cache[idx].g->z) != CRYPT_OK)) { 644f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project ltc_ecc_del_point(fp_cache[idx].g); 645f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project fp_cache[idx].g = NULL; 646f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return CRYPT_MEM; 647f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 648f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 649f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (x = 0; x < (1U<<FP_LUT); x++) { 650f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project fp_cache[idx].LUT[x] = ltc_ecc_new_point(); 651f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (fp_cache[idx].LUT[x] == NULL) { 652f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (y = 0; y < x; y++) { 653f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project ltc_ecc_del_point(fp_cache[idx].LUT[y]); 654f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project fp_cache[idx].LUT[y] = NULL; 655f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 656f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project ltc_ecc_del_point(fp_cache[idx].g); 657f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project fp_cache[idx].g = NULL; 658f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project fp_cache[idx].lru_count = 0; 659f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return CRYPT_MEM; 660f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 661f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 662f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 663f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project fp_cache[idx].lru_count = 0; 664f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return CRYPT_OK; 665f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 666f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 667f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* build the LUT by spacing the bits of the input by #modulus/FP_LUT bits apart 668f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * 669f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * The algorithm builds patterns in increasing bit order by first making all 670f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * single bit input patterns, then all two bit input patterns and so on 671f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project */ 672f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int build_lut(int idx, void *modulus, void *mp, void *mu) 673f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{ 674f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project unsigned x, y, err, bitlen, lut_gap; 675f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project void *tmp; 676f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 677f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project tmp = NULL; 678f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 679f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* sanity check to make sure lut_order table is of correct size, should compile out to a NOP if true */ 680f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((sizeof(lut_orders) / sizeof(lut_orders[0])) < (1U<<FP_LUT)) { 681f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project err = CRYPT_INVALID_ARG; 682f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project goto DONE; 683f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 684f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 685f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* get bitlen and round up to next multiple of FP_LUT */ 686f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project bitlen = mp_unsigned_bin_size(modulus) << 3; 687f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project x = bitlen % FP_LUT; 688f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (x) { 689f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project bitlen += FP_LUT - x; 690f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 691f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project lut_gap = bitlen / FP_LUT; 692f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 693f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* init the mu */ 694f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = mp_init_copy(&fp_cache[idx].mu, mu)) != CRYPT_OK) { 695f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project goto ERR; 696f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 697f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 698f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* copy base */ 699f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((mp_mulmod(fp_cache[idx].g->x, mu, modulus, fp_cache[idx].LUT[1]->x) != CRYPT_OK) || 700f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project (mp_mulmod(fp_cache[idx].g->y, mu, modulus, fp_cache[idx].LUT[1]->y) != CRYPT_OK) || 701f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project (mp_mulmod(fp_cache[idx].g->z, mu, modulus, fp_cache[idx].LUT[1]->z) != CRYPT_OK)) { goto ERR; } 702f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 703f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* make all single bit entries */ 704f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (x = 1; x < FP_LUT; x++) { 705f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((mp_copy(fp_cache[idx].LUT[1<<(x-1)]->x, fp_cache[idx].LUT[1<<x]->x) != CRYPT_OK) || 706f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project (mp_copy(fp_cache[idx].LUT[1<<(x-1)]->y, fp_cache[idx].LUT[1<<x]->y) != CRYPT_OK) || 707f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project (mp_copy(fp_cache[idx].LUT[1<<(x-1)]->z, fp_cache[idx].LUT[1<<x]->z) != CRYPT_OK)) { goto ERR; } 708f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 709f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* now double it bitlen/FP_LUT times */ 710f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (y = 0; y < lut_gap; y++) { 711f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = ltc_mp.ecc_ptdbl(fp_cache[idx].LUT[1<<x], fp_cache[idx].LUT[1<<x], modulus, mp)) != CRYPT_OK) { 712f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project goto ERR; 713f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 714f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 715f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 716f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 717f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* now make all entries in increase order of hamming weight */ 718f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (x = 2; x <= FP_LUT; x++) { 719f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (y = 0; y < (1UL<<FP_LUT); y++) { 720f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (lut_orders[y].ham != (int)x) continue; 721f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 722f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* perform the add */ 723f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = ltc_mp.ecc_ptadd(fp_cache[idx].LUT[lut_orders[y].terma], fp_cache[idx].LUT[lut_orders[y].termb], 724f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project fp_cache[idx].LUT[y], modulus, mp)) != CRYPT_OK) { 725f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project goto ERR; 726f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 727f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 728f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 729f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 730f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* now map all entries back to affine space to make point addition faster */ 731f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = mp_init(&tmp)) != CRYPT_OK) { goto ERR; } 732f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (x = 1; x < (1UL<<FP_LUT); x++) { 733f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* convert z to normal from montgomery */ 734f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = mp_montgomery_reduce(fp_cache[idx].LUT[x]->z, modulus, mp)) != CRYPT_OK) { goto ERR; } 735f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 736f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* invert it */ 737f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = mp_invmod(fp_cache[idx].LUT[x]->z, modulus, fp_cache[idx].LUT[x]->z)) != CRYPT_OK) { goto ERR; } 738f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 739f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* now square it */ 740f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = mp_sqrmod(fp_cache[idx].LUT[x]->z, modulus, tmp)) != CRYPT_OK) { goto ERR; } 741f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 742f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* fix x */ 743f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = mp_mulmod(fp_cache[idx].LUT[x]->x, tmp, modulus, fp_cache[idx].LUT[x]->x)) != CRYPT_OK) { goto ERR; } 744f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 745f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* get 1/z^3 */ 746f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = mp_mulmod(tmp, fp_cache[idx].LUT[x]->z, modulus, tmp)) != CRYPT_OK) { goto ERR; } 747f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 748f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* fix y */ 749f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = mp_mulmod(fp_cache[idx].LUT[x]->y, tmp, modulus, fp_cache[idx].LUT[x]->y)) != CRYPT_OK) { goto ERR; } 750f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 751f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* free z */ 752f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project mp_clear(fp_cache[idx].LUT[x]->z); 753f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project fp_cache[idx].LUT[x]->z = NULL; 754f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 755f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project mp_clear(tmp); 756f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 757f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return CRYPT_OK; 758f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source ProjectERR: 759f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project err = CRYPT_MEM; 760f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source ProjectDONE: 761f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (y = 0; y < (1U<<FP_LUT); y++) { 762f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project ltc_ecc_del_point(fp_cache[idx].LUT[y]); 763f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project fp_cache[idx].LUT[y] = NULL; 764f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 765f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project ltc_ecc_del_point(fp_cache[idx].g); 766f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project fp_cache[idx].g = NULL; 767f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project fp_cache[idx].lru_count = 0; 768f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (fp_cache[idx].mu != NULL) { 769f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project mp_clear(fp_cache[idx].mu); 770f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project fp_cache[idx].mu = NULL; 771f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 772f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (tmp != NULL) { 773f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project mp_clear(tmp); 774f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 775f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return err; 776f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 777f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 778f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* perform a fixed point ECC mulmod */ 779f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int accel_fp_mul(int idx, void *k, ecc_point *R, void *modulus, void *mp, int map) 780f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{ 781f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project unsigned char kb[128]; 782f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project int x; 783f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project unsigned y, z, err, bitlen, bitpos, lut_gap, first; 784f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project void *tk, *order; 785f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 786f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* if it's smaller than modulus we fine */ 787f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (mp_unsigned_bin_size(k) > mp_unsigned_bin_size(modulus)) { 788f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* find order */ 789f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project y = mp_unsigned_bin_size(modulus); 790f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (x = 0; ltc_ecc_sets[x].size; x++) { 791f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (y <= (unsigned)ltc_ecc_sets[x].size) break; 792f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 793f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 794f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* back off if we are on the 521 bit curve */ 795f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (y == 66) --x; 796f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 797f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = mp_init(&order)) != CRYPT_OK) { 798f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return err; 799f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 800f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = mp_read_radix(order, ltc_ecc_sets[x].order, 16)) != CRYPT_OK) { 801f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project mp_clear(&order); 802f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return err; 803f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 804f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 805f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* k must be less than modulus */ 806f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (mp_cmp(k, order) != LTC_MP_LT) { 807f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = mp_init(&tk)) != CRYPT_OK) { 808f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project mp_clear(order); 809f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return err; 810f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 811f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = mp_mod(k, order, tk)) != CRYPT_OK) { 812f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project mp_clear(tk); 813f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project mp_clear(order); 814f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return err; 815f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 816f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } else { 817f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project tk = k; 818f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 819f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project mp_clear(order); 820f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } else { 821f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project tk = k; 822f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 823f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 824f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* get bitlen and round up to next multiple of FP_LUT */ 825f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project bitlen = mp_unsigned_bin_size(modulus) << 3; 826f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project x = bitlen % FP_LUT; 827f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (x) { 828f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project bitlen += FP_LUT - x; 829f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 830f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project lut_gap = bitlen / FP_LUT; 831f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 832f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* get the k value */ 833f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (mp_unsigned_bin_size(tk) > (sizeof(kb) - 2)) { 834f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (tk != k) { 835f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project mp_clear(tk); 836f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 837f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return CRYPT_BUFFER_OVERFLOW; 838f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 839f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 840f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* store k */ 841f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project zeromem(kb, sizeof(kb)); 842f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = mp_to_unsigned_bin(tk, kb)) != CRYPT_OK) { 843f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (tk != k) { 844f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project mp_clear(tk); 845f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 846f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return err; 847f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 848f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 849f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* let's reverse kb so it's little endian */ 850f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project x = 0; 851f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project y = mp_unsigned_bin_size(tk) - 1; 852f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (tk != k) { 853f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project mp_clear(tk); 854f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 855f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project while ((unsigned)x < y) { 856f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project z = kb[x]; kb[x] = kb[y]; kb[y] = z; 857f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project ++x; --y; 858f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 859f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 860f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* at this point we can start, yipee */ 861f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project first = 1; 862f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (x = lut_gap-1; x >= 0; x--) { 863f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* extract FP_LUT bits from kb spread out by lut_gap bits and offset by x bits from the start */ 864f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project bitpos = x; 865f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (y = z = 0; y < FP_LUT; y++) { 866f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project z |= ((kb[bitpos>>3] >> (bitpos&7)) & 1) << y; 867f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project bitpos += lut_gap; /* it's y*lut_gap + x, but here we can avoid the mult in each loop */ 868f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 869f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 870f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* double if not first */ 871f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (!first) { 872f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = ltc_mp.ecc_ptdbl(R, R, modulus, mp)) != CRYPT_OK) { 873f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return err; 874f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 875f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 876f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 877f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* add if not first, otherwise copy */ 878f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (!first && z) { 879f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = ltc_mp.ecc_ptadd(R, fp_cache[idx].LUT[z], R, modulus, mp)) != CRYPT_OK) { 880f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return err; 881f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 882f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } else if (z) { 883f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((mp_copy(fp_cache[idx].LUT[z]->x, R->x) != CRYPT_OK) || 884f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project (mp_copy(fp_cache[idx].LUT[z]->y, R->y) != CRYPT_OK) || 885f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project (mp_copy(fp_cache[idx].mu, R->z) != CRYPT_OK)) { return CRYPT_MEM; } 886f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project first = 0; 887f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 888f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 889f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project z = 0; 890f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project zeromem(kb, sizeof(kb)); 891f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* map R back from projective space */ 892f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (map) { 893f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project err = ltc_ecc_map(R, modulus, mp); 894f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } else { 895f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project err = CRYPT_OK; 896f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 897f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return err; 898f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 899f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 900f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_ECC_SHAMIR 901f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* perform a fixed point ECC mulmod */ 902f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int accel_fp_mul2add(int idx1, int idx2, 903f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project void *kA, void *kB, 904f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project ecc_point *R, void *modulus, void *mp) 905f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{ 906f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project unsigned char kb[2][128]; 907f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project int x; 908f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project unsigned y, z, err, bitlen, bitpos, lut_gap, first, zA, zB; 909f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project void *tka, *tkb, *order; 910f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 911f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* if it's smaller than modulus we fine */ 912f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (mp_unsigned_bin_size(kA) > mp_unsigned_bin_size(modulus)) { 913f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* find order */ 914f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project y = mp_unsigned_bin_size(modulus); 915f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (x = 0; ltc_ecc_sets[x].size; x++) { 916f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (y <= (unsigned)ltc_ecc_sets[x].size) break; 917f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 918f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 919f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* back off if we are on the 521 bit curve */ 920f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (y == 66) --x; 921f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 922f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = mp_init(&order)) != CRYPT_OK) { 923f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return err; 924f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 925f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = mp_read_radix(order, ltc_ecc_sets[x].order, 16)) != CRYPT_OK) { 926f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project mp_clear(&order); 927f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return err; 928f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 929f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 930f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* kA must be less than modulus */ 931f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (mp_cmp(kA, order) != LTC_MP_LT) { 932f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = mp_init(&tka)) != CRYPT_OK) { 933f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project mp_clear(order); 934f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return err; 935f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 936f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = mp_mod(kA, order, tka)) != CRYPT_OK) { 937f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project mp_clear(tka); 938f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project mp_clear(order); 939f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return err; 940f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 941f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } else { 942f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project tka = kA; 943f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 944f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project mp_clear(order); 945f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } else { 946f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project tka = kA; 947f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 948f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 949f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* if it's smaller than modulus we fine */ 950f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (mp_unsigned_bin_size(kB) > mp_unsigned_bin_size(modulus)) { 951f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* find order */ 952f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project y = mp_unsigned_bin_size(modulus); 953f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (x = 0; ltc_ecc_sets[x].size; x++) { 954f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (y <= (unsigned)ltc_ecc_sets[x].size) break; 955f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 956f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 957f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* back off if we are on the 521 bit curve */ 958f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (y == 66) --x; 959f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 960f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = mp_init(&order)) != CRYPT_OK) { 961f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return err; 962f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 963f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = mp_read_radix(order, ltc_ecc_sets[x].order, 16)) != CRYPT_OK) { 964f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project mp_clear(&order); 965f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return err; 966f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 967f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 968f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* kB must be less than modulus */ 969f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (mp_cmp(kB, order) != LTC_MP_LT) { 970f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = mp_init(&tkb)) != CRYPT_OK) { 971f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project mp_clear(order); 972f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return err; 973f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 974f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = mp_mod(kB, order, tkb)) != CRYPT_OK) { 975f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project mp_clear(tkb); 976f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project mp_clear(order); 977f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return err; 978f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 979f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } else { 980f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project tkb = kB; 981f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 982f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project mp_clear(order); 983f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } else { 984f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project tkb = kB; 985f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 986f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 987f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* get bitlen and round up to next multiple of FP_LUT */ 988f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project bitlen = mp_unsigned_bin_size(modulus) << 3; 989f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project x = bitlen % FP_LUT; 990f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (x) { 991f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project bitlen += FP_LUT - x; 992f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 993f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project lut_gap = bitlen / FP_LUT; 994f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 995f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* get the k value */ 996f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((mp_unsigned_bin_size(tka) > (sizeof(kb[0]) - 2)) || (mp_unsigned_bin_size(tkb) > (sizeof(kb[0]) - 2)) ) { 997f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (tka != kA) { 998f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project mp_clear(tka); 999f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1000f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (tkb != kB) { 1001f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project mp_clear(tkb); 1002f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1003f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return CRYPT_BUFFER_OVERFLOW; 1004f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1005f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 1006f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* store k */ 1007f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project zeromem(kb, sizeof(kb)); 1008f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = mp_to_unsigned_bin(tka, kb[0])) != CRYPT_OK) { 1009f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (tka != kA) { 1010f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project mp_clear(tka); 1011f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1012f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (tkb != kB) { 1013f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project mp_clear(tkb); 1014f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1015f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return err; 1016f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1017f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 1018f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* let's reverse kb so it's little endian */ 1019f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project x = 0; 1020f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project y = mp_unsigned_bin_size(tka) - 1; 1021f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (tka != kA) { 1022f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project mp_clear(tka); 1023f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1024f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project while ((unsigned)x < y) { 1025f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project z = kb[0][x]; kb[0][x] = kb[0][y]; kb[0][y] = z; 1026f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project ++x; --y; 1027f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1028f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 1029f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* store b */ 1030f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = mp_to_unsigned_bin(tkb, kb[1])) != CRYPT_OK) { 1031f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (tkb != kB) { 1032f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project mp_clear(tkb); 1033f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1034f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return err; 1035f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1036f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 1037f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project x = 0; 1038f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project y = mp_unsigned_bin_size(tkb) - 1; 1039f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (tkb != kB) { 1040f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project mp_clear(tkb); 1041f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1042f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project while ((unsigned)x < y) { 1043f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project z = kb[1][x]; kb[1][x] = kb[1][y]; kb[1][y] = z; 1044f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project ++x; --y; 1045f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1046f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 1047f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* at this point we can start, yipee */ 1048f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project first = 1; 1049f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (x = lut_gap-1; x >= 0; x--) { 1050f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* extract FP_LUT bits from kb spread out by lut_gap bits and offset by x bits from the start */ 1051f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project bitpos = x; 1052f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (y = zA = zB = 0; y < FP_LUT; y++) { 1053f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project zA |= ((kb[0][bitpos>>3] >> (bitpos&7)) & 1) << y; 1054f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project zB |= ((kb[1][bitpos>>3] >> (bitpos&7)) & 1) << y; 1055f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project bitpos += lut_gap; /* it's y*lut_gap + x, but here we can avoid the mult in each loop */ 1056f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1057f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 1058f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* double if not first */ 1059f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (!first) { 1060f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = ltc_mp.ecc_ptdbl(R, R, modulus, mp)) != CRYPT_OK) { 1061f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return err; 1062f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1063f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1064f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 1065f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* add if not first, otherwise copy */ 1066f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (!first) { 1067f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (zA) { 1068f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = ltc_mp.ecc_ptadd(R, fp_cache[idx1].LUT[zA], R, modulus, mp)) != CRYPT_OK) { 1069f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return err; 1070f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1071f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1072f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (zB) { 1073f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = ltc_mp.ecc_ptadd(R, fp_cache[idx2].LUT[zB], R, modulus, mp)) != CRYPT_OK) { 1074f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return err; 1075f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1076f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1077f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } else { 1078f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (zA) { 1079f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((mp_copy(fp_cache[idx1].LUT[zA]->x, R->x) != CRYPT_OK) || 1080f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project (mp_copy(fp_cache[idx1].LUT[zA]->y, R->y) != CRYPT_OK) || 1081f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project (mp_copy(fp_cache[idx1].mu, R->z) != CRYPT_OK)) { return CRYPT_MEM; } 1082f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project first = 0; 1083f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1084f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (zB && first == 0) { 1085f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (zB) { 1086f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = ltc_mp.ecc_ptadd(R, fp_cache[idx2].LUT[zB], R, modulus, mp)) != CRYPT_OK) { 1087f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return err; 1088f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1089f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1090f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } else if (zB && first == 1) { 1091f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((mp_copy(fp_cache[idx2].LUT[zB]->x, R->x) != CRYPT_OK) || 1092f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project (mp_copy(fp_cache[idx2].LUT[zB]->y, R->y) != CRYPT_OK) || 1093f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project (mp_copy(fp_cache[idx2].mu, R->z) != CRYPT_OK)) { return CRYPT_MEM; } 1094f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project first = 0; 1095f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1096f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1097f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1098f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project zeromem(kb, sizeof(kb)); 1099f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return ltc_ecc_map(R, modulus, mp); 1100f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 1101f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 1102f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/** ECC Fixed Point mulmod global 1103f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @param k The multiplicand 1104f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @param G Base point to multiply 1105f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @param R [out] Destination of product 1106f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @param modulus The modulus for the curve 1107f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @param map [boolean] If non-zero maps the point back to affine co-ordinates, otherwise it's left in jacobian-montgomery form 1108f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @return CRYPT_OK if successful 1109f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project*/ 1110f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint ltc_ecc_fp_mul2add(ecc_point *A, void *kA, 1111f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project ecc_point *B, void *kB, 1112f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project ecc_point *C, void *modulus) 1113f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{ 1114f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project int idx1, idx2, err; 1115f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project void *mp, *mu; 1116f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 1117f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project mp = NULL; 1118f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project mu = NULL; 1119f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project LTC_MUTEX_LOCK(<c_ecc_fp_lock); 1120f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* find point */ 1121f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project idx1 = find_base(A); 1122f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 1123f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* no entry? */ 1124f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (idx1 == -1) { 1125f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* find hole and add it */ 1126f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project idx1 = find_hole(); 1127f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 1128f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = add_entry(idx1, A)) != CRYPT_OK) { 1129f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project goto LBL_ERR; 1130f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1131f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1132f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 1133f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* increment LRU */ 1134f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project ++(fp_cache[idx1].lru_count); 1135f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 1136f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* find point */ 1137f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project idx2 = find_base(B); 1138f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 1139f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* no entry? */ 1140f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (idx2 == -1) { 1141f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* find hole and add it */ 1142f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project idx2 = find_hole(); 1143f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 1144f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = add_entry(idx2, B)) != CRYPT_OK) { 1145f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project goto LBL_ERR; 1146f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1147f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1148f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 1149f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* increment LRU */ 1150f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project ++(fp_cache[idx2].lru_count); 1151f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 1152f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* if it's 2 build the LUT, if it's higher just use the LUT */ 1153f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (fp_cache[idx1].lru_count == 2) { 1154f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* compute mp */ 1155f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = mp_montgomery_setup(modulus, &mp)) != CRYPT_OK) { goto LBL_ERR; } 1156f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 1157f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* compute mu */ 1158f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = mp_init(&mu)) != CRYPT_OK) { 1159f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project goto LBL_ERR; 1160f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1161f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = mp_montgomery_normalization(mu, modulus)) != CRYPT_OK) { 1162f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project goto LBL_ERR; 1163f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1164f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 1165f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* build the LUT */ 1166f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = build_lut(idx1, modulus, mp, mu)) != CRYPT_OK) { 1167f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project goto LBL_ERR;; 1168f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1169f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1170f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 1171f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* if it's 2 build the LUT, if it's higher just use the LUT */ 1172f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (fp_cache[idx2].lru_count == 2) { 1173f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (mp == NULL) { 1174f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* compute mp */ 1175f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = mp_montgomery_setup(modulus, &mp)) != CRYPT_OK) { goto LBL_ERR; } 1176f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 1177f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* compute mu */ 1178f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = mp_init(&mu)) != CRYPT_OK) { 1179f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project goto LBL_ERR; 1180f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1181f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = mp_montgomery_normalization(mu, modulus)) != CRYPT_OK) { 1182f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project goto LBL_ERR; 1183f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1184f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1185f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 1186f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* build the LUT */ 1187f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = build_lut(idx2, modulus, mp, mu)) != CRYPT_OK) { 1188f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project goto LBL_ERR;; 1189f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1190f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1191f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 1192f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 1193f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (fp_cache[idx1].lru_count >= 2 && fp_cache[idx2].lru_count >= 2) { 1194f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (mp == NULL) { 1195f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* compute mp */ 1196f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = mp_montgomery_setup(modulus, &mp)) != CRYPT_OK) { goto LBL_ERR; } 1197f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1198f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project err = accel_fp_mul2add(idx1, idx2, kA, kB, C, modulus, mp); 1199f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } else { 1200f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project err = ltc_ecc_mul2add(A, kA, B, kB, C, modulus); 1201f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1202f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source ProjectLBL_ERR: 1203f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project LTC_MUTEX_UNLOCK(<c_ecc_fp_lock); 1204f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (mp != NULL) { 1205f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project mp_montgomery_free(mp); 1206f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1207f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (mu != NULL) { 1208f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project mp_clear(mu); 1209f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1210f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return err; 1211f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 1212f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 1213f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 1214f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/** ECC Fixed Point mulmod global 1215f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @param k The multiplicand 1216f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @param G Base point to multiply 1217f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @param R [out] Destination of product 1218f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @param modulus The modulus for the curve 1219f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @param map [boolean] If non-zero maps the point back to affine co-ordinates, otherwise it's left in jacobian-montgomery form 1220f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project @return CRYPT_OK if successful 1221f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project*/ 1222f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint ltc_ecc_fp_mulmod(void *k, ecc_point *G, ecc_point *R, void *modulus, int map) 1223f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{ 1224f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project int idx, err; 1225f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project void *mp, *mu; 1226f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 1227f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project mp = NULL; 1228f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project mu = NULL; 1229f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project LTC_MUTEX_LOCK(<c_ecc_fp_lock); 1230f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* find point */ 1231f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project idx = find_base(G); 1232f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 1233f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* no entry? */ 1234f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (idx == -1) { 1235f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* find hole and add it */ 1236f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project idx = find_hole(); 1237f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 1238f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = add_entry(idx, G)) != CRYPT_OK) { 1239f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project goto LBL_ERR; 1240f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1241f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1242f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 1243f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* increment LRU */ 1244f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project ++(fp_cache[idx].lru_count); 1245f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 1246f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* if it's 2 build the LUT, if it's higher just use the LUT */ 1247f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (fp_cache[idx].lru_count == 2) { 1248f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* compute mp */ 1249f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = mp_montgomery_setup(modulus, &mp)) != CRYPT_OK) { goto LBL_ERR; } 1250f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 1251f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* compute mu */ 1252f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = mp_init(&mu)) != CRYPT_OK) { 1253f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project goto LBL_ERR; 1254f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1255f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = mp_montgomery_normalization(mu, modulus)) != CRYPT_OK) { 1256f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project goto LBL_ERR; 1257f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1258f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 1259f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* build the LUT */ 1260f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = build_lut(idx, modulus, mp, mu)) != CRYPT_OK) { 1261f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project goto LBL_ERR;; 1262f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1263f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1264f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 1265f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (fp_cache[idx].lru_count >= 2) { 1266f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (mp == NULL) { 1267f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project /* compute mp */ 1268f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if ((err = mp_montgomery_setup(modulus, &mp)) != CRYPT_OK) { goto LBL_ERR; } 1269f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1270f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project err = accel_fp_mul(idx, k, R, modulus, mp, map); 1271f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } else { 1272f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project err = ltc_ecc_mulmod(k, G, R, modulus, map); 1273f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1274f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source ProjectLBL_ERR: 1275f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project LTC_MUTEX_UNLOCK(<c_ecc_fp_lock); 1276f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (mp != NULL) { 1277f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project mp_montgomery_free(mp); 1278f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1279f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (mu != NULL) { 1280f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project mp_clear(mu); 1281f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1282f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project return err; 1283f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 1284f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 1285f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/** Free the Fixed Point tables */ 1286f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectvoid ltc_ecc_fp_free(void) 1287f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{ 1288f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project unsigned x, y; 1289f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project LTC_MUTEX_LOCK(<c_ecc_fp_lock); 1290f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (x = 0; x < FP_ENTRIES; x++) { 1291f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (fp_cache[x].g != NULL) { 1292f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project for (y = 0; y < (1U<<FP_LUT); y++) { 1293f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project ltc_ecc_del_point(fp_cache[x].LUT[y]); 1294f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project fp_cache[x].LUT[y] = NULL; 1295f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1296f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project ltc_ecc_del_point(fp_cache[x].g); 1297f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project fp_cache[x].g = NULL; 1298f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project if (fp_cache[x].mu != NULL) { 1299f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project mp_clear(fp_cache[x].mu); 1300f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project fp_cache[x].mu = NULL; 1301f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1302f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project fp_cache[x].lru_count = 0; 1303f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1304f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project } 1305f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project LTC_MUTEX_UNLOCK(<c_ecc_fp_lock); 1306f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project} 1307f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 1308f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif 1309f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 1310f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 1311f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Source: /cvs/libtom/libtomcrypt/src/math/fp/ltc_ecc_fp_mulmod.c,v $ */ 1312f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Revision: 1.27 $ */ 1313f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Date: 2006/12/03 00:39:56 $ */ 1314f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project 1315