/** * Emoji alphabet for visual verification of shared secrets. * * This alphabet contains 256 distinct, easily recognizable emojis for * anti-spoofing verification. With 256 emojis, each emoji represents * exactly 8 bits of entropy (log2(256) = 8). * * A 3x3 grid of 9 emojis provides 72 bits of security (9 ร— 8 = 72 bits), * making brute-force attacks computationally infeasible for real-time * MITM verification scenarios. * * Selection criteria: * - Visually distinct from each other * - Commonly supported across platforms (Unicode 12+) * - Easy to recognize and compare at a glance * - No text-based or flag emojis (platform-dependent rendering) * - No variation selectors (base emojis only) * * @packageDocumentation */ /** * 256 distinct emojis for visual verification. * Index directly maps to byte value (0-255) for simple lookup. */ export const EMOJI_ALPHABET: readonly string[] = [ // 0-15: Faces & figures (16) '๐Ÿ˜€', '๐Ÿ˜Ž', '๐Ÿค–', '๐Ÿ‘ป', '๐Ÿ’€', '๐Ÿ‘ฝ', '๐Ÿคก', '๐ŸŽƒ', '๐Ÿ˜บ', '๐Ÿ˜ˆ', '๐Ÿ‘พ', '๐Ÿ—ฟ', '๐Ÿค ', '๐Ÿฅธ', '๐Ÿง', '๐Ÿ˜ต', // 16-47: Animals (32) '๐Ÿถ', '๐Ÿฑ', '๐Ÿธ', '๐Ÿต', '๐ŸฆŠ', '๐Ÿป', '๐Ÿฆ', '๐Ÿฏ', '๐Ÿฎ', '๐Ÿท', '๐Ÿ”', '๐Ÿง', '๐Ÿฆ‰', '๐Ÿฆ‡', '๐Ÿบ', '๐Ÿฆ„', '๐Ÿ˜', '๐Ÿฆ’', '๐ŸŠ', '๐Ÿฆˆ', '๐Ÿ™', '๐Ÿฆ‹', '๐Ÿข', '๐Ÿฆ€', '๐Ÿ', '๐Ÿฆ…', '๐Ÿฆ†', '๐Ÿณ', '๐Ÿฆญ', '๐Ÿฆฉ', '๐Ÿฆš', '๐Ÿ‰', // 48-63: Nature & weather (16) '๐ŸŒต', '๐ŸŒด', '๐ŸŒฒ', '๐ŸŒณ', '๐Ÿ„', '๐ŸŒ', '๐ŸŒ•', '๐ŸŒ™', '๐ŸŒŸ', '๐ŸŒˆ', '๐Ÿ”ฅ', '๐Ÿ’ง', '๐ŸŒจ', '๐Ÿ’ข', '๐ŸŒž', '๐ŸŒค', // 64-95: Food & drinks (32) '๐ŸŽ', '๐ŸŒ', '๐Ÿ‡', '๐Ÿ‰', '๐Ÿ“', '๐Ÿ', '๐Ÿฅ‘', '๐ŸŒฝ', '๐Ÿฅ•', '๐Ÿ”', '๐Ÿ•', '๐ŸŒฎ', '๐Ÿฃ', '๐Ÿช', '๐ŸŽ‚', '๐Ÿฉ', '๐Ÿบ', '๐Ÿท', '๐Ÿธ', '๐Ÿซ—', '๐Ÿงƒ', '๐Ÿฅ›', '๐Ÿต', '๐Ÿง', '๐Ÿซ', '๐Ÿฌ', '๐Ÿญ', '๐Ÿฅจ', '๐Ÿฅฏ', '๐Ÿฅž', '๐Ÿง‡', '๐Ÿฟ', // 96-127: Symbols & colors (32) '๐Ÿ’ฏ', '๐Ÿ’”', '๐Ÿ’ฅ', '๐Ÿ’ซ', '๐ŸŒ€', '๐Ÿซจ', '๐Ÿšง', '๐Ÿ›‘', '๐Ÿ”ด', '๐Ÿ”ต', '๐ŸŸข', '๐ŸŸก', '๐ŸŸฃ', 'โฌ›', 'โฌœ', '๐ŸŸค', '๐Ÿ’œ', '๐Ÿ’™', '๐Ÿ’š', '๐Ÿงก', '๐Ÿ–ค', '๐Ÿค', '๐Ÿ’˜', '๐Ÿ’', '๐Ÿ’Ž', '๐Ÿ‘‘', '๐ŸŽฉ', '๐Ÿงข', '๐Ÿชญ', '๐ŸŽ—', '๐ŸŽŸ', '๐Ÿท', // 128-159: Electronics & tools (32) '๐Ÿ•', '๐Ÿ“ฑ', '๐Ÿ’ป', '๐Ÿ–ฅ', '๐Ÿ“ท', '๐ŸŽฅ', '๐Ÿ“บ', '๐Ÿ“ป', '๐Ÿ”‹', '๐Ÿ’ก', '๐Ÿ”‘', '๐Ÿ”จ', '๐Ÿ› ', '๐Ÿงฒ', '๐Ÿงช', '๐Ÿ”ฌ', '๐Ÿ”ง', '๐Ÿช›', '๐Ÿ”ฉ', '๐Ÿชš', '๐Ÿช“', '๐Ÿงน', '๐Ÿชฃ', '๐Ÿงด', '๐Ÿ›', '๐Ÿšฝ', '๐Ÿชœ', '๐Ÿ””', '๐Ÿ•ฏ', '๐Ÿชค', '๐Ÿงฏ', '๐Ÿช', // 160-175: Transport (16) '๐Ÿš—', '๐ŸšŒ', '๐Ÿš“', '๐Ÿš‘', '๐Ÿš’', '๐Ÿšœ', '๐Ÿšฒ', '๐Ÿ', '๐Ÿ›ฉ', '๐Ÿš€', '๐Ÿ›ธ', '๐Ÿš', '๐Ÿšข', '๐Ÿšค', '๐Ÿš‚', '๐Ÿš ', // 176-191: Sports & games (16) '๐Ÿฅ…', '๐Ÿ€', '๐Ÿˆ', '๐Ÿ', '๐Ÿ“', '๐ŸŽฑ', '๐ŸŽฏ', '๐ŸŽณ', '๐ŸŽฒ', '๐ŸŽฎ', '๐Ÿ•น', '๐Ÿงฉ', '๐ŸŽด', '๐ŸŽฐ', '๐Ÿƒ', '๐Ÿ€„', // 192-207: Music & arts (16) '๐ŸŽธ', '๐ŸŽน', '๐ŸŽบ', '๐ŸŽป', '๐Ÿฅ', '๐ŸŽท', '๐ŸŽค', '๐ŸŽง', '๐ŸŽจ', '๐Ÿ–Œ', '๐ŸŽญ', '๐ŸŽช', '๐ŸŽฌ', '๐ŸŽผ', '๐Ÿช•', '๐Ÿช—', // 208-223: Buildings & places (16) '๐Ÿ ', '๐Ÿฐ', '๐Ÿ—ผ', '๐Ÿ—ฝ', '๐Ÿ›', '๐Ÿ•Œ', '๐Ÿ›•', '๐Ÿฏ', '๐ŸŽข', '๐ŸŽก', '๐Ÿ›–', '๐Ÿ•', '๐Ÿ—ป', '๐Ÿ', '๐ŸŒ‹', '๐Ÿœ', // 224-239: Science & medical (16) '๐Ÿ“ฆ', '๐Ÿงณ', '๐Ÿ•ฐ', '๐Ÿ”ฆ', '๐Ÿชซ', '๐Ÿ“ก', '๐Ÿ”ญ', '๐Ÿ”ฎ', '๐Ÿงฟ', '๐Ÿ“ฟ', '๐Ÿซ™', '๐Ÿ’‰', '๐Ÿฉบ', '๐Ÿฉน', '๐Ÿงฌ', '๐Ÿฆ ', // 240-255: Miscellaneous (16) '๐Ÿ†', '๐ŸŽ', '๐ŸŽˆ', '๐ŸŽ€', '๐Ÿช…', '๐Ÿงง', '๐Ÿ“จ', '๐Ÿ“œ', '๐Ÿ—ƒ', '๐Ÿ“Ž', '๐Ÿชก', '๐Ÿ–‹', '๐Ÿ“Œ', '๐Ÿ”', '๐Ÿงธ', '๐Ÿช†', ] as const; /** * Number of emojis in the alphabet. * Must be a power of 2 for clean bit mapping (256 = 2^8). */ export const EMOJI_ALPHABET_SIZE = 256; /** * Bits of entropy per emoji (log2 of alphabet size). */ export const BITS_PER_EMOJI = 8;