Commit 84f9b3ea authored by ji.luo's avatar ji.luo Committed by Jason Liu
Browse files

MA-10336-1 Take new AVB method



Use hard code public key instead of reading it from RPMB.
Read RPMB key from last block of BOOT1 instead of fuse.

Change-Id: Icddd0bc45af8f9a9b222d54e16a7dfc6efa6c8b2
Signed-off-by: default avatarji.luo <ji.luo@nxp.com>
parent d4801535
......@@ -736,14 +736,14 @@ static int initr_check_fastboot(void)
}
#endif
#ifdef CONFIG_IMX_TRUSTY_OS
#ifdef TRUSTY_KEYSLOT_PACKAGE
#ifdef AVB_RPMB
static int initr_avbkey(void)
{
return init_avbkey();
}
#endif
#ifdef CONFIG_IMX_TRUSTY_OS
static int initr_tee_setup(void)
{
tee_setup();
......@@ -980,10 +980,10 @@ static init_fnc_t init_sequence_r[] = {
#if defined(CONFIG_SPARC)
prom_init,
#endif
#ifdef CONFIG_IMX_TRUSTY_OS
#ifdef TRUSTY_KEYSLOT_PACKAGE
#ifdef AVB_RPMB
initr_avbkey,
#endif
#ifdef CONFIG_IMX_TRUSTY_OS
initr_tee_setup,
#endif
#ifdef CONFIG_FSL_FASTBOOT
......
......@@ -12,6 +12,7 @@
#include <fsl_avb.h>
#include "fsl_avbkey.h"
#include "fsl_public_key.h"
#include "utils.h"
#include "debug.h"
......@@ -110,7 +111,63 @@ static int fsl_fuse_write(const uint32_t *buffer, uint32_t length, uint32_t offs
);
}
#ifdef TRUSTY_KEYSLOT_PACKAGE
#ifdef AVB_RPMB
static int rpmb_read(struct mmc *mmc, uint8_t *buffer, size_t num_bytes, int64_t offset);
static int rpmb_write(struct mmc *mmc, uint8_t *buffer, size_t num_bytes, int64_t offset);
static int rpmb_init(void) {
int i;
kblb_hdr_t hdr;
kblb_tag_t *tag;
struct mmc *mmc_dev;
uint32_t offset;
uint32_t rbidx_len;
uint8_t *rbidx;
/* check init status first */
if ((mmc_dev = get_mmc()) == NULL) {
ERR("ERROR - get mmc device\n");
return -1;
}
if (rpmb_read(mmc_dev, (uint8_t *)&hdr, sizeof(hdr), 0) != 0) {
ERR("read RPMB error\n");
return -1;
}
if (!memcmp(hdr.magic, AVB_KBLB_MAGIC, AVB_KBLB_MAGIC_LEN))
return 0;
/* init RPMB if not inited before */
/* init rollback index */
offset = AVB_RBIDX_START;
rbidx_len = AVB_RBIDX_LEN;
rbidx = malloc(rbidx_len);
if (rbidx == NULL)
return -1;
memset(rbidx, 0, rbidx_len);
*(uint64_t *)rbidx = AVB_RBIDX_INITVAL;
for (i = 0; i < AVB_MAX_NUMBER_OF_ROLLBACK_INDEX_LOCATIONS; i++) {
tag = &hdr.rbk_tags[i];
tag->flag = AVB_RBIDX_FLAG;
tag->offset = offset;
tag->len = rbidx_len;
if (rpmb_write(mmc_dev, rbidx, tag->len, tag->offset) != 0) {
ERR("write RBKIDX RPMB error\n");
free(rbidx);
return -1;
}
offset += AVB_RBIDX_ALIGN;
}
free(rbidx);
/* init hdr */
memcpy(hdr.magic, AVB_KBLB_MAGIC, AVB_KBLB_MAGIC_LEN);
if (rpmb_write(mmc_dev, (uint8_t *)&hdr, sizeof(hdr), 0) != 0) {
ERR("write RPMB hdr error\n");
return -1;
}
return 0;
}
static void fill_secure_keyslot_package(struct keyslot_package *kp) {
memcpy((void*)CAAM_ARB_BASE_ADDR, kp, sizeof(struct keyslot_package));
......@@ -153,8 +210,8 @@ static int read_keyslot_package(struct keyslot_package* kp) {
return -1;
}
mmc_switch_part(mmc, TEE_HWPARTITION_ID);
if (mmc->block_dev.block_read(dev_desc, TRUSTY_OS_MMC_BLKS,
mmc_switch_part(mmc, KEYSLOT_HWPARTITION_ID);
if (mmc->block_dev.block_read(dev_desc, KEYSLOT_BLKS,
1, fill) != 1) {
printf("Failed to read rpmbkeyblob.");
ret = -1;
......@@ -237,8 +294,8 @@ static int gen_rpmb_key(struct keyslot_package *kp) {
}
memcpy(fill, kp, sizeof(struct keyslot_package));
mmc_switch_part(mmc, TEE_HWPARTITION_ID);
if (mmc->block_dev.block_write(dev_desc, TRUSTY_OS_MMC_BLKS,
mmc_switch_part(mmc, KEYSLOT_HWPARTITION_ID);
if (mmc->block_dev.block_write(dev_desc, KEYSLOT_BLKS,
1, (void *)fill) != 1) {
printf("Failed to write rpmbkeyblob.");
}
......@@ -275,6 +332,8 @@ int init_avbkey(void) {
printf("keyslot package magic error. Will generate new one\n");
gen_rpmb_key(&kp);
}
if (rpmb_init())
return -1;
fill_secure_keyslot_package(&kp);
return 0;
}
......@@ -373,7 +432,11 @@ static int rpmb_read(struct mmc *mmc, uint8_t *buffer, size_t num_bytes, int64_t
margin_pos_t margin;
char original_part;
uint8_t extract_key[RPMBKEY_LENGTH];
uint8_t blob[RPMBKEY_FUSE_LEN];
uint8_t *blob = NULL;
#ifdef AVB_RPMB
struct keyslot_package kp;
#endif
int ret;
......@@ -401,11 +464,20 @@ static int rpmb_read(struct mmc *mmc, uint8_t *buffer, size_t num_bytes, int64_t
}
/* get rpmb key */
blob = (uint8_t *)memalign(ALIGN_BYTES, RPMBKEY_BLOB_LEN);
#ifdef AVB_RPMB
if (read_keyslot_package(&kp)) {
#else
if (fsl_fuse_read((uint32_t *)blob, RPMBKEY_FUSE_LENW, RPMBKEY_FUSE_OFFSET)){
#endif
ERR("read rpmb key error\n");
ret = -1;
goto fail;
}
/* copy rpmb key to blob */
#ifdef AVB_RPMB
memcpy(blob, kp.rpmb_keyblob, RPMBKEY_BLOB_LEN);
#endif
caam_open();
if (caam_decap_blob((uint32_t)extract_key, (uint32_t)blob, RPMBKEY_LENGTH)) {
ERR("decap rpmb key error\n");
......@@ -413,13 +485,13 @@ static int rpmb_read(struct mmc *mmc, uint8_t *buffer, size_t num_bytes, int64_t
goto fail;
}
// alloc a blksz mem
/* alloc a blksz mem */
bdata = (unsigned char *)memalign(ALIGN_BYTES, blksz);
if (bdata == NULL) {
ret = -1;
goto fail;
}
// one block a time
/* one block a time */
while (bs <= be) {
memset(bdata, 0, blksz);
if (mmc_rpmb_read(mmc, bdata, bs, 1, extract_key) != 1) {
......@@ -446,6 +518,8 @@ fail:
return -1;
mmc->block_dev.hwpart = original_part;
}
if (blob != NULL)
free(blob);
if (bdata != NULL)
free(bdata);
return ret;
......@@ -462,7 +536,11 @@ static int rpmb_write(struct mmc *mmc, uint8_t *buffer, size_t num_bytes, int64_
margin_pos_t margin;
char original_part;
uint8_t extract_key[RPMBKEY_LENGTH];
uint8_t blob[RPMBKEY_FUSE_LEN];
uint8_t *blob = NULL;
#ifdef AVB_RPMB
struct keyslot_package kp;
#endif
int ret;
......@@ -491,19 +569,27 @@ static int rpmb_write(struct mmc *mmc, uint8_t *buffer, size_t num_bytes, int64_
}
/* get rpmb key */
blob = (uint8_t *)memalign(ALIGN_BYTES, RPMBKEY_BLOB_LEN);
#ifdef AVB_RPMB
if (read_keyslot_package(&kp)) {
#else
if (fsl_fuse_read((uint32_t *)blob, RPMBKEY_FUSE_LENW, RPMBKEY_FUSE_OFFSET)){
#endif
ERR("read rpmb key error\n");
ret = -1;
goto fail;
}
/* copy rpmb key to blob */
#ifdef AVB_RPMB
memcpy(blob, kp.rpmb_keyblob, RPMBKEY_BLOB_LEN);
#endif
caam_open();
if (caam_decap_blob((uint32_t)extract_key, (uint32_t)blob, RPMBKEY_LENGTH)) {
ERR("decap rpmb key error\n");
ret = -1;
goto fail;
}
// alloc a blksz mem
/* alloc a blksz mem */
bdata = (unsigned char *)memalign(ALIGN_BYTES, blksz);
if (bdata == NULL) {
ret = -1;
......@@ -514,14 +600,14 @@ static int rpmb_write(struct mmc *mmc, uint8_t *buffer, size_t num_bytes, int64_
cnt = blksz - s;
if (num_write + cnt > num_bytes)
cnt = num_bytes - num_write;
if (!s || cnt != blksz) { //read blk first
if (!s || cnt != blksz) { /* read blk first */
if (mmc_rpmb_read(mmc, bdata, bs, 1, extract_key) != 1) {
ERR("mmc_rpmb_read err, mmc= 0x%08x\n", (unsigned int)mmc);
ret = -1;
goto fail;
}
}
memcpy(bdata + s, in_buf, cnt); //change data
memcpy(bdata + s, in_buf, cnt); /* change data */
VDEBUG("cur: bs=%d, start=%ld, cnt=%ld\n", bs, s, cnt);
if (mmc_rpmb_write(mmc, bdata, bs, 1, extract_key) != 1) {
ret = -1;
......@@ -542,8 +628,11 @@ fail:
return -1;
mmc->block_dev.hwpart = original_part;
}
if (blob != NULL)
free(blob);
if (bdata != NULL)
free(bdata);
return ret;
}
......@@ -700,64 +789,20 @@ AvbIOResult fsl_validate_vbmeta_public_key_rpmb(AvbOps* ops,
const uint8_t* public_key_metadata,
size_t public_key_metadata_length,
bool* out_is_trusted) {
kblb_hdr_t hdr;
kblb_tag_t *pubk;
uint8_t *extract_key = NULL;
struct mmc *mmc_dev;
AvbIOResult ret;
assert(ops != NULL && out_is_trusted != NULL);
*out_is_trusted = false;
if ((mmc_dev = get_mmc()) == NULL) {
ERR("err get mmc device\n");
return AVB_IO_RESULT_ERROR_IO;
}
/* read the kblb header */
if (rpmb_read(mmc_dev, (uint8_t *)&hdr, sizeof(hdr), 0) != 0) {
ERR("read RPMB error\n");
return AVB_IO_RESULT_ERROR_IO;
}
if (memcmp(hdr.magic, AVB_KBLB_MAGIC, AVB_KBLB_MAGIC_LEN) != 0) {
ERR("magic not match\n");
return AVB_IO_RESULT_ERROR_IO;
}
/* read public key */
pubk = &hdr.pubk_tag;
if (pubk->len != public_key_length){
ERR("avbkey len not match\n");
return AVB_IO_RESULT_ERROR_IO;
}
extract_key = malloc(pubk->len);
if (extract_key == NULL)
return AVB_IO_RESULT_ERROR_OOM;
if (rpmb_read(mmc_dev, extract_key, pubk->len, pubk->offset) != 0) {
ERR("read public keyblob error\n");
ret = AVB_IO_RESULT_ERROR_IO;
goto fail;
}
/* match given public key */
if (memcmp(extract_key, public_key_data, public_key_length)) {
ret = AVB_IO_RESULT_OK;
goto fail;
if (memcmp(fsl_public_key, public_key_data, public_key_length)) {
ret = AVB_IO_RESULT_ERROR_IO;
ERR("public key not match\n");
return AVB_IO_RESULT_ERROR_IO;
}
#ifdef AVB_VDEBUG
printf("\n----key dump: stored---\n");
print_buffer(0, extract_key, HEXDUMP_WIDTH, pubk->len, 0);
printf("\n----key dump: vbmeta---\n");
print_buffer(0, public_key_data, HEXDUMP_WIDTH, public_key_length, 0);
printf("--- end ---\n");
#endif
*out_is_trusted = true;
ret = AVB_IO_RESULT_OK;
fail:
if (extract_key != NULL)
free(extract_key);
return ret;
}
......@@ -818,7 +863,6 @@ AvbIOResult fsl_read_rollback_index_rpmb(AvbOps* ops, size_t rollback_index_slot
print_buffer(0, extract_idx, HEXDUMP_WIDTH, rbk->len, 0);
printf("--- end ---\n");
#endif
*out_rollback_index = *extract_idx;
DEBUGAVB("rollback_index = %" PRIu64 "\n", *out_rollback_index);
ret = AVB_IO_RESULT_OK;
......
......@@ -41,7 +41,7 @@ struct kblb_hdr {
};
typedef struct kblb_hdr kblb_hdr_t;
#ifdef TRUSTY_KEYSLOT_PACKAGE
#ifdef AVB_RPMB
#define RPMBKEY_LEN (32 + CAAM_PAD)
#define KEYPACK_MAGIC "!KS"
......
/*
* Copyright (C) 2016 Freescale Semiconductor, Inc.
* Copyright 2017 NXP
*
* SPDX-License-Identifier: GPL-2.0+
*/
#ifndef __FSL_PUBLIC_KEY_H_
#define __FSL_PUBLIC_KEY_H_
/*This public key is generated from testkey_rsa4096.pem.*/
unsigned char fsl_public_key[] = {
0x00,0x00,0x10,0x00,0x55,0xd9,0x04,0xad,
0xd8,0x04,0xaf,0xe3,0xd3,0x84,0x6c,0x7e,
0x0d,0x89,0x3d,0xc2,0x8c,0xd3,0x12,0x55,
0xe9,0x62,0xc9,0xf1,0x0f,0x5e,0xcc,0x16,
0x72,0xab,0x44,0x7c,0x2c,0x65,0x4a,0x94,
0xb5,0x16,0x2b,0x00,0xbb,0x06,0xef,0x13,
0x07,0x53,0x4c,0xf9,0x64,0xb9,0x28,0x7a,
0x1b,0x84,0x98,0x88,0xd8,0x67,0xa4,0x23,
0xf9,0xa7,0x4b,0xdc,0x4a,0x0f,0xf7,0x3a,
0x18,0xae,0x54,0xa8,0x15,0xfe,0xb0,0xad,
0xac,0x35,0xda,0x3b,0xad,0x27,0xbc,0xaf,
0xe8,0xd3,0x2f,0x37,0x34,0xd6,0x51,0x2b,
0x6c,0x5a,0x27,0xd7,0x96,0x06,0xaf,0x6b,
0xb8,0x80,0xca,0xfa,0x30,0xb4,0xb1,0x85,
0xb3,0x4d,0xaa,0xaa,0xc3,0x16,0x34,0x1a,
0xb8,0xe7,0xc7,0xfa,0xf9,0x09,0x77,0xab,
0x97,0x93,0xeb,0x44,0xae,0xcf,0x20,0xbc,
0xf0,0x80,0x11,0xdb,0x23,0x0c,0x47,0x71,
0xb9,0x6d,0xd6,0x7b,0x60,0x47,0x87,0x16,
0x56,0x93,0xb7,0xc2,0x2a,0x9a,0xb0,0x4c,
0x01,0x0c,0x30,0xd8,0x93,0x87,0xf0,0xed,
0x6e,0x8b,0xbe,0x30,0x5b,0xf6,0xa6,0xaf,
0xdd,0x80,0x7c,0x45,0x5e,0x8f,0x91,0x93,
0x5e,0x44,0xfe,0xb8,0x82,0x07,0xee,0x79,
0xca,0xbf,0x31,0x73,0x62,0x58,0xe3,0xcd,
0xc4,0xbc,0xc2,0x11,0x1d,0xa1,0x4a,0xbf,
0xfe,0x27,0x7d,0xa1,0xf6,0x35,0xa3,0x5e,
0xca,0xdc,0x57,0x2f,0x3e,0xf0,0xc9,0x5d,
0x86,0x6a,0xf8,0xaf,0x66,0xa7,0xed,0xcd,
0xb8,0xed,0xa1,0x5f,0xba,0x9b,0x85,0x1a,
0xd5,0x09,0xae,0x94,0x4e,0x3b,0xcf,0xcb,
0x5c,0xc9,0x79,0x80,0xf7,0xcc,0xa6,0x4a,
0xa8,0x6a,0xd8,0xd3,0x31,0x11,0xf9,0xf6,
0x02,0x63,0x2a,0x1a,0x2d,0xd1,0x1a,0x66,
0x1b,0x16,0x41,0xbd,0xbd,0xf7,0x4d,0xc0,
0x4a,0xe5,0x27,0x49,0x5f,0x7f,0x58,0xe3,
0x27,0x2d,0xe5,0xc9,0x66,0x0e,0x52,0x38,
0x16,0x38,0xfb,0x16,0xeb,0x53,0x3f,0xe6,
0xfd,0xe9,0xa2,0x5e,0x25,0x59,0xd8,0x79,
0x45,0xff,0x03,0x4c,0x26,0xa2,0x00,0x5a,
0x8e,0xc2,0x51,0xa1,0x15,0xf9,0x7b,0xf4,
0x5c,0x81,0x9b,0x18,0x47,0x35,0xd8,0x2d,
0x05,0xe9,0xad,0x0f,0x35,0x74,0x15,0xa3,
0x8e,0x8b,0xcc,0x27,0xda,0x7c,0x5d,0xe4,
0xfa,0x04,0xd3,0x05,0x0b,0xba,0x3a,0xb2,
0x49,0x45,0x2f,0x47,0xc7,0x0d,0x41,0x3f,
0x97,0x80,0x4d,0x3f,0xc1,0xb5,0xbb,0x70,
0x5f,0xa7,0x37,0xaf,0x48,0x22,0x12,0x45,
0x2e,0xf5,0x0f,0x87,0x92,0xe2,0x84,0x01,
0xf9,0x12,0x0f,0x14,0x15,0x24,0xce,0x89,
0x99,0xee,0xb9,0xc4,0x17,0x70,0x70,0x15,
0xea,0xbe,0xc6,0x6c,0x1f,0x62,0xb3,0xf4,
0x2d,0x16,0x87,0xfb,0x56,0x1e,0x45,0xab,
0xae,0x32,0xe4,0x5e,0x91,0xed,0x53,0x66,
0x5e,0xbd,0xed,0xad,0xe6,0x12,0x39,0x0d,
0x83,0xc9,0xe8,0x6b,0x6c,0x2d,0xa5,0xee,
0xc4,0x5a,0x66,0xae,0x8c,0x97,0xd7,0x0d,
0x6c,0x49,0xc7,0xf5,0xc4,0x92,0x31,0x8b,
0x09,0xee,0x33,0xda,0xa9,0x37,0xb6,0x49,
0x18,0xf8,0x0e,0x60,0x45,0xc8,0x33,0x91,
0xef,0x20,0x57,0x10,0xbe,0x78,0x2d,0x83,
0x26,0xd6,0xca,0x61,0xf9,0x2f,0xe0,0xbf,
0x05,0x30,0x52,0x5a,0x12,0x1c,0x00,0xa7,
0x5d,0xcc,0x7c,0x2e,0xc5,0x95,0x8b,0xa3,
0x3b,0xf0,0x43,0x2e,0x5e,0xdd,0x00,0xdb,
0x0d,0xb3,0x37,0x99,0xa9,0xcd,0x9c,0xb7,
0x43,0xf7,0x35,0x44,0x21,0xc2,0x82,0x71,
0xab,0x8d,0xaa,0xb4,0x41,0x11,0xec,0x1e,
0x8d,0xfc,0x14,0x82,0x92,0x4e,0x83,0x6a,
0x0a,0x6b,0x35,0x5e,0x5d,0xe9,0x5c,0xcc,
0x8c,0xde,0x39,0xd1,0x4a,0x5b,0x5f,0x63,
0xa9,0x64,0xe0,0x0a,0xcb,0x0b,0xb8,0x5a,
0x7c,0xc3,0x0b,0xe6,0xbe,0xfe,0x8b,0x0f,
0x7d,0x34,0x8e,0x02,0x66,0x74,0x01,0x6c,
0xca,0x76,0xac,0x7c,0x67,0x08,0x2f,0x3f,
0x1a,0xa6,0x2c,0x60,0xb3,0xff,0xda,0x8d,
0xb8,0x12,0x0c,0x00,0x7f,0xcc,0x50,0xa1,
0x5c,0x64,0xa1,0xe2,0x5f,0x32,0x65,0xc9,
0x9c,0xbe,0xd6,0x0a,0x13,0x87,0x3c,0x2a,
0x45,0x47,0x0c,0xca,0x42,0x82,0xfa,0x89,
0x65,0xe7,0x89,0xb4,0x8f,0xf7,0x1e,0xe6,
0x23,0xa5,0xd0,0x59,0x37,0x79,0x92,0xd7,
0xce,0x3d,0xfd,0xe3,0xa1,0x0b,0xcf,0x6c,
0x85,0xa0,0x65,0xf3,0x5c,0xc6,0x4a,0x63,
0x5f,0x6e,0x3a,0x3a,0x2a,0x8b,0x6a,0xb6,
0x2f,0xbb,0xf8,0xb2,0x4b,0x62,0xbc,0x1a,
0x91,0x25,0x66,0xe3,0x69,0xca,0x60,0x49,
0x0b,0xf6,0x8a,0xbe,0x3e,0x76,0x53,0xc2,
0x7a,0xa8,0x04,0x17,0x75,0xf1,0xf3,0x03,
0x62,0x1b,0x85,0xb2,0xb0,0xef,0x80,0x15,
0xb6,0xd4,0x4e,0xdf,0x71,0xac,0xdb,0x2a,
0x04,0xd4,0xb4,0x21,0xba,0x65,0x56,0x57,
0xe8,0xfa,0x84,0xa2,0x7d,0x13,0x0e,0xaf,
0xd7,0x9a,0x58,0x2a,0xa3,0x81,0x84,0x8d,
0x09,0xa0,0x6a,0xc1,0xbb,0xd9,0xf5,0x86,
0xac,0xbd,0x75,0x61,0x09,0xe6,0x8c,0x3d,
0x77,0xb2,0xed,0x30,0x20,0xe4,0x00,0x1d,
0x97,0xe8,0xbf,0xc7,0x00,0x1b,0x21,0xb1,
0x16,0xe7,0x41,0x67,0x2e,0xec,0x38,0xbc,
0xe5,0x1b,0xb4,0x06,0x23,0x31,0x71,0x1c,
0x49,0xcd,0x76,0x4a,0x76,0x36,0x8d,0xa3,
0x89,0x8b,0x4a,0x7a,0xf4,0x87,0xc8,0x15,
0x0f,0x37,0x39,0xf6,0x6d,0x80,0x19,0xef,
0x5c,0xa8,0x66,0xce,0x1b,0x16,0x79,0x21,
0xdf,0xd7,0x31,0x30,0xc4,0x21,0xdd,0x34,
0x5b,0xd2,0x1a,0x2b,0x3e,0x5d,0xf7,0xea,
0xca,0x05,0x8e,0xb7,0xcb,0x49,0x2e,0xa0,
0xe3,0xf4,0xa7,0x48,0x19,0x10,0x9c,0x04,
0xa7,0xf4,0x28,0x74,0xc8,0x6f,0x63,0x20,
0x2b,0x46,0x24,0x26,0x19,0x1d,0xd1,0x2c,
0x31,0x6d,0x5a,0x29,0xa2,0x06,0xa6,0xb2,
0x41,0xcc,0x0a,0x27,0x96,0x09,0x96,0xac,
0x47,0x65,0x78,0x68,0x51,0x98,0xd6,0xd8,
0xa6,0x2d,0xa0,0xcf,0xec,0xe2,0x74,0xf2,
0x82,0xe3,0x97,0xd9,0x7e,0xd4,0xf8,0x0b,
0x70,0x43,0x3d,0xb1,0x7b,0x97,0x80,0xd6,
0xcb,0xd7,0x19,0xbc,0x63,0x0b,0xfd,0x4d,
0x88,0xfe,0x67,0xac,0xb8,0xcc,0x50,0xb7,
0x68,0xb3,0x5b,0xd6,0x1e,0x25,0xfc,0x5f,
0x3c,0x8d,0xb1,0x33,0x7c,0xb3,0x49,0x01,
0x3f,0x71,0x55,0x0e,0x51,0xba,0x61,0x26,
0xfa,0xea,0xe5,0xb5,0xe8,0xaa,0xcf,0xcd,
0x96,0x9f,0xd6,0xc1,0x5f,0x53,0x91,0xad,
0x05,0xde,0x20,0xe7,0x51,0xda,0x5b,0x95,
0x67,0xed,0xf4,0xee,0x42,0x65,0x70,0x13,
0x0b,0x70,0x14,0x1c,0xc9,0xe0,0x19,0xca,
0x5f,0xf5,0x1d,0x70,0x4b,0x6c,0x06,0x74,
0xec,0xb5,0x2e,0x77,0xe1,0x74,0xa1,0xa3,
0x99,0xa0,0x85,0x9e,0xf1,0xac,0xd8,0x7e
};
#endif
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment