libdvr: add am_ca_key_test config key by command [1/1]
PD#SWPL-167166
Problem:
config key by command
Solution:
config key by command
Verify:
verified at t5d
Change-Id: Iae45578c3ea3aeeecd9e974872838b9b5bd28101
Signed-off-by: chuangcheng.peng <chuangcheng.peng@amlogic.com>
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 2e1b48b..e033503 100644
--- a/test/am_ca_key_test/am_ca_key_test.c
+++ b/test/am_ca_key_test/am_ca_key_test.c
@@ -33,23 +33,109 @@
/****************************************************************************
* API functions
***************************************************************************/
+#define USER_MAX 10
+static char *u_odd_iv[USER_MAX] = {[0 ... USER_MAX-1] = NULL};
+static char *u_odd_key[USER_MAX] = {[0 ... USER_MAX-1] = NULL};
+static char *u_even_iv[USER_MAX] = {[0 ... USER_MAX-1] = NULL};
+static char *u_even_key[USER_MAX] = {[0 ... USER_MAX-1] = NULL};
+static char *u_00_iv[USER_MAX] = {[0 ... USER_MAX-1] = NULL};
+static char *u_00_key[USER_MAX] = {[0 ... USER_MAX-1] = NULL};
extern int inject_file_and_rec_open(char *inject_name,int vpid, int apid, char *record_name);
extern int inject_file_and_rec_close(void);
+int get_para(char *argv)
+{
+ #define CASE(name, len, type, var) \
+ if (!strncmp(argv, name"=", (len) + 1)) { \
+ sscanf(&argv[(len)+1], type, &var); \
+ printf("param["name"] => "type"\n", var); \
+ }
+ #define CASESTR(name, len, type, var) \
+ if (!strncmp(argv, name"=", (len) + 1)) { \
+ var = &argv[(len) + 1]; \
+ printf("param["name"] => "type"\n", var); \
+ }
+
+ CASESTR("odd_iv0", 7, "%s", u_odd_iv[0])
+ else CASESTR("odd_iv1", 7, "%s", u_odd_iv[1])
+ else CASESTR("odd_iv2", 7, "%s", u_odd_iv[2])
+ else CASESTR("odd_iv3", 7, "%s", u_odd_iv[3])
+ else CASESTR("odd_key0", 8, "%s", u_odd_key[0])
+ else CASESTR("odd_key1", 8, "%s", u_odd_key[1])
+ else CASESTR("odd_key2", 8, "%s", u_odd_key[2])
+ else CASESTR("odd_key3", 8, "%s", u_odd_key[3])
+ else CASESTR("even_iv0", 8, "%s", u_even_iv[0])
+ else CASESTR("even_iv1", 8, "%s", u_even_iv[1])
+ else CASESTR("even_iv2", 8, "%s", u_even_iv[2])
+ else CASESTR("even_iv3", 8, "%s", u_even_iv[3])
+ else CASESTR("even_key0", 9, "%s", u_even_key[0])
+ else CASESTR("even_key1", 9, "%s", u_even_key[1])
+ else CASESTR("even_key2", 9, "%s", u_even_key[2])
+ else CASESTR("even_key3", 9, "%s", u_even_key[3])
+ else CASESTR("00_iv0", 6, "%s", u_00_iv[0])
+ else CASESTR("00_iv1", 6, "%s", u_00_iv[1])
+ else CASESTR("00_iv2", 6, "%s", u_00_iv[2])
+ else CASESTR("00_iv3", 6, "%s", u_00_iv[3])
+ else CASESTR("00_key0", 7, "%s", u_00_key[0])
+ else CASESTR("00_key1", 7, "%s", u_00_key[1])
+ else CASESTR("00_key2", 7, "%s", u_00_key[2])
+ else CASESTR("00_key3", 7, "%s", u_00_key[3])
+
+ return 0;
+}
+
+static void get_key_from_para(char *para_org, int para_len, char *key, int *len)
+{
+ int i = 0;
+ int dst = 0;
+ char hi = 0;
+ char lo = 0;
+
+ printf("get key len:%d, key:%s\n", para_len, para_org);
+ if (para_len <= 2)
+ return ;
+ para_len -= 2;
+
+ dst = 2;
+
+ printf("key:");
+ while (para_len >= 2) {
+ hi = 0;
+ if (para_org[dst] >= 0x30 && para_org[dst] <= 0x39) {
+ hi = para_org[dst] - 0x30;
+ } else if (para_org[dst] >= 0x41 && para_org[dst] <= 0x46) {
+ hi = para_org[dst] - 0x37;
+ } else if (para_org[dst] >= 0x61 && para_org[dst] <= 0x66) {
+ hi = para_org[dst] - 0x57;
+ }
+ lo = 0;
+ if (para_org[dst+1] >= 0x30 && para_org[dst+1] <= 0x39) {
+ lo = para_org[dst+1] - 0x30;
+ } else if (para_org[dst+1] >= 0x41 && para_org[dst+1] <= 0x46) {
+ lo = para_org[dst+1] - 0x37;
+ } else if (para_org[dst+1] >= 0x61 && para_org[dst+1] <= 0x66) {
+ lo = para_org[dst+1] - 0x57;
+ }
+ key[i] = (hi << 4) | lo;
+ printf("0x%0x ", key[i]);
+ i++;
+ dst += 2;
+ para_len -= 2;
+ }
+ printf("\n");
+ *len = i;
+}
+
int main(int argc, char **argv)
{
- int dsccv, dscca;
int vpid=0, apid=0;
char buf[1024];
- char *p = buf;
int dsc = 0, src = 0;
int ret;
- int aes = 0, des = 0, sm4 = 0, csa2 = 0, iv = 0;
+ int aes = 0, des = 0, sm4 = 0, csa2 = 0;
int odd_type = CA_KEY_ODD_TYPE;
int even_type = CA_KEY_EVEN_TYPE;
- int odd_iv_type = 0;
- int even_iv_type = 0;
char inject_name[256];
int inject_file = 0;
char record_name[256];
@@ -83,12 +169,12 @@
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);
+ sscanf(argv[i], "inject=%s", (char *)&inject_name);
inject_file = 1;
}
else if (!strncmp(argv[i], "rec", 3)) {
memset(record_name, 0, sizeof(record_name));
- sscanf(argv[i], "rec=%s", &record_name);
+ sscanf(argv[i], "rec=%s", (char *)&record_name);
record_file = 1;
}
else if (!strncmp(argv[i], "help", 4)) {
@@ -97,6 +183,8 @@
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");
exit(0);
+ } else {
+ get_para(argv[i]);
}
}
@@ -125,72 +213,30 @@
goto end;
#endif
if(vpid>0 || apid>0) {
- char aes_key_ecb[16] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff};
- char aes_key_cbc_iv[16] = {0x49, 0x72, 0x64, 0x65, 0x74, 0x6F, 0xA9, 0x43, 0x6F,0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74};
-// char aes_key_cbc_iv[16] = {0};
- char aes_key_cbc[16] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff};
- char aes_key_cbc_isda[16] = { 0xb2, 0x8e, 0xd9, 0x82, 0x9d, 0x91, 0xe6, 0x5d,0x8c, 0x15, 0x33, 0x51, 0xf7, 0x67, 0x0d, 0x4a};
- char aes_key_cbc_isda_iv[16] = {0};
-
- char sm4_ecb_key[16] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10};
- char sm4_cbc_key[16] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10};
- char sm4_cbc_key_iv[16] = {0};
- char sm4_isda_key[16] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10};;
- char sm4_isda_key_iv[16] = {0};
-
- char des_key[8] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07};
- /*char csa_key[8] = {0x11, 0x22, 0x33, 0x66, 0x55, 0x66, 0x77, 0x32};*/
- //char csa_key[8] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88};
- char csa_key_odd[8] = {0xe6, 0x2a, 0x3b, 0x4b, 0xd0, 0x0e, 0x38, 0x16};
- char csa_key_even[8] = {0xe6, 0x3c, 0x7c, 0x9e, 0x00, 0x43, 0xc6, 0x09};
-
- char *odd_key = NULL;
- char *even_key = NULL;
- char *key_iv = NULL;
int algo = 0;
+ char key[32];
int key_len = 0;
if (aes) {
if (mode == 0) {
algo = CA_ALGO_AES_ECB_CLR_END;
- odd_key = aes_key_ecb;
- even_key = aes_key_ecb;
- key_len = 16;
printf("use AES ecb key\n");
} else if (mode == 1) {
algo = CA_ALGO_AES_CBC_CLR_END;
- odd_key = aes_key_cbc;
- even_key = aes_key_cbc;
- key_iv = aes_key_cbc_iv;
- odd_iv_type = CA_KEY_ODD_IV_TYPE;
- even_iv_type = CA_KEY_EVEN_IV_TYPE;
- key_len = 16;
printf("use AES cbc key\n");
} else if (mode == 2 ) {
algo = CA_ALGO_AES_CBC_IDSA;
- odd_key = aes_key_cbc_isda;
- even_key = aes_key_cbc_isda;
- key_iv = aes_key_cbc_isda_iv;
printf("use AES isda key\n");
- odd_iv_type = CA_KEY_ODD_IV_TYPE;
- even_iv_type = CA_KEY_EVEN_IV_TYPE;
- key_len = 16;
} else {
printf("mode is invalid\n");
return -1;
}
} else if (des) {
algo = CA_ALGO_DES_SCTE41;
- odd_key = des_key;
- even_key = des_key;
- key_len = 8;
printf("use DES key\n");
} else if (csa2) {
algo = CA_ALGO_CSA2;
- odd_key = csa_key_odd;
- even_key = csa_key_even;
printf("use CSA2 key\n");
- key_len = 16;
} else {
printf("mode is invalid\n");
return -1;
@@ -206,43 +252,76 @@
v_chan_index = ca_alloc_chan(dsc, vpid, algo, CA_DSC_COMMON_TYPE);
if (v_chan_index < 0)
goto end;
- if (key_iv)
- {
- 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));
+ if (u_odd_iv[0]) {
+ memset(key, 0, sizeof(key));
+ get_key_from_para(u_odd_iv[0], strlen(u_odd_iv[0]), key, &key_len);
+ AM_CHECK_ERR(ca_set_cw_key(dsc, v_chan_index, CA_KEY_ODD_IV_TYPE, key_len, (char*)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));
+ if (u_even_iv[0]) {
+ memset(key, 0, sizeof(key));
+ get_key_from_para(u_even_iv[0], strlen(u_even_iv[0]), key, &key_len);
+ AM_CHECK_ERR(ca_set_cw_key(dsc, v_chan_index, CA_KEY_EVEN_IV_TYPE, key_len, (char*)key));
+ }
+ if (u_odd_key[0]) {
+ 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 {
+ memset(key, 0, sizeof(key));
+ get_key_from_para(u_odd_key[0], strlen(u_odd_key[0]), key, &key_len);
+ AM_CHECK_ERR(ca_set_cw_key(dsc, v_chan_index, CA_KEY_ODD_TYPE, key_len, (char*)key));
+ }
+ }
+ if (u_even_key[0]) {
+ 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 {
+ memset(key, 0, sizeof(key));
+ get_key_from_para(u_even_key[0], strlen(u_even_key[0]), key, &key_len);
+ AM_CHECK_ERR(ca_set_cw_key(dsc, v_chan_index, CA_KEY_EVEN_TYPE, key_len, (char*)key));
+ }
}
printf("set default key for pid[%d]\n", vpid);
}
if(apid>0) {
- v_chan_index = ca_alloc_chan(dsc, apid, algo, CA_DSC_COMMON_TYPE);
- if (v_chan_index < 0)
+ a_chan_index = ca_alloc_chan(dsc, apid, algo, CA_DSC_COMMON_TYPE);
+ if (a_chan_index < 0)
goto end;
- if (key_iv)
- {
- 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));
+ if (u_odd_iv[0]) {
+ memset(key, 0, sizeof(key));
+ get_key_from_para(u_odd_iv[0], strlen(u_odd_iv[0]), key, &key_len);
+ AM_CHECK_ERR(ca_set_cw_key(dsc, a_chan_index, CA_KEY_ODD_IV_TYPE, key_len, (char*)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));
+ if (u_even_iv[0]) {
+ memset(key, 0, sizeof(key));
+ get_key_from_para(u_even_iv[0], strlen(u_even_iv[0]), key, &key_len);
+ AM_CHECK_ERR(ca_set_cw_key(dsc, a_chan_index, CA_KEY_EVEN_IV_TYPE, key_len, (char*)key));
}
-
+ if (u_odd_key[0]) {
+ 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 {
+ memset(key, 0, sizeof(key));
+ get_key_from_para(u_odd_key[0], strlen(u_odd_key[0]), key, &key_len);
+ AM_CHECK_ERR(ca_set_cw_key(dsc, a_chan_index, CA_KEY_ODD_TYPE, key_len, (char*)key));
+ }
+ }
+ if (u_even_key[0]) {
+ 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 {
+ memset(key, 0, sizeof(key));
+ get_key_from_para(u_even_key[0], strlen(u_even_key[0]), key, &key_len);
+ AM_CHECK_ERR(ca_set_cw_key(dsc, a_chan_index, CA_KEY_EVEN_TYPE, key_len, (char*)key));
+ }
+ }
printf("set default key for pid[%d]\n", apid);
}