1*646257d1SHeiko Schocher /* 2*646257d1SHeiko Schocher * Copyright (c) 2013, Andreas Oetken. 3*646257d1SHeiko Schocher * 4*646257d1SHeiko Schocher * SPDX-License-Identifier: GPL-2.0+ 5*646257d1SHeiko Schocher */ 6*646257d1SHeiko Schocher 7*646257d1SHeiko Schocher #include <common.h> 8*646257d1SHeiko Schocher #include <fdtdec.h> 9*646257d1SHeiko Schocher #include <rsa.h> 10*646257d1SHeiko Schocher #include <sha1.h> 11*646257d1SHeiko Schocher #include <sha256.h> 12*646257d1SHeiko Schocher #include <asm/byteorder.h> 13*646257d1SHeiko Schocher #include <asm/errno.h> 14*646257d1SHeiko Schocher #include <asm/unaligned.h> 15*646257d1SHeiko Schocher 16*646257d1SHeiko Schocher #define RSA2048_BYTES 256 17*646257d1SHeiko Schocher 18*646257d1SHeiko Schocher /* PKCS 1.5 paddings as described in the RSA PKCS#1 v2.1 standard. */ 19*646257d1SHeiko Schocher 20*646257d1SHeiko Schocher const uint8_t padding_sha256_rsa2048[RSA2048_BYTES - SHA256_SUM_LEN] = { 21*646257d1SHeiko Schocher 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 22*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 23*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 24*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 25*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 26*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 27*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 28*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 29*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 30*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 31*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 32*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 33*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 34*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 35*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 36*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x30, 0x31, 0x30, 37*646257d1SHeiko Schocher 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 38*646257d1SHeiko Schocher 0x00, 0x04, 0x20 39*646257d1SHeiko Schocher }; 40*646257d1SHeiko Schocher 41*646257d1SHeiko Schocher const uint8_t padding_sha1_rsa2048[RSA2048_BYTES - SHA1_SUM_LEN] = { 42*646257d1SHeiko Schocher 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 43*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 44*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 45*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 46*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 47*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 48*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 49*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 50*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 51*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 52*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 53*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 54*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 55*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 56*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 57*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 58*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 59*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 60*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 61*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 62*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 63*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 64*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 65*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 66*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 67*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 68*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 69*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0x00, 0x30, 0x21, 0x30, 70*646257d1SHeiko Schocher 0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 71*646257d1SHeiko Schocher 0x05, 0x00, 0x04, 0x14 72*646257d1SHeiko Schocher }; 73*646257d1SHeiko Schocher 74*646257d1SHeiko Schocher void sha1_calculate(const struct image_region region[], int region_count, 75*646257d1SHeiko Schocher uint8_t *checksum) 76*646257d1SHeiko Schocher { 77*646257d1SHeiko Schocher sha1_context ctx; 78*646257d1SHeiko Schocher uint32_t i; 79*646257d1SHeiko Schocher i = 0; 80*646257d1SHeiko Schocher 81*646257d1SHeiko Schocher sha1_starts(&ctx); 82*646257d1SHeiko Schocher for (i = 0; i < region_count; i++) 83*646257d1SHeiko Schocher sha1_update(&ctx, region[i].data, region[i].size); 84*646257d1SHeiko Schocher sha1_finish(&ctx, checksum); 85*646257d1SHeiko Schocher } 86*646257d1SHeiko Schocher 87*646257d1SHeiko Schocher void sha256_calculate(const struct image_region region[], int region_count, 88*646257d1SHeiko Schocher uint8_t *checksum) 89*646257d1SHeiko Schocher { 90*646257d1SHeiko Schocher sha256_context ctx; 91*646257d1SHeiko Schocher uint32_t i; 92*646257d1SHeiko Schocher i = 0; 93*646257d1SHeiko Schocher 94*646257d1SHeiko Schocher sha256_starts(&ctx); 95*646257d1SHeiko Schocher for (i = 0; i < region_count; i++) 96*646257d1SHeiko Schocher sha256_update(&ctx, region[i].data, region[i].size); 97*646257d1SHeiko Schocher sha256_finish(&ctx, checksum); 98*646257d1SHeiko Schocher } 99