Skip to content
Snippets Groups Projects
rsa-checksum.c 6.9 KiB
Newer Older
  • Learn to ignore specific revisions
  • /*
     * Copyright (c) 2013, Andreas Oetken.
     *
     * SPDX-License-Identifier:    GPL-2.0+
     */
    
    
    #ifndef USE_HOSTCC
    
    #include <common.h>
    #include <fdtdec.h>
    #include <asm/byteorder.h>
    #include <asm/errno.h>
    #include <asm/unaligned.h>
    
    #else
    #include "fdt_host.h"
    
    #include <u-boot/sha1.h>
    #include <u-boot/sha256.h>
    
    #endif
    #include <u-boot/rsa.h>
    
    
    /* PKCS 1.5 paddings as described in the RSA PKCS#1 v2.1 standard. */
    
    const uint8_t padding_sha256_rsa2048[RSA2048_BYTES - SHA256_SUM_LEN] = {
    0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x30, 0x31, 0x30,
    0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05,
    0x00, 0x04, 0x20
    };
    
    const uint8_t padding_sha1_rsa2048[RSA2048_BYTES - SHA1_SUM_LEN] = {
    	0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0x00, 0x30, 0x21, 0x30,
    	0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a,
    	0x05, 0x00, 0x04, 0x14
    };
    
    
    const uint8_t padding_sha256_rsa4096[RSA4096_BYTES - SHA256_SUM_LEN] = {
    	0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
    	0xff, 0xff, 0xff, 0xff, 0x00, 0x30, 0x31, 0x30,
    	0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65,
    	0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x04, 0x20
    };
    
    
    int hash_calculate(const char *name,
    		    const struct image_region region[],
    		    int region_count, uint8_t *checksum)
    
    	struct hash_algo *algo;
    	int ret = 0;
    	void *ctx;
    
    	uint32_t i;
    	i = 0;
    
    
    	ret = hash_progressive_lookup_algo(name, &algo);
    	if (ret)
    		return ret;
    
    	ret = algo->hash_init(algo, &ctx);
    	if (ret)
    		return ret;
    
    	for (i = 0; i < region_count - 1; i++) {
    		ret = algo->hash_update(algo, ctx, region[i].data,
    					region[i].size, 0);
    		if (ret)
    			return ret;
    	}
    
    	ret = algo->hash_update(algo, ctx, region[i].data, region[i].size, 1);
    	if (ret)
    		return ret;
    	ret = algo->hash_finish(algo, ctx, checksum, algo->digest_size);
    	if (ret)
    		return ret;