int _get_sha1_data(char *buf, int len, char *outbuf, int need_convert){ unsigned int dwtmp; SHA_hash(buf,len,outbuf); if (need_convert) { // invert data by integer big/little endian memcpy(&dwtmp,outbuf,4); dwtmp=bswap32(dwtmp); memcpy(outbuf,&dwtmp,4); memcpy(&dwtmp,outbuf+4,4); dwtmp=bswap32(dwtmp); memcpy(outbuf+4,&dwtmp,4); memcpy(&dwtmp,outbuf+8,4); dwtmp=bswap32(dwtmp); memcpy(outbuf+8,&dwtmp,4); memcpy(&dwtmp,outbuf+12,4); dwtmp=bswap32(dwtmp); memcpy(outbuf+12,&dwtmp,4); memcpy(&dwtmp,outbuf+16,4); dwtmp=bswap32(dwtmp); memcpy(outbuf+16,&dwtmp,4); }; return 0; }
const uint8_t *DCRYPTO_SHA1_hash(const void *data, uint32_t n, uint8_t *digest) { if (dcrypto_grab_sha_hw()) /* dcrypto_sha_wait() will release the hw. */ dcrypto_sha_hash(SHA1_MODE, data, n, digest); else SHA_hash(data, n, digest); return digest; }
// Read a file into memory; optionally (retouch_flag == RETOUCH_DO_MASK) mask // the retouched entries back to their original value (such that SHA-1 checks // don't fail due to randomization); store the file contents and associated // metadata in *file. // // Return 0 on success. int LoadFileContents(const char* filename, FileContents* file, int retouch_flag) { file->data = NULL; // A special 'filename' beginning with "MTD:" or "EMMC:" means to // load the contents of a partition. if (strncmp(filename, "MTD:", 4) == 0 || strncmp(filename, "EMMC:", 5) == 0) { return LoadPartitionContents(filename, file); } if (stat(filename, &file->st) != 0) { printf("failed to stat \"%s\": %s\n", filename, strerror(errno)); return -1; } file->size = file->st.st_size; file->data = malloc(file->size); FILE* f = fopen(filename, "rb"); if (f == NULL) { printf("failed to open \"%s\": %s\n", filename, strerror(errno)); free(file->data); file->data = NULL; return -1; } ssize_t bytes_read = fread(file->data, 1, file->size, f); if (bytes_read != file->size) { printf("short read of \"%s\" (%ld bytes of %ld)\n", filename, (long)bytes_read, (long)file->size); free(file->data); file->data = NULL; return -1; } fclose(f); // apply_patch[_check] functions are blind to randomization. Randomization // is taken care of in [Undo]RetouchBinariesFn. If there is a mismatch // within a file, this means the file is assumed "corrupt" for simplicity. if (retouch_flag) { int32_t desired_offset = 0; if (retouch_mask_data(file->data, file->size, &desired_offset, NULL) != RETOUCH_DATA_MATCHED) { printf("error trying to mask retouch entries\n"); free(file->data); file->data = NULL; return -1; } } SHA_hash(file->data, file->size, file->sha1); return 0; }
uint8_t* c4pkg_hash_sha1(char *data, int len, int *retsz) { if (!data || len < 0) { return NULL; } uint8_t *digest = (uint8_t*) malloc(sizeof(uint8_t) * SHA_DIGEST_SIZE); if (!digest) { return NULL; } if (retsz) { *retsz = SHA_DIGEST_SIZE; } SHA_hash(data, len, digest); return digest; }
// Read a file into memory; store the file contents and associated // metadata in *file. // // Return 0 on success. int LoadFileContents(const char* filename, FileContents* file) { file->data = NULL; // A special 'filename' beginning with "MTD:" or "EMMC:" means to // load the contents of a partition. if (strncmp(filename, "MTD:", 4) == 0 || strncmp(filename, "EMMC:", 5) == 0) { return LoadPartitionContents(filename, file); } if (stat(filename, &file->st) != 0) { printf("failed to stat \"%s\": %s\n", filename, strerror(errno)); return -1; } file->size = file->st.st_size; file->data = malloc(file->size); FILE* f = fopen(filename, "rb"); if (f == NULL) { printf("failed to open \"%s\": %s\n", filename, strerror(errno)); free(file->data); file->data = NULL; return -1; } ssize_t bytes_read = fread(file->data, 1, file->size, f); if (bytes_read != file->size) { printf("short read of \"%s\" (%ld bytes of %ld)\n", filename, (long)bytes_read, (long)file->size); free(file->data); file->data = NULL; return -1; } fclose(f); SHA_hash(file->data, file->size, file->sha1); return 0; }