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> 11646257d1SHeiko Schocher #include <asm/errno.h> 12646257d1SHeiko Schocher #include <asm/unaligned.h> 13*b37b46f0SRuchika 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> 18*b37b46f0SRuchika Gupta #endif 19*b37b46f0SRuchika 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 140*b37b46f0SRuchika Gupta int hash_calculate(const char *name, 141*b37b46f0SRuchika Gupta const struct image_region region[], 142*b37b46f0SRuchika Gupta int region_count, uint8_t *checksum) 143646257d1SHeiko Schocher { 144*b37b46f0SRuchika Gupta struct hash_algo *algo; 145*b37b46f0SRuchika Gupta int ret = 0; 146*b37b46f0SRuchika Gupta void *ctx; 147646257d1SHeiko Schocher uint32_t i; 148646257d1SHeiko Schocher i = 0; 149646257d1SHeiko Schocher 150*b37b46f0SRuchika Gupta ret = hash_progressive_lookup_algo(name, &algo); 151*b37b46f0SRuchika Gupta if (ret) 152*b37b46f0SRuchika Gupta return ret; 153*b37b46f0SRuchika Gupta 154*b37b46f0SRuchika Gupta ret = algo->hash_init(algo, &ctx); 155*b37b46f0SRuchika Gupta if (ret) 156*b37b46f0SRuchika Gupta return ret; 157*b37b46f0SRuchika Gupta 158*b37b46f0SRuchika Gupta for (i = 0; i < region_count - 1; i++) { 159*b37b46f0SRuchika Gupta ret = algo->hash_update(algo, ctx, region[i].data, 160*b37b46f0SRuchika Gupta region[i].size, 0); 161*b37b46f0SRuchika Gupta if (ret) 162*b37b46f0SRuchika Gupta return ret; 163646257d1SHeiko Schocher } 164646257d1SHeiko Schocher 165*b37b46f0SRuchika Gupta ret = algo->hash_update(algo, ctx, region[i].data, region[i].size, 1); 166*b37b46f0SRuchika Gupta if (ret) 167*b37b46f0SRuchika Gupta return ret; 168*b37b46f0SRuchika Gupta ret = algo->hash_finish(algo, ctx, checksum, algo->digest_size); 169*b37b46f0SRuchika Gupta if (ret) 170*b37b46f0SRuchika Gupta return ret; 171646257d1SHeiko Schocher 172*b37b46f0SRuchika Gupta return 0; 173646257d1SHeiko Schocher } 174