iBoot/drivers/samsung/pke/pke.c

88 lines
2.5 KiB
C

/*
* Copyright (C) 2008 Apple Inc. All rights reserved.
*
* This document is the property of Apple Inc.
* It is considered confidential and proprietary.
*
* This document may not be reproduced or transmitted in any form,
* in whole or in part, without the express written permission of
* Apple Inc.
*/
#include <drivers/pke.h>
#include <platform/clocks.h>
#include <platform/power.h>
#include <platform/soc/hwclocks.h>
#include <platform/soc/hwregbase.h>
#include <string.h>
#include <sys.h>
#include "AppleS5L8900XPKE-hardware.h"
#define Pke_Shim_DEBUG 0
#if Pke_Shim_DEBUG
static void debug_data(uint8_t *data, size_t length)
{
uint32_t i=0;
printf("data %p,%d\n" , data, length);
for (i = 0; i < length; i++) {
if( !(i%256) )
printf("Seg : %p \n", data);
printf("%02X, ", *(data + i));
if ((i % 16) == 15)
printf("\n");
}
printf("\n");
}
#define debug(fmt, args...) printf("pke_new::%s: " fmt "\n", __FUNCTION__ , ##args)
#else
#define debug(fmt, args...)
#define debug_data(data, length)
#endif
//PKE hardware memory map.
static volatile struct pke_regs *registers = (struct pke_regs *)PKE_BASE_ADDR;
static volatile uint8_t *memory = (uint8_t*)(PKE_BASE_ADDR + 0x800);
extern bool rsa_cal_exp(void *dst, uint32_t *len, uint32_t options,
uint8_t *rsquare, uint32_t *rsquare_length,
uint8_t * const base, uint32_t base_length,
uint8_t * const expn, uint32_t expn_length,
uint8_t * const modulus, uint32_t modulus_length,
volatile struct pke_regs *registers, volatile uint8_t *memory);
bool pke_do_exp(uint8_t *dst, size_t *len, size_t key_length,
uint8_t * const base, size_t base_length,
uint8_t * const expn, size_t expn_length,
uint8_t * const mods, size_t mods_length)
{
bool ret = false;
uint32_t rsquare[64]; //word aligned 256byte buffer.
uint32_t rlen = sizeof(rsquare);
clock_gate(CLK_PKE, true);
platform_power_set_gate(PWRBIT_USB, true);
#if Pke_Shim_DEBUG
utime_t st, et;
st = system_time();
#endif
ret = rsa_cal_exp(dst, (uint32_t*)len, 0,
(uint8_t*)rsquare, &rlen,
base, (uint32_t)base_length,
expn, (uint32_t)expn_length,
mods, (uint32_t)mods_length,
registers, memory);
#if Pke_Shim_DEBUG
et = system_time();
debug("rsa_cal_exp took %llu micros for keylen: %lu", (et-st), key_length);
//debug("The result:");
//debug_data(dst, *len);
#endif
clock_gate(CLK_PKE, false);
return ret;
}