PROJECT 3: AH ============= 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Next Header | Payload Len | RESERVED | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Security Parameters Index (SPI) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Sequence Number Field | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | + Authentication Data (variable) | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Next Header = TCP/UDP (check IANA values for these protocols) Payload len = 6 SPI = random value from client to server; copied by server when replying Seq = monotonically increasing from client to server Auth data = Use MD5 to hash a string in client and verify it in server #include unsigned char *MD5(const unsigned char *d, unsigned long n, unsigned char *md); Create server and client processes that exchange this data. In the client, accept a string from the user. Use the above given function to get a 16-byte output that you copy into the authentication data field above. In the server, copy back the data received to the client. In the client, compare the authentication data received with the value computed earlier. Group 7 : Implement as a TCP concurrent server using threads Group 6 : Implement as a TCP concurrent server with processes Group 12 : Implement as TCP iterative server with select to handle multiple connections