Changes

MpOTR/algorithm dump

1,136 bytes added, 9 years ago
{{algorithm-begin|name=Chatroom Init}}
Input: <math>newRoomName</math>, <math>participantNick</math>
Global '''global''' <math>myId := 1</math> Global '''global''' <math>Nick_{myId} := participantNick</math> Global '''global''' <math>roomName := newRoomName</math> Global '''global''' <math>x_{myId}, y_{myId} :=</math> <span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''Generate Initial Paramters</span>'''(<math>myId</math>) Global '''global''' <math>signatureKey_{myId} := (x_{myId},y_{myId})</math>
<math>participantList := [Nick_{myId}]</math>
<math>ephemeralPublicPointList := [y_{myId}, y_{other}]</math>
{{algorithm-end}}
 
{{algorithm-begin|name=Verify Verifier Generate Init Key}}
Input: <math>schnorrRandomPoint_{other}</math>, <math>Hv_{other}</math>, <math>v_{other}</math>, <math>y_{other}</math>, <math>Nick_{other}</math>
<span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''Verify Verifiers</span>'''() Global '''global''' <math>sessionKey := Hash(x_{myId}y_{other}, sessionId)</math>
<math>toBeSigned := Hash(Hash(sessionId||Hash(y_1, v_1)||Hash(y_2,v_2)))</math>
<span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''Sign Session and Send</span>'''(<math>toBeSigned</math>)
{{algorithm-end}}
 
 
 
====Join====
{{algorithm-begin|name=Join}}
Input: <math>newRoomName</math>, <math>Nickname_{myId}</math>, <math>participantId</math>
Global '''global''' <math>myId := participantId</math> Global '''global''' <math>roomName := newRoomName</math> <math>x_{myId}, y_{myId} := </math><span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''Generate Initial Paramters</span>'''(Participant ID <math>myId</math>) Global '''global''' <math>signatureKey_{myId} := (x_{myId},y_{myId})</math> <span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''Broadcast</span>'''(":3mpCat:3Join:3", <math>myId</math>, <math>Nickname_{myId}</math>, <math>y_{myId}</math>) Global '''global''' <math>participantList, ephemeralPublicPointList :=</math> <span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''Receive</span>'''() Global '''global''' <math>sessionId := </math> <span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''Compute Session Id</span>'''(<math>roomName</math>, <math>participantList</math>, <math>ephemeralPublicPointList</math>) <span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''Sign and Send Key Confirmation and Shares</span>'''() <span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''Wait On Receive</span>'''(":3mpCat:3KeyConfirmationShare:3") Global '''global''' <math>keyShareList, keyConfirmationList, signatureList :=</math> <span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''Receive</span>'''() <span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''Verify Key Confirmations and Signatures</span>'''(<math>keyConfirmationList</math>, <math>signatureList</math>) <span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''Update Session Key</span>'''()
{{algorithm-end}}
 
{{algorithm-begin|name=Receive Session Digest}}
Input: <math>currentSessionHistoryDigest</math>
Global '''global''' <math>sessionDigest := currentSessionHistoryDigest</math>
{{algorithm-end}}
====Protocol for other participants already in the chat to accept the newcomer====
 
 
====Protocol for other participants already in the chat to accept the newcomer====
<!--alg_accept-->
{{algorithm-begin|name=Accept}}
Input: <math>newParticipant</math> <span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''Broadcast</span>'''(":3mpCat:3Join:3", <math>myId</math>, <math>Nickname_{myId}</math>, <math>y_{myId}</math>) <span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''Wait On Receive</span>'''(":3mpCat:3Join:3") Global '''global''' <math>nick_{NewParticipant}</math>, <math>ephemeralPublicPoint_{NewParticipant} := </math> <span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''Receive</span>'''() <span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''Update Lists</span>'''(<math>nick_{NewParticipant}</math>, <math>ephemeralPublicPoint_{NewParticipant}</math>) Global '''global''' <math>sessionId := </math> <span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''Compute Session Id</span>'''(<math>roomName</math>, <math>participantList</math>, <math>ephemeralPublicPointList</math>) <span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''Sign and Send Key Confirmation and Shares</span>'''() <span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''Wait On Receive</span>'''(":3mpCat:3KeyConfirmationShare:3") Global '''global''' <math>keyShareList, keyConfirmationList, signatureList :=</math> <span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''Receive</span>'''() <span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''Verify Key Confirmations and Signatures</span>'''(<math>keyConfirmationList</math>, <math>signatureList</math>) <span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''Update Session Key</span>'''() <span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''Send</span>'''(<math>sessionDigest</math>)
{{algorithm-end}}
{{algorithm-begin|name=Shrink on Leave}}
Input: <math>leaverId</math>
Remove '''remove''' <math>leaverId</math> from <math>participantIdList</math> Global '''global''' <math>sessionId :=</math> <span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''Compute Session Id</span>'''() '''Ifif'''<math>|participantList| > 1</math>''', then''' <span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''Sign and Send Key Shares</span>'''() <span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''Wait On Receive</span>'''(":3mpCat:3KeyShare:3") <math>keyShareList</math> := <span style="font-family: serif; font-size: larger; font-variant:small-caps;">'''Receive{}</span>'''() <span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''Update Session Key</span>'''(<math>keyShareList</math>)
{{algorithm-end}}
 
{{algorithm-begin|name=Sign and Send Key Shares}}
Input:
Global '''global''' <math>z_{myId -1, myId} := Hash(k_{myId,myId-1}, sessionId)</math> Global '''global''' <math>z_{myId, myId+1} := Hash(k_{myId,myId+1}, sessionId)</math>
<math>keyShare_{myId} := z_{myId -1, myId} \oplus z_{myId, myId+1}</math>
<math>originAuthSignature :=</math> <span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''ED25519Sign</span>'''(<math>SignatureKey</math>, <math>sessionId</math> || <math>z_{myId}</math>) <span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''Broadcast</span>'''(":3mpCat:3KeyShare:3", <math>myId</math>, <math>keyShare_{myId}</math>, <math>originAuthSignature</math>) # we can send this encrypted but leaving person can read it, hence theoretically it is the same as sending it unencrypted.
{{algorithm-end}}
 
====Send====
<!--alg_send-->
{{algorithm-begin|name=Send}}
Input: Message}{MetaMessage<math>metaMessage</math>, <math>message</math> <math>keyShareMessage</math> = <span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''NewKeyShareMessage</span>'''(MetaMessage<math>metaMessage</math>) <math>cryptMessage</math> := <span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''AES CTR Encrypt</span>'''(<math>sessionKey</math>,<math>message | keyShareMessage</math>) <math>originAuthSignature</math> := <span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''ED25519Sign</span>'''(<math>SignatureKey</math>, <math>sessionId</math> || <math>cryptMetatMessage</math>) <math>sessionDigest</math> := <span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''Compute Session Digest</span>'''(<math>lastMessage</math>) <span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''Broadcast</span>'''(":3mpCat:3", <math>sessionId</math>, <math>cryptMessage</math>, <math>sessionDigest</math>, <math>originAuthSignature</math>,":3")
{{algorithm-end}}
 
====Recieve====
{{algorithm-begin|name=Receive}}
Input: <math>sender</math>, <math>encryptedMessage</math>, <math>originAuthSignature</math>, <math>sessionDigest</math>
<math>v := </math> <span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''ED25519VerifySignature</span>'''(<math>ephemeralPublicKeyList[Sender]</math>, <math>sessionId || encryptedMessage</math>, <math>originAuthSignature</math>) <span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''Assert</span>'''(<math>v</math>)or '''return''' Reject <math>message, keyShareMessage :=</math> <span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''AES CTR Decrypt</span>'''(<math>sessionKey</math>, <math>encryptedMessage</math>){} <math>isMetaMessage = </math><span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''UpdateNewKeyStatus</span>'''(<math>keyShareMessage</math>) <span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''Verify Digests</span>'''(<math>sessionDiges</math>) '''Returnreturn'''{<math>isMetaMessage, message</math>} # isMetaMessage is true if the message is purely meta message and there is nothing to display
{{algorithm-end}}
 
 
\subsection{Common functions}
 
 
====Common functions used by other procedures in different stages====
<!--alg_comm-->
 
 
{{algorithm-begin|name=Generate Initial Paramters}}
Input: <math>myId</math>
<math>signaturePrivateKey := </math> <span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''RandomBits</span>'''(256) <math>x_{myId} :=</math> <span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''Ed25519 Scalar</span>'''(<math>signaturePrivateKey</math>))#{This is both Diffie-Hellman secret and ephemeral signature private key}
<math>y_{myId} := x_{myId}P</math>
'''Returnreturn''' <math>x,y</math>
{{algorithm-end}}
{{algorithm-begin|name=Verify Key Confirmation and Signatures}}
Input: <math>signatureList</math>, <math>keyConfirmationList</math>
'''For for each''' <math>participant \in participantList</math>}, '''do''' \If{'''if''' <math>keyConfirmationList[participant][myId] \neq Hash(k_{myId,participant}, U_{myId})</math>}''', then''' <span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''Halt</span>'''() ' '''if''' \If{<span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''ED25519VerifySignature</span>'''(''', then'''{<math>ephemeralPublicKeyList[particicpant]</math>, <math>sessionId ||keyShares[myId]</math>, <math>originAuthSignature</math>)} = Fail}' <span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''Halt</span>'''()
{{algorithm-end}}
 
{{algorithm-begin|name=Compute Session Id}}
Input: <math>participantList</math>, <math>ephemeralPublicPointList</math>
'''Returnreturn''' <math>Hash(roomeName, zip(participantList, ephemeralPublicPointList))</math> # <math>zip([a,b],[c,d]):=[(a,c),(b,d)]</math>
{{algorithm-end}}
{{algorithm-begin|name=Verify Signatures}}
Input: <math>longPublicList</math>,<math>schnorrRandomPointList</math>,
# standard signature verification
{{algorithm-end}}
 
{{algorithm-begin|name=Sign and Send Key Confirmation and Share}}
Input: <math>schnorrRandomPointList</math>
'''For for each''' <math>participant \in participantList</math>, '''do''' <math>k_{myId, participant} := HHash(g^{lp_x_{myId}}LP_{participant} |lp_{myId}y_{participant}^{| x_{myId}y_{participant})</math> # Triple DH <math>kc_{myId} := kc_{myId} | HHash(k_{myId,participant}, U_{participant})</math>   Global '''global''' <math>z_{myId -1, myId} := Hash(k_{myId,myId-1}, sessionId)</math> Global '''global''' <math>z_{myId, myId+1} := Hash(k_{myId,myId+1}, sessionId)</math>
<math>keyShare_{myId} := z_{myId -1, myId} \oplus z_{myId, myId+1}</math>
   <math>originAuthSignature :=</math> <span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''ED25519Sign</span>'''(<math>SignatureKey</math>, <math>sessionId</math> || <math>z_{myId}</math>) <span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''Broadcast</span>'''(":3mpCat:3KeyConfirmationAndShare:3", <math>myId</math>, <math>keyShare_{myId}</math>, <math>originAuthSignature</math>, <math>kc_{myId}</math>)
{{algorithm-end}}
 
{{algorithm-begin|name=Update Session Key}}
Input: <math>keyShareList</math>
<math>i := myId</math>
'''For for each''' <math>{j \in [i,...,i+n-1]}</math>}, '''do'''
<math>z_{j,j+1} := z_{j-1,j} \oplus keyShareListe[j+1]</math>
# recovered <math>z_{i-1,i}</math> should be equal to its original value Global '''global''' <math>sessionKey := Hash(z_{j,j+1} | j \in [1...n])</math>
{{algorithm-end}}
{{algorithm-begin|name=Sign Params Update Session Key}}
Input: <math>toBeSigned</math>, <math>signatureList</math>, <math>keyShareList</math>
<span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''Update Session Key</span>'''()
<math>toBeSigned := Hash(sessionId, ||Hash(verifierList, ephemeralPublicPointList, keyShareList)))</math>
<math>signature_{myId} := </math><span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''Sign Session and Send</span>'''(<math>toBeSigned</math>) <span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''Broadcast</span>'''(":3mpCat:3SignedSessionParameters:3",<math>signature_{myId}</math>)
{{algorithm-end}}
{{algorithm-begin|name=ComputeSessionDigest}}
Input: <math>lastMessage</math>
'''For for each''' <math>message</math> in Messages Received from <math>lastDigestedMessage</math>+1 till <math>lastMessage</math>}, '''do''' <math>sesionDigest :=Hass(sessionDigest, message)</math> <span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''HashLRU Cache Store Digest</span>'''(<math>sessionDigest</math>, <math>message</math>) '''return''' <math>sessionDigest</math>,<math>lastMessageId</math>{{algorithm-end}}  {{algorithm-begin|name=NewKeyShareMessage}} Input: <math>metaMessage</math> # Based on metaMessage Determines what type of keyshare needs to be send (Ephemeral point or Group key share) and returen it.{{algorithm-end}}  {{algorithm-begin|name=UpdateNewKeyStatus}} Input: <math>keyShareMessage</math> # Update the table of which participant has sent its new ephemeral point or its new group key share{{algorithm-end}}  {{algorithm-begin|name=Hash}} Input: <math>message</math> '''return''' <span style="font-family: serif; font-size: larger; font-variant:small-caps;"> '''LRU Cache Store DigestSHA-512</span>'''(<math>sessionDigest</math>, <math>message</math>) '''Return''' <math>sessionDigest</math>,<math>lastMessageId</math>
{{algorithm-end}}