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(¶m,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, ¶m) == -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)