/*************************************************************************** * Copyright (c) 2003-2010, Broadcom Corporation * All Rights Reserved * Confidential Property of Broadcom Corporation * * THIS SOFTWARE MAY ONLY BE USED SUBJECT TO AN EXECUTED SOFTWARE LICENSE * AGREEMENT BETWEEN THE USER AND BROADCOM. YOU HAVE NO RIGHT TO USE OR * EXPLOIT THIS MATERIAL EXCEPT SUBJECT TO THE TERMS OF SUCH AN AGREEMENT. * * $brcm_Workfile: $ * $brcm_Revision: $ * $brcm_Date: $ * * Module Description: Digital signature processing routines * * Revision History: * * $brcm_Log: $ * * ***************************************************************************/ #include "sha1/sha1o.h" /* forward declarations */ void SHA1Compute_ram( uint8 * image_ptr, int len, uint32 * digest ); int rsa_decrypt (void *in, void *pubkey, unsigned long *decrypted_digest); #if defined(RSA_BITS) #define DIGEST_SIZE (RSA_BITS/8) #define SHA1_OFFSET ((RSA_BITS/32) - 5) #else #define DIGEST_SIZE 0x80 #define SHA1_OFFSET 27 #endif int signature_check(unsigned long in, unsigned long size, unsigned long signature, unsigned long public_key) { unsigned long sha1_output[5]; /* 20 bytes */ unsigned long decrypted_digest[DIGEST_SIZE/sizeof(unsigned long)]; int i; SHA1Compute_ram((unsigned char *)in, size*8, sha1_output); /* RSA decrypt the signature */ if (rsa_decrypt((unsigned long*)(signature), (unsigned long*)public_key, decrypted_digest)) { /* Check SHA1 digest */ for (i=0; (i<5); i++) if (decrypted_digest[SHA1_OFFSET+i] != sha1_output[i]) return 1; return 0; } return 1; }