Assignment for week 5: The goal is to work with a standard (RFC) document and implement test vectors in OpenSSL. Deadline: October 25, 2023 (8:00 AM), maximum is 10 points (and 1 point bonus). Download and study IETF RFC-6070 document PKCS #5: Password-Based Key Derivation Function 2 (PBKDF2) Test Vectors. 1) Write a C Linux program (with support of OpenSSL cryptographic library) that will compute and verify all 6 PBKDF2-SHA1 test vectors described it the RFC document. For each vector print result; stop the program if a test-vector fails. For implementaion use EVP KDF provider for OpenSSL3 (version 3.x.y). Do NOT use OpenSSL 1.1.x API (PKCS5_PBKDF2_HMAC function). 2) Then run the same 6 tests (the same input parameters) but switch to PBKDF2-SHA256 (use SHA256 hash) and set output key length to 32 bytes. Print derived keys to the screen in hexadecimal format. Of course, the output will differ from the original vectors. Do not validate it in this case - results will be compared during marking. Your submitted archive (zip or tar) should contain one C program (and Makefile) that checks all 6 RFC-6070 vectors with all tasks mentioned above. The output must contain at least 6 hexadecimal strings (keys) for the PBKDF2-SHA256 variant. The source code must be compilable on aisa.fi.muni.cz server (or provided VM). Bonus point: Fix all error paths in code to not leak memory and properly clean up in the case of error. Hints: - start with 3_pbkdf_openssl3 example (no need to reinvent the wheel) - code quality matters; compiler warnings means points down (-Wall option will be used in Makefile) - "spaghetti" code means at least 2 points down (do not repeat code and use struct/arrays) - use CRYPTO_memcmp from OpenSSL to compare binary data - you can find PBKDF2-SHA256 vectors output on the internet too (just not in RFC) Example of hexadecimal output (additional info is optional): Derived key using 1. vector PBKDF2-SHA256 (P="password", S="salt", c=1, dkLen=32) 12 0f b6 cf fc f8 b3 2c 43 e7 22 52 56 c4 f8 37 a8 65 48 c9 2c cc 35 48 08 05 98 7c b7 0b e1 7b ...