Blame view

common/cmd_md5sum.c 3.46 KB
c3d2a17c1   Mike Frysinger   md5sum/sha1sum/un...
1
  /*
5ab177bed   Joe Hershberger   Implement verify ...
2
3
4
   * (C) Copyright 2011
   * Joe Hershberger, National Instruments, joe.hershberger@ni.com
   *
c3d2a17c1   Mike Frysinger   md5sum/sha1sum/un...
5
6
7
   * (C) Copyright 2000
   * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
   *
1a4596601   Wolfgang Denk   Add GPL-2.0+ SPDX...
8
   * SPDX-License-Identifier:	GPL-2.0+
c3d2a17c1   Mike Frysinger   md5sum/sha1sum/un...
9
10
11
12
13
   */
  
  #include <common.h>
  #include <command.h>
  #include <u-boot/md5.h>
ecd729500   Joe Hershberger   Add parameter to ...
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
  /*
   * Store the resulting sum to an address or variable
   */
  static void store_result(const u8 *sum, const char *dest)
  {
  	unsigned int i;
  
  	if (*dest == '*') {
  		u8 *ptr;
  
  		ptr = (u8 *)simple_strtoul(dest + 1, NULL, 16);
  		for (i = 0; i < 16; i++)
  			*ptr++ = sum[i];
  	} else {
  		char str_output[33];
  		char *str_ptr = str_output;
  
  		for (i = 0; i < 16; i++) {
  			sprintf(str_ptr, "%02x", sum[i]);
  			str_ptr += 2;
  		}
  		str_ptr = '\0';
  		setenv(dest, str_output);
  	}
  }
5ab177bed   Joe Hershberger   Implement verify ...
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
  #ifdef CONFIG_MD5SUM_VERIFY
  static int parse_verify_sum(char *verify_str, u8 *vsum)
  {
  	if (*verify_str == '*') {
  		u8 *ptr;
  
  		ptr = (u8 *)simple_strtoul(verify_str + 1, NULL, 16);
  		memcpy(vsum, ptr, 16);
  	} else {
  		unsigned int i;
  		char *vsum_str;
  
  		if (strlen(verify_str) == 32)
  			vsum_str = verify_str;
  		else {
  			vsum_str = getenv(verify_str);
  			if (vsum_str == NULL || strlen(vsum_str) != 32)
  				return 1;
  		}
  
  		for (i = 0; i < 16; i++) {
  			char *nullp = vsum_str + (i + 1) * 2;
  			char end = *nullp;
  
  			*nullp = '\0';
  			*(u8 *)(vsum + i) =
  				simple_strtoul(vsum_str + (i * 2), NULL, 16);
  			*nullp = end;
  		}
  	}
  	return 0;
  }
  
  int do_md5sum(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
  {
  	ulong addr, len;
  	unsigned int i;
  	u8 output[16];
  	u8 vsum[16];
  	int verify = 0;
  	int ac;
  	char * const *av;
  
  	if (argc < 3)
  		return CMD_RET_USAGE;
  
  	av = argv + 1;
  	ac = argc - 1;
  	if (strcmp(*av, "-v") == 0) {
  		verify = 1;
  		av++;
  		ac--;
  		if (ac < 3)
  			return CMD_RET_USAGE;
  	}
  
  	addr = simple_strtoul(*av++, NULL, 16);
  	len = simple_strtoul(*av++, NULL, 16);
  
  	md5_wd((unsigned char *) addr, len, output, CHUNKSZ_MD5);
  
  	if (!verify) {
  		printf("md5 for %08lx ... %08lx ==> ", addr, addr + len - 1);
  		for (i = 0; i < 16; i++)
  			printf("%02x", output[i]);
  		printf("
  ");
ecd729500   Joe Hershberger   Add parameter to ...
106
107
108
  
  		if (ac > 2)
  			store_result(output, *av);
5ab177bed   Joe Hershberger   Implement verify ...
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
  	} else {
  		char *verify_str = *av++;
  
  		if (parse_verify_sum(verify_str, vsum)) {
  			printf("ERROR: %s does not contain a valid md5 sum
  ",
  				verify_str);
  			return 1;
  		}
  		if (memcmp(output, vsum, 16) != 0) {
  			printf("md5 for %08lx ... %08lx ==> ", addr,
  				addr + len - 1);
  			for (i = 0; i < 16; i++)
  				printf("%02x", output[i]);
  			printf(" != ");
  			for (i = 0; i < 16; i++)
  				printf("%02x", vsum[i]);
  			printf(" ** ERROR **
  ");
  			return 1;
  		}
  	}
  
  	return 0;
  }
  #else
c3d2a17c1   Mike Frysinger   md5sum/sha1sum/un...
135
136
137
138
139
140
141
  static int do_md5sum(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
  {
  	unsigned long addr, len;
  	unsigned int i;
  	u8 output[16];
  
  	if (argc < 3)
4c12eeb8b   Simon Glass   Convert cmd_usage...
142
  		return CMD_RET_USAGE;
c3d2a17c1   Mike Frysinger   md5sum/sha1sum/un...
143
144
145
  
  	addr = simple_strtoul(argv[1], NULL, 16);
  	len = simple_strtoul(argv[2], NULL, 16);
a16a84b72   Jens Scharsig   Fix: watchdog tim...
146
  	md5_wd((unsigned char *) addr, len, output, CHUNKSZ_MD5);
c3d2a17c1   Mike Frysinger   md5sum/sha1sum/un...
147
148
149
150
151
  	printf("md5 for %08lx ... %08lx ==> ", addr, addr + len - 1);
  	for (i = 0; i < 16; i++)
  		printf("%02x", output[i]);
  	printf("
  ");
ecd729500   Joe Hershberger   Add parameter to ...
152
153
  	if (argc > 3)
  		store_result(output, argv[3]);
c3d2a17c1   Mike Frysinger   md5sum/sha1sum/un...
154
155
  	return 0;
  }
5ab177bed   Joe Hershberger   Implement verify ...
156
  #endif
c3d2a17c1   Mike Frysinger   md5sum/sha1sum/un...
157

5ab177bed   Joe Hershberger   Implement verify ...
158
159
160
161
  #ifdef CONFIG_MD5SUM_VERIFY
  U_BOOT_CMD(
  	md5sum,	5,	1,	do_md5sum,
  	"compute MD5 message digest",
ecd729500   Joe Hershberger   Add parameter to ...
162
163
164
165
  	"address count [[*]sum]
  "
  		"    - compute MD5 message digest [save to sum]
  "
5ab177bed   Joe Hershberger   Implement verify ...
166
167
168
169
170
  	"md5sum -v address count [*]sum
  "
  		"    - verify md5sum of memory area"
  );
  #else
c3d2a17c1   Mike Frysinger   md5sum/sha1sum/un...
171
  U_BOOT_CMD(
ecd729500   Joe Hershberger   Add parameter to ...
172
  	md5sum,	4,	1,	do_md5sum,
c3d2a17c1   Mike Frysinger   md5sum/sha1sum/un...
173
  	"compute MD5 message digest",
ecd729500   Joe Hershberger   Add parameter to ...
174
175
176
  	"address count [[*]sum]
  "
  		"    - compute MD5 message digest [save to sum]"
c3d2a17c1   Mike Frysinger   md5sum/sha1sum/un...
177
  );
5ab177bed   Joe Hershberger   Implement verify ...
178
  #endif