crypto: Add support to get the SAS emoji out of a verification.

master
Damir Jelić 2020-07-22 16:41:16 +02:00
parent cdcbcdfab3
commit 4ce26f4fa0
1 changed files with 101 additions and 5 deletions

View File

@ -57,6 +57,76 @@ impl<S> Sas<S> {
} }
} }
fn get_emoji(index: u8) -> (&'static str, &'static str) {
match index {
0 => ("🐶", "Dog"),
1 => ("🐱", "Cat"),
2 => ("🦁", "Lion"),
3 => ("🐎", "Horse"),
4 => ("🦄", "Unicorn"),
5 => ("🐷", "Pig"),
6 => ("🐘", "Elephant"),
7 => ("🐰", "Rabbit"),
8 => ("🐼", "Panda"),
9 => ("🐓", "Rooster"),
10 => ("🐧", "Penguin"),
11 => ("🐢", "Turtle"),
12 => ("🐟", "Fish"),
13 => ("🐙", "Octopus"),
14 => ("🦋", "Butterfly"),
15 => ("🌷", "Flower"),
16 => ("🌳", "Tree"),
17 => ("🌵", "Cactus"),
18 => ("🍄", "Mushroom"),
19 => ("🌏", "Globe"),
20 => ("🌙", "Moon"),
21 => ("☁️", "Cloud"),
22 => ("🔥", "Fire"),
23 => ("🍌", "Banana"),
24 => ("🍎", "Apple"),
25 => ("🍓", "Strawberry"),
26 => ("🌽", "Corn"),
27 => ("🍕", "Pizza"),
28 => ("🎂", "Cake"),
29 => ("❤️", "Heart"),
30 => ("😀", "Smiley"),
31 => ("🤖", "Robot"),
32 => ("🎩", "Hat"),
33 => ("👓", "Glasses"),
34 => ("🔧", "Spanner"),
35 => ("🎅", "Santa"),
36 => ("👍", "Thumbs up"),
37 => ("☂️", "Umbrella"),
38 => ("", "Hourglass"),
39 => ("", "Clock"),
40 => ("🎁", "Gift"),
41 => ("💡", "Light Bulb"),
42 => ("📕", "Book"),
43 => ("✏️", "Pencil"),
44 => ("📎", "Paperclip"),
45 => ("✂️", "Scissors"),
46 => ("🔒", "Lock"),
47 => ("🔑", "Key"),
48 => ("🔨", "Hammer"),
49 => ("☎️", "Telephone"),
50 => ("🏁", "Flag"),
51 => ("🚂", "Train"),
52 => ("🚲", "Bicycle"),
53 => ("✈️", "Airplane"),
54 => ("🚀", "Rocket"),
55 => ("🏆", "Trophy"),
56 => ("", "Ball"),
57 => ("🎸", "Guitar"),
58 => ("🎺", "Trumpet"),
59 => ("🔔", "Bell"),
60 => ("", "Anchor"),
61 => ("🎧", "Headphones"),
62 => ("📁", "Folder"),
63 => ("📌", "Pin"),
_ => panic!("Trying to fetch an SAS emoji outside the allowed range"),
}
}
impl Sas<Created> { impl Sas<Created> {
fn new(own_user_id: UserId, own_device_id: &DeviceId, other_device: Device) -> Sas<Created> { fn new(own_user_id: UserId, own_device_id: &DeviceId, other_device: Device) -> Sas<Created> {
let verification_flow_id = Uuid::new_v4().to_string(); let verification_flow_id = Uuid::new_v4().to_string();
@ -247,17 +317,42 @@ impl Sas<KeyReceived> {
} }
} }
fn get_emoji(&self) -> Vec<(String, String)> { fn get_emoji(&self) -> Vec<(&'static str, &'static str)> {
todo!() let bytes: Vec<u64> = self
.inner
.generate_bytes(&self.extra_info(), 6)
.expect("Can't generate bytes")
.into_iter()
.map(|b| b as u64)
.collect();
let mut num: u64 = bytes[0] << 40;
num += bytes[1] << 32;
num += bytes[2] << 24;
num += bytes[3] << 16;
num += bytes[4] << 8;
num += bytes[5];
let numbers = vec![
((num >> 42) & 63) as u8,
((num >> 36) & 63) as u8,
((num >> 30) & 63) as u8,
((num >> 24) & 63) as u8,
((num >> 18) & 63) as u8,
((num >> 12) & 63) as u8,
((num >> 6) & 63) as u8,
];
numbers.into_iter().map(get_emoji).collect()
} }
fn get_decimal(&self) -> (i32, i32, i32) { fn get_decimal(&self) -> (u32, u32, u32) {
let bytes: Vec<i32> = self let bytes: Vec<u32> = self
.inner .inner
.generate_bytes(&self.extra_info(), 5) .generate_bytes(&self.extra_info(), 5)
.expect("Can't generate bytes") .expect("Can't generate bytes")
.into_iter() .into_iter()
.map(|b| b as i32) .map(|b| b as u32)
.collect(); .collect();
let first = (bytes[0] << 5 | bytes[1] >> 3) + 1000; let first = (bytes[0] << 5 | bytes[1] >> 3) + 1000;
@ -383,5 +478,6 @@ mod test {
let alice = alice.into_key_received(&mut event); let alice = alice.into_key_received(&mut event);
assert_eq!(alice.get_decimal(), bob.get_decimal()); assert_eq!(alice.get_decimal(), bob.get_decimal());
assert_eq!(alice.get_emoji(), bob.get_emoji());
} }
} }