msm8974: Implements ssd to ram load feature

The feature encrypts the image flashed onto the ssd
partition of emmc and decrypts an encrypted image
using the keystore provisioned onto the device.

Change-Id: Ica4409c696dc75edef3e0126d108e66dce15dfb8
diff --git a/app/aboot/aboot.c b/app/aboot/aboot.c
index b90ce63..caa2fed 100644
--- a/app/aboot/aboot.c
+++ b/app/aboot/aboot.c
@@ -1424,30 +1424,69 @@
 	sparse_header_t *sparse_header;
 	/* 8 Byte Magic + 2048 Byte xml + Encrypted Data */
 	unsigned int *magic_number = (unsigned int *) data;
-	int ret=0;
 
-	if (magic_number[0] == DECRYPT_MAGIC_0 &&
-		magic_number[1] == DECRYPT_MAGIC_1)
-	{
 #ifdef SSD_ENABLE
-		ret = decrypt_scm((uint32 **) &data, &sz);
-#endif
-		if (ret != 0) {
-			dprintf(CRITICAL, "ERROR: Invalid secure image\n");
-			return;
+	int              ret=0;
+	uint32           major_version=0;
+	uint32           minor_version=0;
+
+	ret = scm_svc_version(&major_version,&minor_version);
+	if(!ret)
+	{
+		if(major_version >= 2)
+		{
+			if( !strcmp(arg,"ssd") || !strcmp(arg,"tqs") )
+			{
+				ret = encrypt_scm((uint32 **) &data, &sz);
+				if (ret != 0) {
+					dprintf(CRITICAL, "ERROR: Encryption Failure\n");
+					return;
+				}
+
+				ret = scm_protect_keystore((uint32 *) data, sz);
+				if (ret != 0) {
+					dprintf(CRITICAL, "ERROR: scm_protect_keystore Failed\n");
+					return;
+				}
+			}
+			else
+			{
+				ret = decrypt_scm_v2((uint32 **) &data, &sz);
+				if(ret != 0)
+				{
+					dprintf(CRITICAL,"ERROR: Decryption Failure\n");
+					return;
+				}
+			}
+		}
+		else
+		{
+			if (magic_number[0] == DECRYPT_MAGIC_0 &&
+			magic_number[1] == DECRYPT_MAGIC_1)
+			{
+				ret = decrypt_scm((uint32 **) &data, &sz);
+				if (ret != 0) {
+					dprintf(CRITICAL, "ERROR: Invalid secure image\n");
+					return;
+				}
+			}
+			else if (magic_number[0] == ENCRYPT_MAGIC_0 &&
+				magic_number[1] == ENCRYPT_MAGIC_1)
+			{
+				ret = encrypt_scm((uint32 **) &data, &sz);
+				if (ret != 0) {
+					dprintf(CRITICAL, "ERROR: Encryption Failure\n");
+					return;
+				}
+			}
 		}
 	}
-	else if (magic_number[0] == ENCRYPT_MAGIC_0 &&
-			 magic_number[1] == ENCRYPT_MAGIC_1)
+	else
 	{
-#ifdef SSD_ENABLE
-		ret = encrypt_scm((uint32 **) &data, &sz);
-#endif
-		if (ret != 0) {
-			dprintf(CRITICAL, "ERROR: Encryption Failure\n");
-			return;
-		}
+		dprintf(CRITICAL,"INVALID SVC Version\n");
+		return;
 	}
+#endif /* SSD_ENABLE */
 
 	sparse_header = (sparse_header_t *) data;
 	if (sparse_header->magic != SPARSE_HEADER_MAGIC)