am_ca: am_ca_key_test support CSA2 [1/1]

PD#SWPL-135053

Problem:
need support csa2 algo
need support keyladder key

Solution:
support csa2 algo
support keyladder key

Verify:
verified at t5d

Change-Id: I8a384a742727592d79f33fcc42db893771378c4b
Signed-off-by: chuangcheng peng <chuangcheng.peng@amlogic.com>
diff --git a/Android.mk b/Android.mk
index 26bad7f..fa012d4 100644
--- a/Android.mk
+++ b/Android.mk
@@ -68,4 +68,5 @@
 #include $(DVR_TOP)/test/dvr_segment_test/Android.mk
 #include $(DVR_TOP)/test/dvr_play_test/Android.mk
 #include $(DVR_TOP)/test/dvr_rec_test/Android.mk
+#include $(DVR_TOP)/test/am_ca_key_test/Android.mk
 endif
diff --git a/test/am_ca_key_test/am_ca_key_test.c b/test/am_ca_key_test/am_ca_key_test.c
index b949273..2e1b48b 100644
--- a/test/am_ca_key_test/am_ca_key_test.c
+++ b/test/am_ca_key_test/am_ca_key_test.c
@@ -45,7 +45,7 @@
 	char *p = buf;
 	int dsc = 0, src = 0;
 	int ret;
-	int aes = 0, des = 0, sm4 = 0,iv = 0;
+	int aes = 0, des = 0, sm4 = 0, csa2 = 0, iv = 0;
 	int odd_type = CA_KEY_ODD_TYPE;
 	int even_type = CA_KEY_EVEN_TYPE;
 	int odd_iv_type = 0;
@@ -55,6 +55,7 @@
 	char record_name[256];
 	int record_file = 0;
 	int mode = 0;
+	int kl = 0;
 	int v_chan_index = 0;
 	int a_chan_index = 0;
 
@@ -74,8 +75,12 @@
 			des = 1;
 		else if (!strncmp(argv[i], "sm4", 3))
 			sm4 = 1;
+		else if (!strncmp(argv[i], "csa2", 3))
+			csa2 = 1;
 		else if (!strncmp(argv[i], "mode", 4))
 			sscanf(argv[i],"mode=%i", &mode);
+		else if (!strncmp(argv[i], "kl", 2))
+			sscanf(argv[i],"kl=%i", &kl);
 		else if (!strncmp(argv[i], "inject", 6)) {
 			memset(inject_name, 0, sizeof(inject_name));
 			sscanf(argv[i], "inject=%s", &inject_name);
@@ -87,7 +92,7 @@
 			record_file = 1;
 		}
 		else if (!strncmp(argv[i], "help", 4)) {
-			printf("Usage: %s [vid=pid] [aid=pid] [dsc=n] [src=n] [aes|des|sm4] [mode=0/1/2,0:ecb,1:cbc,2:idsa]\n", argv[0]);
+			printf("Usage: %s [vid=pid] [aid=pid] [dsc=n] [src=n] [aes|des|sm4|csa2] [mode=0/1/2,0:ecb,1:cbc,2:idsa][kl]\n", argv[0]);
 			printf("\t [inject=xxx] [rec=xxx] \n");
 			printf("\t inject file and record for verify the descram function \n");
 			printf("\t if no v/a specified, will set to current running v/a\n");
@@ -102,8 +107,11 @@
 		printf("des mode\n");
 	} else if (sm4) {
 		printf("sm4 mode\n");
+	} else if (csa2) {
+		printf("csa2 mode\n");
 	} else {
-		printf("csa mode\n");
+		printf("need mode setting\n");
+		goto end;
 	}
 
 	ret = ca_open(dsc);
@@ -177,12 +185,15 @@
 			even_key = des_key;
 			key_len = 8;
 			printf("use DES key\n");
-		} else {
+		} else if (csa2) {
 			algo = CA_ALGO_CSA2;
 			odd_key = csa_key_odd;
 			even_key = csa_key_even;
-			printf("use CSA key\n");
+			printf("use CSA2 key\n");
 			key_len = 16;
+		} else {
+			printf("mode is invalid\n");
+			return -1;
 		}
 
 #define AM_CHECK_ERR(_x) do {\
@@ -200,8 +211,16 @@
 				AM_CHECK_ERR(ca_set_cw_key(dsc, v_chan_index, odd_iv_type, key_len, (char*)key_iv));
 				AM_CHECK_ERR(ca_set_cw_key(dsc, v_chan_index, even_iv_type, key_len, (char*)key_iv));
 			}
-			AM_CHECK_ERR(ca_set_cw_key(dsc, v_chan_index, odd_type, key_len, (char*)odd_key));
-			AM_CHECK_ERR(ca_set_cw_key(dsc, v_chan_index, even_type, key_len, (char*)even_key));
+
+			if (kl == 1) {
+				printf("set key keyladder mode\n");
+				AM_CHECK_ERR(ca_set_key (dsc, v_chan_index, odd_type, 0));
+				AM_CHECK_ERR(ca_set_key (dsc, v_chan_index, even_type, 0));
+			} else {
+				printf("set key host mode\n");
+				AM_CHECK_ERR(ca_set_cw_key(dsc, v_chan_index, odd_type, key_len, (char*)odd_key));
+				AM_CHECK_ERR(ca_set_cw_key(dsc, v_chan_index, even_type, key_len, (char*)even_key));
+			}
 			printf("set default key for pid[%d]\n", vpid);
 		}
 		if(apid>0) {
@@ -213,8 +232,17 @@
 				AM_CHECK_ERR(ca_set_cw_key(dsc, a_chan_index, odd_iv_type, key_len, (char*)key_iv));
 				AM_CHECK_ERR(ca_set_cw_key(dsc, a_chan_index, even_iv_type, key_len, (char*)key_iv));
 			}
-			AM_CHECK_ERR(ca_set_cw_key(dsc, a_chan_index, odd_type, key_len, (char*)odd_key));
-			AM_CHECK_ERR(ca_set_cw_key(dsc, a_chan_index, even_type, key_len, (char*)even_key));
+
+			if (kl == 1) {
+				printf("set key keyladder mode\n");
+				AM_CHECK_ERR(ca_set_key (dsc, a_chan_index, odd_type, 0));
+				AM_CHECK_ERR(ca_set_key (dsc, a_chan_index, even_type, 0));
+			} else {
+				printf("set key host mode\n");
+				AM_CHECK_ERR(ca_set_cw_key(dsc, a_chan_index, odd_type, key_len, (char*)odd_key));
+				AM_CHECK_ERR(ca_set_cw_key(dsc, a_chan_index, even_type, key_len, (char*)even_key));
+			}
+
 			printf("set default key for pid[%d]\n", apid);
 		}
 
diff --git a/test/am_ca_key_test/am_ca_t5d.c b/test/am_ca_key_test/am_ca_t5d.c
index aca40a7..7e598f5 100644
--- a/test/am_ca_key_test/am_ca_t5d.c
+++ b/test/am_ca_key_test/am_ca_t5d.c
@@ -128,7 +128,8 @@
 	}
 	if (algo != CA_ALGO_AES_CBC_CLR_END &&
 		algo != CA_ALGO_DES_SCTE41 &&
-		algo != CA_ALGO_DES_SCTE52) {
+		algo != CA_ALGO_DES_SCTE52 &&
+		algo != CA_ALGO_CSA2) {
 		am_ca_pr(LOG_ERROR,"algo invalid\n");
 		return -1;
 	}
@@ -292,7 +293,16 @@
 			alg_type = CA_CW_AES_ODD_IV;
 		else
 			goto error;
-	} else {
+	} else if (pchan->algo == CA_ALGO_CSA2) {
+		mode = CA_DSC_ECB;
+		if (parity == CA_KEY_EVEN_TYPE)
+			alg_type = CA_CW_DVB_CSA_EVEN;
+		else if (parity == CA_KEY_ODD_TYPE)
+			alg_type = CA_CW_DVB_CSA_ODD;
+		else
+			goto error;
+	}
+	else {
 		mode = CA_DSC_ECB;
 		if (parity == CA_KEY_EVEN_TYPE)
 			alg_type = CA_CW_DES_EVEN;
@@ -305,7 +315,7 @@
 	fd = pdev->fd;
 	memset(&param,0,sizeof(struct ca_descr_ex));
 	param.index = index;
-	param.flags = CA_CW_FROM_KL;
+	param.flags = 16;// keyladder flag
 	param.type = alg_type;
 	param.mode = mode;
 	if (ioctl(fd, CA_SET_DESCR_EX, &param) == -1) {
@@ -386,6 +396,14 @@
 			alg_type = CA_CW_AES_ODD_IV;
 		else
 			goto error;
+	} else if (pchan->algo == CA_ALGO_CSA2) {
+		mode = CA_DSC_ECB;
+		if (parity == CA_KEY_EVEN_TYPE)
+			alg_type = CA_CW_DVB_CSA_EVEN;
+		else if (parity == CA_KEY_ODD_TYPE)
+			alg_type = CA_CW_DVB_CSA_ODD;
+		else
+			goto error;
 	} else {
 		mode = CA_DSC_ECB;
 		if (parity == CA_KEY_EVEN_TYPE)