--- kernel/linux/hash.c.orig 2015-05-05 00:16:41 UTC +++ kernel/linux/hash.c @@ -1,91 +0,0 @@ -// Copyright 2004-present Facebook. All Rights Reserved. - -#include -#include -#include - -/* Crypto */ -#include -#include -#include -#include - -#include "hash.h" - -unsigned char *kernel_text_hash(void) { - return (unsigned char *) hash_data((void *) TEXT_SEGMENT_START, - TEXT_SEGMENT_END - TEXT_SEGMENT_START); -} - -/** - * @brief Generic function for performing a SHA-1 hash of a memory range - * - * @param data - Beginning memory address to perform hash - * @param len - size in bytes of the address range to hash - * - * @return allocated buffer containing the hash string; or NULL upon error. - */ -unsigned char *hash_data(const void *data, size_t len) { - struct scatterlist sg; - struct hash_desc desc; - size_t out_len = SHA1_DIGEST_SIZE * 2 + 1; - unsigned char hashtext[SHA1_DIGEST_SIZE]; - unsigned char *hashtext_out = kmalloc(out_len, GFP_KERNEL); - - if (!hashtext_out) { - printk(KERN_INFO "Could not allocate space for hash\n"); - return NULL; - } - - sg_init_one(&sg, data, len); - desc.flags = 0; - desc.tfm = crypto_alloc_hash("sha1", 0, CRYPTO_ALG_ASYNC); - - crypto_hash_init(&desc); - crypto_hash_update(&desc, &sg, sg.length); - crypto_hash_final(&desc, hashtext); - - snprintf(hashtext_out, - out_len, - "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x" - "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", - hashtext[0], hashtext[1], hashtext[2], hashtext[3], - hashtext[4], hashtext[5], hashtext[6], hashtext[7], - hashtext[8], hashtext[9], hashtext[10], hashtext[11], - hashtext[12], hashtext[13], hashtext[14], hashtext[15], - hashtext[16], hashtext[17], hashtext[18], hashtext[19] - ); - - if (desc.tfm) { - crypto_free_hash(desc.tfm); - } - - return hashtext_out; -} - -/** - * @brief Callback for the sysfs object read. This happens when a file is - * read(2) (or equivalent) from within sysfs. E.g. cat /sys/foo/bar will - * call bar's *_show callback method. - * - * @param obj - reference to a kernel object within the sysfs filesystem - * @param attr - attribute of said kernel object - * @param buf - buffer that will be allocated and filled with the hash - * - * @return size in bytes of the hash string; or -1 upon error. - */ -ssize_t text_segment_hash_show(struct kobject *obj, - struct attribute *attr, - char *buf) { - ssize_t ret; - char *hash = kernel_text_hash(); - - if (hash) { - ret = scnprintf(buf, PAGE_SIZE, "%s\n", hash); - kfree(hash); - } else { - ret = -1; - } - - return ret; -}