| if node is sender then |
| Key[a- > b] ← 0xFFFFFFFF; |
| if node has frame to be transmitted then |
| IDS[a- > b] ← HMAC(Key[a- > b], IDa); |
| IDD[a- > b] ← HMAC(Key[a- > b], IDb); |
| Send DATA frame { IDS[a- > b], IDD[a- > b],payload, FCS}; |
| Create timer Stimer with a certain timeout; |
| end |
| if an ACK frame is received then |
| for each neighbors do |
| if FCS checksum OK and IDS[a- > b] from ACK frame = = IDS[a- > b] then |
| //generate new key |
| Key[a- > b] ←Key[a- > b] ⊕ Hash(payload); |
| //generate new addresses |
| IDS[a- > b] ←HMAC(Key[a- > b], IDa); |
| IDD[a- > b] ←HMAC(Key[a- > b], IDb); |
| kill timer Stimer; |
| end |
| end |
| end |
| if Stimer timeout then |
| Send DATA frame { IDS[a- > b], IDD[a- > b],payload, FCS}; |
| end |
| end |
| if node is receiver then |
| Key[a- > b] ← 0xFFFFFFFF; |
| IDS[a- > b] ← HMAC(Key[a- > b], IDa); |
| IDD[a- > b] ← HMAC(Key[a- > b], IDb); |
| IDSo[a- > b] ← HMAC(Key[a- > b], IDa); |
| IDDo[a- > b] ← HMAC(Key[a- > b], IDb); |
| if a DATA frame is received then |
| for each neighbor do |
| if FCS checksum OK and IDD[a- > b] from frame = = IDD[a- > b] then |
| //save old addresses |
| IDSo[a- > b] ← IDS [a- > b]; |
| IDDo[a- > b] ← IDD [a- > b]; |
| //generate new key |
| Key[a- > b] ←Key[a- > b] ⊕ Hash(payload); |
| //generate new addresses |
| IDS[a- > b]<-HMAC(Key[a- > b], IDa); |
| IDD[a- > b]<-HMAC(Key[a- > b], IDb); |
| deliver frame to upper layer; |
| send ACK frame { IDDo[a- > b], IDSo[a- > b], FCS}; |
| else if FCS checksum OK and IDD[a- > b] from frame = = IDDo[a- > b] then |
| //DATA frame already delivered |
| send ACK frame { IDDo[a- > b], IDSo[a- > b], FCS}; |
| end |
| end |
| end |
| end |