xref: /OK3568_Linux_fs/external/security/librkcrypto/src/rkcrypto_trace.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright (c) 2022 Rockchip Electronics Co. Ltd.
3*4882a593Smuzhiyun  */
4*4882a593Smuzhiyun #include <stdarg.h>
5*4882a593Smuzhiyun #include <stdlib.h>
6*4882a593Smuzhiyun #include <string.h>
7*4882a593Smuzhiyun #include <unistd.h>
8*4882a593Smuzhiyun #include "rkcrypto_trace.h"
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #ifdef ANDROID
11*4882a593Smuzhiyun #include <android/log.h>
12*4882a593Smuzhiyun #include <cutils/properties.h>
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #define RKCRYPTO_TRACE_LEVEL_NAME	"vendor.rkcrypto.trace.level"
15*4882a593Smuzhiyun #else
16*4882a593Smuzhiyun #define RKCRYPTO_TRACE_LEVEL_NAME	"rkcrypto_trace_level"
17*4882a593Smuzhiyun #endif
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun #define RKCRYPTO_LOG_TAG		"rkcrypto"
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun static int trace_level = -1;
22*4882a593Smuzhiyun 
rkcrypto_get_trace_level(void)23*4882a593Smuzhiyun static void rkcrypto_get_trace_level(void)
24*4882a593Smuzhiyun {
25*4882a593Smuzhiyun 	char pick_value;
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun 	if (trace_level >= TRACE_ERROR && trace_level <= TRACE_VERBOSE)
28*4882a593Smuzhiyun 		return;
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun #ifdef ANDROID
31*4882a593Smuzhiyun 	char property_value[PROPERTY_VALUE_MAX] = {0};
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun 	if (property_get(RKCRYPTO_TRACE_LEVEL_NAME, property_value, NULL) > 0)
34*4882a593Smuzhiyun 		pick_value = property_value[0];
35*4882a593Smuzhiyun #else
36*4882a593Smuzhiyun 	char *env_value = getenv(RKCRYPTO_TRACE_LEVEL_NAME);
37*4882a593Smuzhiyun 	if (env_value)
38*4882a593Smuzhiyun 		pick_value = env_value[0];
39*4882a593Smuzhiyun #endif
40*4882a593Smuzhiyun 	sscanf(&pick_value, "%d", &trace_level);
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun 	if (trace_level < TRACE_ERROR || trace_level > TRACE_VERBOSE)
43*4882a593Smuzhiyun 		trace_level = TRACE_INFO;
44*4882a593Smuzhiyun }
45*4882a593Smuzhiyun 
rkcrypto_set_trace_level(enum RKCRYPTO_TRACE_LEVEL level)46*4882a593Smuzhiyun RK_RES rkcrypto_set_trace_level(enum RKCRYPTO_TRACE_LEVEL level)
47*4882a593Smuzhiyun {
48*4882a593Smuzhiyun 	char ch[2];
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun 	if (level < TRACE_ERROR || level > TRACE_VERBOSE)
51*4882a593Smuzhiyun 		return RK_CRYPTO_ERR_PARAMETER;
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun 	sprintf(ch, "%d", level);
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun #ifdef ANDROID
56*4882a593Smuzhiyun 	if (property_set(RKCRYPTO_TRACE_LEVEL_NAME, ch)) {
57*4882a593Smuzhiyun 		__android_log_print(ANDROID_LOG_ERROR, RKCRYPTO_LOG_TAG, "property_set error!");
58*4882a593Smuzhiyun 		return RK_CRYPTO_ERR_GENERIC;
59*4882a593Smuzhiyun 	}
60*4882a593Smuzhiyun #else
61*4882a593Smuzhiyun 	if (setenv(RKCRYPTO_TRACE_LEVEL_NAME, ch, 1)) {
62*4882a593Smuzhiyun 		printf("setenv error!");
63*4882a593Smuzhiyun 		return RK_CRYPTO_ERR_GENERIC;
64*4882a593Smuzhiyun 	}
65*4882a593Smuzhiyun #endif
66*4882a593Smuzhiyun 	trace_level = -1;
67*4882a593Smuzhiyun 	return RK_CRYPTO_SUCCESS;
68*4882a593Smuzhiyun }
69*4882a593Smuzhiyun 
trace_printf(int level,const char * function,int line,const char * fmt,...)70*4882a593Smuzhiyun void trace_printf(int level, const char *function, int line, const char *fmt, ...)
71*4882a593Smuzhiyun {
72*4882a593Smuzhiyun 	rkcrypto_get_trace_level();
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun 	if (level > trace_level) {
75*4882a593Smuzhiyun 		return;
76*4882a593Smuzhiyun 	} else {
77*4882a593Smuzhiyun 		int i;
78*4882a593Smuzhiyun 		char buffer[512];
79*4882a593Smuzhiyun 		va_list args;
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun 		va_start(args, fmt);
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun #ifdef ANDROID
84*4882a593Smuzhiyun 		int android_prio = ANDROID_LOG_INFO;
85*4882a593Smuzhiyun 		char head[100];
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun 		switch (level) {
88*4882a593Smuzhiyun 		case TRACE_ERROR:
89*4882a593Smuzhiyun 			android_prio = ANDROID_LOG_ERROR;
90*4882a593Smuzhiyun 			break;
91*4882a593Smuzhiyun 		case TRACE_INFO:
92*4882a593Smuzhiyun 			android_prio = ANDROID_LOG_INFO;
93*4882a593Smuzhiyun 			break;
94*4882a593Smuzhiyun 		case TRACE_DEBUG:
95*4882a593Smuzhiyun 			android_prio = ANDROID_LOG_DEBUG;
96*4882a593Smuzhiyun 			break;
97*4882a593Smuzhiyun 		case TRACE_VERBOSE:
98*4882a593Smuzhiyun 			android_prio = ANDROID_LOG_VERBOSE;
99*4882a593Smuzhiyun 			break;
100*4882a593Smuzhiyun 		default:
101*4882a593Smuzhiyun 			break;
102*4882a593Smuzhiyun 		}
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun 		sprintf(head, "%s: [%s, %d]", RKCRYPTO_LOG_TAG, function, line);
105*4882a593Smuzhiyun 		vsprintf(buffer, fmt, args);
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun 		if (buffer[0] != '\0') {
108*4882a593Smuzhiyun 			for (i = strlen(buffer) - 1; i >= 0; i--) {
109*4882a593Smuzhiyun 				if (buffer[i] != '\n')
110*4882a593Smuzhiyun 					break;
111*4882a593Smuzhiyun 			}
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun 			buffer[i + 1] = '\0';
114*4882a593Smuzhiyun 		}
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun 		__android_log_print(android_prio, head, "%s", buffer);
117*4882a593Smuzhiyun #else
118*4882a593Smuzhiyun 		char linux_prio = 'I';
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun 		switch (level) {
121*4882a593Smuzhiyun 		case TRACE_ERROR:
122*4882a593Smuzhiyun 			linux_prio = 'E';
123*4882a593Smuzhiyun 			break;
124*4882a593Smuzhiyun 		case TRACE_INFO:
125*4882a593Smuzhiyun 			linux_prio = 'I';
126*4882a593Smuzhiyun 			break;
127*4882a593Smuzhiyun 		case TRACE_DEBUG:
128*4882a593Smuzhiyun 			linux_prio = 'D';
129*4882a593Smuzhiyun 			break;
130*4882a593Smuzhiyun 		case TRACE_VERBOSE:
131*4882a593Smuzhiyun 			linux_prio = 'V';
132*4882a593Smuzhiyun 			break;
133*4882a593Smuzhiyun 		default:
134*4882a593Smuzhiyun 			break;
135*4882a593Smuzhiyun 		}
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun 		printf("%c %s: [%s, %d]: ", linux_prio, RKCRYPTO_LOG_TAG, function, line);
138*4882a593Smuzhiyun 		vsprintf(buffer, fmt, args);
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun 		if (buffer[0] != '\0') {
141*4882a593Smuzhiyun 			for (i = strlen(buffer) - 1; i >= 0; i--) {
142*4882a593Smuzhiyun 				if (buffer[i] != '\n')
143*4882a593Smuzhiyun 					break;
144*4882a593Smuzhiyun 			}
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun 			buffer[i + 1] = '\0';
147*4882a593Smuzhiyun 		}
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun 		printf("%s\n", buffer);
150*4882a593Smuzhiyun #endif
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun 		va_end(args);
153*4882a593Smuzhiyun 	}
154*4882a593Smuzhiyun }
155*4882a593Smuzhiyun 
hex_dump(int level,const char * function,int line,const char * buffer_name,const void * buffer,int len)156*4882a593Smuzhiyun void hex_dump(int level, const char *function, int line, const char *buffer_name,
157*4882a593Smuzhiyun 	      const void *buffer, int len)
158*4882a593Smuzhiyun {
159*4882a593Smuzhiyun 	trace_printf(level, function, line, "%s(%d): ", buffer_name, len);
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun 	if (level > trace_level) {
162*4882a593Smuzhiyun 		return;
163*4882a593Smuzhiyun 	} else {
164*4882a593Smuzhiyun 		int i, j, line_count;
165*4882a593Smuzhiyun 		char ch[4], tmp[64];
166*4882a593Smuzhiyun 		char *in = (char *)buffer;
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun 		line_count = len / 16;
169*4882a593Smuzhiyun 		line_count = len % 16 ? line_count + 1 : line_count;
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun 		for (i = 0; i < line_count; i++) {
172*4882a593Smuzhiyun 			memset(tmp, 0, sizeof(tmp));
173*4882a593Smuzhiyun 			for (j = 16 * i; j < 16 * (i + 1); j++) {
174*4882a593Smuzhiyun 				if (j < len)
175*4882a593Smuzhiyun 					sprintf(ch, "%02x ", in[j]);
176*4882a593Smuzhiyun 				else
177*4882a593Smuzhiyun 					sprintf(ch, "-- ");
178*4882a593Smuzhiyun 
179*4882a593Smuzhiyun 				strcat(tmp, ch);
180*4882a593Smuzhiyun 			}
181*4882a593Smuzhiyun 
182*4882a593Smuzhiyun #ifdef ANDROID
183*4882a593Smuzhiyun 			__android_log_print(ANDROID_LOG_VERBOSE, RKCRYPTO_LOG_TAG, "%s", tmp);
184*4882a593Smuzhiyun 			if (i % 16 == 0 && i != 0)
185*4882a593Smuzhiyun 				__android_log_print(ANDROID_LOG_VERBOSE, RKCRYPTO_LOG_TAG, "\n");
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun #else
188*4882a593Smuzhiyun 			printf("V %s: %s\n", RKCRYPTO_LOG_TAG, tmp);
189*4882a593Smuzhiyun 			if (i % 16 == 0 && i != 0)
190*4882a593Smuzhiyun 				printf("V %s: \n", RKCRYPTO_LOG_TAG);
191*4882a593Smuzhiyun #endif
192*4882a593Smuzhiyun 		}
193*4882a593Smuzhiyun 	}
194*4882a593Smuzhiyun }
195