static int do_digest(char *algorithm, int argc, char *argv[]) { struct digest *d; int ret = 0; int i; unsigned char *hash; d = digest_get_by_name(algorithm); BUG_ON(!d); if (argc < 2) return COMMAND_ERROR_USAGE; hash = calloc(d->length, sizeof(unsigned char)); if (!hash) { perror("calloc"); return COMMAND_ERROR_USAGE; } argv++; while (*argv) { char *filename = "/dev/mem"; ulong start = 0, size = ~0; /* arguments are either file, file+area or area */ if (parse_area_spec(*argv, &start, &size)) { filename = *argv; if (argv[1] && !parse_area_spec(argv[1], &start, &size)) argv++; } if (digest_file_window(d, filename, hash, start, size) < 0) ret = 1; for (i = 0; i < d->length; i++) printf("%02x", hash[i]); printf(" %s\t0x%08lx ... 0x%08lx\n", filename, start, start + size); argv++; } free(hash); return ret; }
static int do_crc(int argc, char *argv[]) { loff_t start = 0, size = ~0; ulong crc = 0, vcrc = 0, total = 0; char *filename = "/dev/mem"; #ifdef CONFIG_CMD_CRC_CMP char *vfilename = NULL; #endif int opt, err = 0, filegiven = 0, verify = 0; while((opt = getopt(argc, argv, "f:F:v:V:")) > 0) { switch(opt) { case 'f': filename = optarg; filegiven = 1; break; #ifdef CONFIG_CMD_CRC_CMP case 'F': verify = 1; vfilename = optarg; break; #endif case 'v': verify = 1; vcrc = simple_strtoul(optarg, NULL, 0); break; case 'V': if (!crc_from_file(optarg, &vcrc)) verify = 1; break; default: return COMMAND_ERROR_USAGE; } } if (!filegiven && optind == argc) return COMMAND_ERROR_USAGE; if (optind < argc) { if (parse_area_spec(argv[optind], &start, &size)) { printf("could not parse area description: %s\n", argv[optind]); return 1; } } if (file_crc(filename, start, size, &crc, &total) < 0) return 1; printf("CRC32 for %s 0x%08lx ... 0x%08lx ==> 0x%08lx", filename, (ulong)start, (ulong)start + total - 1, crc); #ifdef CONFIG_CMD_CRC_CMP if (vfilename) { size = total; puts("\n"); if (file_crc(vfilename, start, size, &vcrc, &total) < 0) return 1; } #endif if (verify && crc != vcrc) { printf(" != 0x%08lx ** ERROR **", vcrc); err = 1; } printf("\n"); return err; }