@@ -87,7 +87,8 @@ def export(self):
8787 "m" : self .m ,
8888 "F" : self .F .export (),
8989 "hash" : self .hash .export (),
90- "msk" : [[[int (vec2 [0 ]), int (vec2 [1 ])] for vec2 in vec ] for vec in self .msk ] if self .msk is not None else None
90+ "msk" : [[[int (vec2 [0 ]), int (vec2 [1 ])] for vec2 in vec ] for vec in
91+ self .msk ] if self .msk is not None else None
9192 }
9293
9394
@@ -132,6 +133,24 @@ def export(self):
132133 }
133134
134135
136+ class _FeDDHMultiClient_SK_Safe :
137+ def __init__ (self , y : List [List [int ]], td : Tuple [int , int ]):
138+ """
139+ Initialize FeDDHMultiClient decryption key
140+
141+ :param y: Function vector
142+ :param td: g1 * <msk, y>, g2 * <msk, y>
143+ """
144+ self .y = y
145+ self .td = td
146+
147+ def export (self ):
148+ return {
149+ "y" : self .y ,
150+ "d" : self .d
151+ }
152+
153+
135154class _FeDDHMultiClient_C :
136155 def __init__ (self , tag : bytes , c : List [GroupElem ]):
137156 """
@@ -221,6 +240,26 @@ def decrypt(c: List[_FeDDHMultiClient_C], tag: bytes,
221240 cul = cul - (sk .d [0 ] * u1 + sk .d [1 ] * u2 )
222241 return discrete_log_bound (cul , key .g , bound )
223242
243+ @staticmethod
244+ def decrypt_safe (c : List [_FeDDHMultiClient_C ], key : _FeDDHMultiClient_MK , sk : _FeDDHMultiClient_SK_Safe ,
245+ bound : Tuple [int , int ]) -> int :
246+ """
247+ Decrypt FeDDHMultiClient cipher text
248+
249+ :param c: FeDDHMultiClient cipher text
250+ :param key: FeDDHMultiClient public key
251+ :param sk: FeDDHMultiClient decryption key
252+ :param bound: Bound for the discrete log problem
253+ :return: Decrypted message
254+ """
255+ cul = key .F .identity ()
256+
257+ for i in range (key .n ):
258+ cul = cul + inner_product (c [i ].c , sk .y [i ], key .F .identity ())
259+
260+ cul = cul - (sk .td [0 ] + sk .td [1 ])
261+ return discrete_log_bound (cul , key .g , bound )
262+
224263 @staticmethod
225264 def keygen (y : List [List [int ]], key : _FeDDHMultiClient_MK ) -> _FeDDHMultiClient_SK :
226265 """
@@ -244,3 +283,19 @@ def keygen(y: List[List[int]], key: _FeDDHMultiClient_MK) -> _FeDDHMultiClient_S
244283
245284 d = (cul_1 , cul_2 )
246285 return _FeDDHMultiClient_SK (y , d )
286+
287+ @staticmethod
288+ def keygen_safe (y : List [List [int ]], key : _FeDDHMultiClient_MK , tag : bytes ) -> _FeDDHMultiClient_SK_Safe :
289+ """
290+ Generate a safe FeDDHMultiClient decryption key
291+
292+ :param y: Function vector
293+ :param key: FeDDHMultiClient master key
294+ :param tag: Tag for the decryption key
295+ :return: FeDDHMultiClient decryption key
296+ """
297+ normal_key = FeDDHMultiClient .keygen (y , key )
298+ u1 , u2 = key .hash (tag )
299+ u1 , u2 = key .g * u1 , key .g * u2
300+ td = (u1 * normal_key .d [0 ], u2 * normal_key .d [1 ])
301+ return _FeDDHMultiClient_SK_Safe (y , td )
0 commit comments