/**********************************************************************/ /*** ***/ /*** KEY AGREEMENT ALGORITHM ***/ /*** SIMPLIFIED SECURE SPREAD ***/ /*** ***/ /*** ***/ /*** Based on "Exploring Robustness in Group Key Agreement" ***/ /*** by Amir, Kim, Nita-Rotaru, Schultz, Stanton, and Tsudik ***/ /**********************************************************************/ /**********************************************************************/ /*** DATATYPES ***/ /*** ***/ /**********************************************************************/ TYPESPEC MSGTYPES; TYPES MsgType: Field; CONSTANTS Membership: MsgType; PartialToken: MsgType; FinalToken: MsgType; KeyList: MsgType; FactorOut: MsgType; Trans_Signal_Msg: MsgType; END; TYPESPEC PRINCIPALARRAY; TYPES SParray[ ]: Principal; END; TYPESPEC SpreadARRAY; FUNCTIONS minus(SParray,SParray): SParray; next(Principal,SParray): Principal; alone(Principal,SParray): Boolean; isin(Principal,SParray): Boolean; pos(Principal,SParray): Nat; add(Principal,SParray): SParray; setequal(SParray,SParray): Boolean; CONSTANTS panull: SParray; VARIABLES PA: SParray; P: Principal; I: Nat; AXIOMS alone(P,<
>);
IF isin(P,PA) THEN PA[pos(P,PA)] = P ENDIF;
/* need more axioms here */
END;
/**********************************************************************/
/*** CLIQUES datatypes ***/
/*** GML: array of CLQ_GM entries. For each CLQ_GM, there ***/
/*** are member_name, shared_key, and last_partial_key ***/
/*** defined ***/
/**********************************************************************/
TYPESPEC CLQ_CTX;
TYPES CLQ_CTX: GroupMember,MUTEX;
CONSTANTS g: Skey;
ATTRIBUTES
p: Nat; /* position in group_members_list */
Np: Skey; /* Mi's session random number */
Ks: Skey; /* current group shared key */
M: SParray; /* member list */
KL: Sarray; /* key list */
PT: Skey; /* Partial token */
FT: Skey; /* Final token */
END;
TYPESPEC GKA_CTX;
TYPES GKA_CTX: CLQ_CTX;
ATTRIBUTES
/* current membership information */
mb_id: Nat; /* group view unique id */
/* mb_set: SParray; this should be the same as M */
vs_set: SParray;
merge_set: SParray;
leave_set: SParray;
Me: Principal; /* assume initialized to owner */
END;
TYPESPEC LastCTX;
TYPES LastCTX: GKA_CTX;
ATTRIBUTES
FO: Sarray;
FMlist: SParray;
m: Principal;
END;
/**********************************************************************/
/*** MEMBERSHIP protocol ***/
/*** Roles: Alone, New, Chosen, Last, Other ***/
/**********************************************************************/
PROTOCOL Membership;
ROLE Alone: GKA_CTX;
MESSAGES
<- mb_id,M,vs_set,merge_set,leave_set;
?M = <