1646257d1SHeiko Schocher /* 2646257d1SHeiko Schocher * Copyright (c) 2013, Andreas Oetken. 3646257d1SHeiko Schocher * 4646257d1SHeiko Schocher * SPDX-License-Identifier: GPL-2.0+ 5646257d1SHeiko Schocher */ 6646257d1SHeiko Schocher 729a23f9dSHeiko Schocher #ifndef USE_HOSTCC 8646257d1SHeiko Schocher #include <common.h> 9646257d1SHeiko Schocher #include <fdtdec.h> 10646257d1SHeiko Schocher #include <asm/byteorder.h> 11*1221ce45SMasahiro Yamada #include <linux/errno.h> 12646257d1SHeiko Schocher #include <asm/unaligned.h> 13b37b46f0SRuchika Gupta #include <hash.h> 1429a23f9dSHeiko Schocher #else 1529a23f9dSHeiko Schocher #include "fdt_host.h" 162b9912e6SJeroen Hofstee #include <u-boot/sha1.h> 172b9912e6SJeroen Hofstee #include <u-boot/sha256.h> 18b37b46f0SRuchika Gupta #endif 19b37b46f0SRuchika Gupta #include <u-boot/rsa.h> 20646257d1SHeiko Schocher 21646257d1SHeiko Schocher /* PKCS 1.5 paddings as described in the RSA PKCS#1 v2.1 standard. */ 22646257d1SHeiko Schocher 23646257d1SHeiko Schocher const uint8_t padding_sha256_rsa2048[RSA2048_BYTES - SHA256_SUM_LEN] = { 24646257d1SHeiko Schocher 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 25646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 26646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 27646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 28646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 29646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 30646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 31646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 32646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 33646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 34646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 35646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 36646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 37646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 38646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 39646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x30, 0x31, 0x30, 40646257d1SHeiko Schocher 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 41646257d1SHeiko Schocher 0x00, 0x04, 0x20 42646257d1SHeiko Schocher }; 43646257d1SHeiko Schocher 44646257d1SHeiko Schocher const uint8_t padding_sha1_rsa2048[RSA2048_BYTES - SHA1_SUM_LEN] = { 45646257d1SHeiko Schocher 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 46646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 47646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 48646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 49646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 50646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 51646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 52646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 53646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 54646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 55646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 56646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 57646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 58646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 59646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 60646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 61646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 62646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 63646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 64646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 65646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 66646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 67646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 68646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 69646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 70646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 71646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 72646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0x00, 0x30, 0x21, 0x30, 73646257d1SHeiko Schocher 0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 74646257d1SHeiko Schocher 0x05, 0x00, 0x04, 0x14 75646257d1SHeiko Schocher }; 76646257d1SHeiko Schocher 77db1b5f3dSHeiko Schocher const uint8_t padding_sha256_rsa4096[RSA4096_BYTES - SHA256_SUM_LEN] = { 78db1b5f3dSHeiko Schocher 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 79db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 80db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 81db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 82db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 83db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 84db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 85db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 86db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 87db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 88db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 89db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 90db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 91db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 92db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 93db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 94db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 95db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 96db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 97db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 98db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 99db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 100db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 101db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 102db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 103db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 104db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 105db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 106db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 107db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 108db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 109db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 110db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 111db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 112db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 113db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 114db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 115db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 116db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 117db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 118db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 119db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 120db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 121db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 122db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 123db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 124db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 125db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 126db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 127db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 128db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 129db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 130db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 131db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 132db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 133db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 134db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 135db1b5f3dSHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0x00, 0x30, 0x31, 0x30, 136db1b5f3dSHeiko Schocher 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 137db1b5f3dSHeiko Schocher 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x04, 0x20 138db1b5f3dSHeiko Schocher }; 139db1b5f3dSHeiko Schocher 140b37b46f0SRuchika Gupta int hash_calculate(const char *name, 141b37b46f0SRuchika Gupta const struct image_region region[], 142b37b46f0SRuchika Gupta int region_count, uint8_t *checksum) 143646257d1SHeiko Schocher { 144b37b46f0SRuchika Gupta struct hash_algo *algo; 145b37b46f0SRuchika Gupta int ret = 0; 146b37b46f0SRuchika Gupta void *ctx; 147646257d1SHeiko Schocher uint32_t i; 148646257d1SHeiko Schocher i = 0; 149646257d1SHeiko Schocher 150b37b46f0SRuchika Gupta ret = hash_progressive_lookup_algo(name, &algo); 151b37b46f0SRuchika Gupta if (ret) 152b37b46f0SRuchika Gupta return ret; 153b37b46f0SRuchika Gupta 154b37b46f0SRuchika Gupta ret = algo->hash_init(algo, &ctx); 155b37b46f0SRuchika Gupta if (ret) 156b37b46f0SRuchika Gupta return ret; 157b37b46f0SRuchika Gupta 158b37b46f0SRuchika Gupta for (i = 0; i < region_count - 1; i++) { 159b37b46f0SRuchika Gupta ret = algo->hash_update(algo, ctx, region[i].data, 160b37b46f0SRuchika Gupta region[i].size, 0); 161b37b46f0SRuchika Gupta if (ret) 162b37b46f0SRuchika Gupta return ret; 163646257d1SHeiko Schocher } 164646257d1SHeiko Schocher 165b37b46f0SRuchika Gupta ret = algo->hash_update(algo, ctx, region[i].data, region[i].size, 1); 166b37b46f0SRuchika Gupta if (ret) 167b37b46f0SRuchika Gupta return ret; 168b37b46f0SRuchika Gupta ret = algo->hash_finish(algo, ctx, checksum, algo->digest_size); 169b37b46f0SRuchika Gupta if (ret) 170b37b46f0SRuchika Gupta return ret; 171646257d1SHeiko Schocher 172b37b46f0SRuchika Gupta return 0; 173646257d1SHeiko Schocher } 174