1- use super :: wallet:: Keys ;
21use utils:: crypto:: chacha20poly1305_ietf:: ChaCha20Poly1305IETF ;
2+ use errors:: wallet:: WalletQueryError ;
3+
4+ use super :: wallet:: Keys ;
35use super :: language:: { Operator , TargetValue , TagName } ;
46
57
68// Performs encryption of WQL query
79// WQL query is provided as top-level Operator
810// Recursively transforms operators using encrypt_operator function
9- pub ( super ) fn encrypt_query ( operator : Operator , keys : & Keys ) -> Operator {
10- operator. transform ( & |op : Operator | -> Operator { encrypt_operator ( op, keys) } )
11+ pub ( super ) fn encrypt_query ( operator : Operator , keys : & Keys ) -> Result < Operator , WalletQueryError > {
12+ operator. transform ( & |op : Operator | -> Result < Operator , WalletQueryError > { encrypt_operator ( op, keys) } )
1113}
1214
1315
14- fn encrypt_operator ( op : Operator , keys : & Keys ) -> Operator {
16+ fn encrypt_operator ( op : Operator , keys : & Keys ) -> Result < Operator , WalletQueryError > {
1517 match op {
1618 Operator :: Eq ( name, value) => {
17- let ( encrypted_name, encrypted_value) = encrypt_name_value ( & name, value, keys) ;
18- Operator :: Eq ( encrypted_name, encrypted_value)
19+ let ( encrypted_name, encrypted_value) = encrypt_name_value ( & name, value, keys) ? ;
20+ Ok ( Operator :: Eq ( encrypted_name, encrypted_value) )
1921 } ,
2022 Operator :: Neq ( name, value) => {
21- let ( encrypted_name, encrypted_value) = encrypt_name_value ( & name, value, keys) ;
22- Operator :: Neq ( encrypted_name, encrypted_value)
23+ let ( encrypted_name, encrypted_value) = encrypt_name_value ( & name, value, keys) ? ;
24+ Ok ( Operator :: Neq ( encrypted_name, encrypted_value) )
2325 } ,
2426 Operator :: Gt ( name, value) => {
25- let ( encrypted_name, encrypted_value) = encrypt_name_value ( & name, value, keys) ;
26- Operator :: Gt ( encrypted_name, encrypted_value)
27+ let ( encrypted_name, encrypted_value) = encrypt_name_value ( & name, value, keys) ? ;
28+ Ok ( Operator :: Gt ( encrypted_name, encrypted_value) )
2729 } ,
2830 Operator :: Gte ( name, value) => {
29- let ( encrypted_name, encrypted_value) = encrypt_name_value ( & name, value, keys) ;
30- Operator :: Gte ( encrypted_name, encrypted_value)
31+ let ( encrypted_name, encrypted_value) = encrypt_name_value ( & name, value, keys) ? ;
32+ Ok ( Operator :: Gte ( encrypted_name, encrypted_value) )
3133 } ,
3234 Operator :: Lt ( name, value) => {
33- let ( encrypted_name, encrypted_value) = encrypt_name_value ( & name, value, keys) ;
34- Operator :: Lt ( encrypted_name, encrypted_value)
35+ let ( encrypted_name, encrypted_value) = encrypt_name_value ( & name, value, keys) ? ;
36+ Ok ( Operator :: Lt ( encrypted_name, encrypted_value) )
3537 } ,
3638 Operator :: Lte ( name, value) => {
37- let ( encrypted_name, encrypted_value) = encrypt_name_value ( & name, value, keys) ;
38- Operator :: Lte ( encrypted_name, encrypted_value)
39+ let ( encrypted_name, encrypted_value) = encrypt_name_value ( & name, value, keys) ? ;
40+ Ok ( Operator :: Lte ( encrypted_name, encrypted_value) )
3941 } ,
4042 Operator :: Like ( name, value) => {
41- let ( encrypted_name, encrypted_value) = encrypt_name_value ( & name, value, keys) ;
42- Operator :: Like ( encrypted_name, encrypted_value)
43+ let ( encrypted_name, encrypted_value) = encrypt_name_value ( & name, value, keys) ? ;
44+ Ok ( Operator :: Like ( encrypted_name, encrypted_value) )
4345 } ,
4446 Operator :: Regex ( name, value) => {
45- let ( encrypted_name, encrypted_value) = encrypt_name_value ( & name, value, keys) ;
46- Operator :: Regex ( encrypted_name, encrypted_value)
47+ let ( encrypted_name, encrypted_value) = encrypt_name_value ( & name, value, keys) ? ;
48+ Ok ( Operator :: Regex ( encrypted_name, encrypted_value) )
4749 } ,
4850 Operator :: In ( name, values) => {
4951 let name = match name {
@@ -59,29 +61,29 @@ fn encrypt_operator(op: Operator, keys: &Keys) -> Operator {
5961 let mut encrypted_values: Vec < TargetValue > = Vec :: new ( ) ;
6062
6163 for value in values {
62- encrypted_values. push ( encrypt_name_value ( & name, value, keys) . 1 ) ;
64+ encrypted_values. push ( encrypt_name_value ( & name, value, keys) ? . 1 ) ;
6365 }
64- Operator :: In ( name, encrypted_values)
66+ Ok ( Operator :: In ( name, encrypted_values) )
6567 } ,
66- _ => op
68+ _ => Ok ( op )
6769 }
6870}
6971
7072
7173// Encrypts a single tag name, tag value pair.
7274// If the tag name is EncryptedTagName enum variant, encrypts both the tag name and the tag value
7375// If the tag name is PlainTagName enum variant, encrypts only the tag name
74- fn encrypt_name_value ( name : & TagName , value : TargetValue , keys : & Keys ) -> ( TagName , TargetValue ) {
76+ fn encrypt_name_value ( name : & TagName , value : TargetValue , keys : & Keys ) -> Result < ( TagName , TargetValue ) , WalletQueryError > {
7577 match ( name, value) {
7678 ( & TagName :: EncryptedTagName ( ref name) , TargetValue :: Unencrypted ( ref s) ) => {
7779 let encrypted_tag_name = ChaCha20Poly1305IETF :: encrypt_as_searchable ( & name[ ..] , & keys. tag_name_key , & keys. tags_hmac_key ) ;
7880 let encrypted_tag_value = ChaCha20Poly1305IETF :: encrypt_as_searchable ( s. as_bytes ( ) , & keys. tag_value_key , & keys. tags_hmac_key ) ;
79- ( TagName :: EncryptedTagName ( encrypted_tag_name) , TargetValue :: Encrypted ( encrypted_tag_value) )
81+ Ok ( ( TagName :: EncryptedTagName ( encrypted_tag_name) , TargetValue :: Encrypted ( encrypted_tag_value) ) )
8082 } ,
8183 ( & TagName :: PlainTagName ( ref name) , TargetValue :: Unencrypted ( ref s) ) => {
8284 let encrypted_tag_name = ChaCha20Poly1305IETF :: encrypt_as_searchable ( & name[ ..] , & keys. tag_name_key , & keys. tags_hmac_key ) ;
83- ( TagName :: PlainTagName ( encrypted_tag_name) , TargetValue :: Unencrypted ( s. clone ( ) ) )
85+ Ok ( ( TagName :: PlainTagName ( encrypted_tag_name) , TargetValue :: Unencrypted ( s. clone ( ) ) ) )
8486 } ,
85- _ => unreachable ! ( )
87+ _ => Err ( WalletQueryError :: StructureErr ( "Reached invalid combination of tag name and value while encrypting query" . to_string ( ) ) )
8688 }
8789}
0 commit comments