ext4crypt: support synthetic keys v3 on May update

Re-implemented SP800Derive in C++, which is added as the new key
derivation function in Android 9.0 May update. From file
services/core/java/com/android/server/locksettings/SP800Derive.java in
frameworks/base.

This is required to get TWRP working on any Android device that has a
screen lock set up after the May update.

Change-Id: I5c1a51b110033f2b0b75d5e36fd8098c05e95179
diff --git a/crypto/ext4crypt/HashPassword.h b/crypto/ext4crypt/HashPassword.h
index 4be107b..73880b1 100644
--- a/crypto/ext4crypt/HashPassword.h
+++ b/crypto/ext4crypt/HashPassword.h
@@ -26,11 +26,19 @@
 #define PERSONALIZATION_FBE_KEY "fbe-key"
 #define PERSONALIZATION_USER_GK_AUTH "user-gk-authentication"
 #define PERSONALISATION_SECDISCARDABLE "secdiscardable-transform"
+#define PERSONALISATION_CONTEXT "android-synthetic-password-personalization-context"
 
 void* PersonalizedHashBinary(const char* prefix, const char* key, const size_t key_size);
 
 std::string PersonalizedHash(const char* prefix, const char* key, const size_t key_size);
 std::string PersonalizedHash(const char* prefix, const std::string& Password);
+std::string PersonalizedHashSP800(const char* label, const char* context, const char* key, const size_t key_size);
 std::string HashPassword(const std::string& Password);
 
+template <class T>
+void endianswap(T *objp) {
+	unsigned char *memp = reinterpret_cast<unsigned char*>(objp);
+	std::reverse(memp, memp + sizeof(T));
+}
+
 #endif