日韩欧美自拍在线观看-欧美精品在线看片一区二区-高清性视频一区二区播放-欧美日韩女优制服另类-国产精品久久久久久av蜜臀-成人在线黄色av网站-肥臀熟妇一区二区三区-亚洲视频在线播放老色-在线成人激情自拍视频

基于mbedTLS實(shí)現(xiàn)的嵌入式固件知識(shí)產(chǎn)權(quán)保護(hù)方案

出處:潤(rùn)欣科技 發(fā)布于:2018-06-29 15:41:55

  嵌入式應(yīng)用的領(lǐng)域越來(lái)越廣泛,功能需求也越來(lái)越復(fù)雜,有些嵌入式產(chǎn)品要求在產(chǎn)品出廠后,使用過(guò)程中保留有固件升級(jí)的功能,以保證用戶可以使用的功能和及時(shí)修正產(chǎn)品bug。支持固件升級(jí)就意味著在軟件上留有“后門”(Bootloader與外界的交互),如果這個(gè)“后門”保護(hù)不當(dāng)會(huì)造成固件代碼泄露,針對(duì)這一安全隱患,本文討論的話題就是如何提高嵌入式Bootloader程序的安全性,有效防止黑客的hacking和cloning,借助的工具是arm的mbedTLS加密算法庫(kù)。
  我們先來(lái)了解一下什么是mbedTLS。MbedTLS前身是開源加密算法庫(kù)PolarSLL,現(xiàn)已被arm公司收購(gòu)并由arm技術(shù)團(tuán)隊(duì)進(jìn)行維護(hù)更新,是對(duì)TLS和SSL協(xié)議實(shí)現(xiàn)的算法庫(kù)。mbedTLS的目標(biāo)是:易于理解,使用,集成和擴(kuò)展。mbedTLS代碼用C編程語(yǔ)言編寫,實(shí)現(xiàn)SSL模塊和各種加密算法,并提供各種加密算法的自測(cè)試代碼。和其他TLS/SSL算法庫(kù)實(shí)現(xiàn)不同,mbedTLS主要是面向小型嵌入式設(shè)備,代碼緊湊,完整的TLS堆棧需要60KB的程序空間和64KB的RAM空間,而且執(zhí)行效率高,可以說(shuō)是行業(yè)內(nèi)巧的SSL加密算法庫(kù)。另外,mbedTLS是高度模塊化的設(shè)計(jì):每個(gè)組件,如加密函數(shù),可以獨(dú)立于框架的其余部分使用。mbedTLS完全是由C語(yǔ)言編寫的,沒(méi)有外部依賴,因此,mbedTLS是應(yīng)用于嵌入式系統(tǒng)理想的TLS加密算法庫(kù)。更重要的一點(diǎn)是,mbedTSL是完全OpenSource的,支持Apache 2.0 license 或者GPL 2.0 license雙重許可,可以自由應(yīng)用于商業(yè)項(xiàng)目中。
  上海潤(rùn)欣科技正在開發(fā)一個(gè)用于智能門鎖等領(lǐng)域的指紋模塊項(xiàng)目,用到的主控芯片是基于ARM Cortex-M4內(nèi)核的MCU,但是這個(gè)MCU沒(méi)有代碼讀出保護(hù)功能,為了避免產(chǎn)品被非法克隆,必須引入一種保護(hù)機(jī)制來(lái)提高產(chǎn)品的安全性。我們使用mbedTSL算法庫(kù)中的RSASSA-PSS數(shù)字簽名算法對(duì)MCU芯片中的UID和指紋傳感器UID來(lái)進(jìn)行簽名(Sign)和驗(yàn)證(Verify),保證每個(gè)被簽名產(chǎn)品的性(不可復(fù)制)和合法性。


  基于mbedTLS實(shí)現(xiàn)的嵌入式固件知識(shí)產(chǎn)權(quán)保護(hù)方案
  原文簽名(Sign)以及簽名驗(yàn)證(Verify)
  一、具體的實(shí)施步驟:
  第1步:將mbedTLS生成的密鑰對(duì)中的私鑰存放與本地服務(wù)器,并禁止外部訪問(wèn),以保證私鑰的安全性;
  第2步:利用MCU的UID和指紋傳感器的UID通過(guò)上述本地服務(wù)器上的私鑰及簽名生成工具生成數(shù)字簽名sig文件;
  基于mbedTLS實(shí)現(xiàn)的嵌入式固件知識(shí)產(chǎn)權(quán)保護(hù)方案
  第3步:將上述第二步生成的sig簽名文件保存到Bootloader特定區(qū)域;
  第4步:將mbedTLS生成的密鑰對(duì)中的公鑰保存到APP固件中;
  第5步:Bootloader更新APP固件時(shí),利用APP中的公鑰對(duì)Bootloader中的簽名文件sig進(jìn)行校驗(yàn)(Verify),校驗(yàn)通過(guò),說(shuō)明Bootloader和APP固件均為原廠合法固件,否則Bootloader拒絕引導(dǎo)執(zhí)行APP固件,達(dá)到保護(hù)產(chǎn)品軟硬版權(quán)的目的。
 

  二、使用到的mbedTLS資源和API函數(shù)
  1、mbedTSL代碼包目錄下使用VS2010或以上版本生成RSA密鑰對(duì)生成工具:rsa_genkey.exe,用來(lái)生成上述步驟中步中的密鑰對(duì);
  2、mbedTSL代碼包目錄下使用VS2010或以上版本生成RSASSA簽名生成工具rsa_sign_pss.exe,以用來(lái)生成上述步驟中第二步中的sig文件;
  3、mbedTSL代碼包目錄下使用VS2010或以上版本生成RSASSA簽名驗(yàn)證工具rsa_verify_pss.exe,已確保代碼的正確性;
  4、MCU代碼中使用到的mbedTLS API函數(shù):
  /*
  * Initialize an RSA context 初始化RSA算法內(nèi)容
  */
  void mbedtls_rsa_init( mbedtls_rsa_context *ctx,
  int padding,
  int hash_id )
  {
  memset( ctx, 0, sizeof( mbedtls_rsa_context ) );
  mbedtls_rsa_set_padding( ctx, padding, hash_id );
  #if defined(MBEDTLS_THREADING_C)
  mbedtls_mutex_init( &ctx->mutex );
  #endif
  }
  #if defined(MBEDTLS_PKCS1_V21)
  /*
  * Implementation of the PKCS#1 v2.1 RSASSA-PSS-SIGN function
  * RSASSA-PSS簽名算法實(shí)現(xiàn)函數(shù)
  */
  int mbedtls_rsa_rsassa_pss_sign( mbedtls_rsa_context *ctx,
  int (*f_rng)(void *, unsigned char *, size_t),
  void *p_rng,
  int mode,
  mbedtls_md_type_t md_alg,
  unsigned int hashlen,
  const unsigned char *hash,
  unsigned char *sig )
  {
  size_t olen;
  unsigned char *p = sig;
  unsigned char salt[MBEDTLS_MD_MAX_SIZE];
  unsigned int slen, hlen, offset = 0;
  int ret;
  size_t msb;
  const mbedtls_md_info_t *md_info;
  mbedtls_md_context_t md_ctx;
  if( mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V21 )
  return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  if( f_rng == NULL )
  return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  olen = ctx->len;
  if( md_alg != MBEDTLS_MD_NONE )
  {
  /* Gather length of hash to sign */
  md_info = mbedtls_md_info_from_type( md_alg );
  if( md_info == NULL )
  return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  hashlen = mbedtls_md_get_size( md_info );
  }
  md_info = mbedtls_md_info_from_type( (mbedtls_md_type_t) ctx->hash_id );
  if( md_info == NULL )
  return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  hlen = mbedtls_md_get_size( md_info );
  slen = hlen;
  if( olen < hlen + slen + 2 )
  return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  memset( sig, 0, olen );
  /* Generate salt of length slen */
  if( ( ret = f_rng( p_rng, salt, slen ) ) != 0 )
  return( MBEDTLS_ERR_RSA_RNG_FAILED + ret );
  /* Note: EMSA-PSS encoding is over the length of N - 1 bits */
  msb = mbedtls_mpi_bitlen( &ctx->N ) - 1;
  p += olen - hlen * 2 - 2;
  *p++ = 0x01;
  memcpy( p, salt, slen );
  p += slen;
  mbedtls_md_init( &md_ctx );
  if( ( ret = mbedtls_md_setup( &md_ctx, md_info, 0 ) ) != 0 )
  goto exit;
  /* Generate H = Hash( M' ) */
  if( ( ret = mbedtls_md_starts( &md_ctx ) ) != 0 )
  goto exit;
  if( ( ret = mbedtls_md_update( &md_ctx, p, 8 ) ) != 0 )
  goto exit;
  if( ( ret = mbedtls_md_update( &md_ctx, hash, hashlen ) ) != 0 )
  goto exit;
  if( ( ret = mbedtls_md_update( &md_ctx, salt, slen ) ) != 0 )
  goto exit;
  if( ( ret = mbedtls_md_finish( &md_ctx, p ) ) != 0 )
  goto exit;
  /* Compensate for boundary condition when applying mask */
  if( msb % 8 == 0 )
  offset = 1;
  /* maskedDB: Apply dbMask to DB */
  if( ( ret = mgf_mask( sig + offset, olen - hlen - 1 - offset, p, hlen,
  &md_ctx ) ) != 0 )
  goto exit;
  msb = mbedtls_mpi_bitlen( &ctx->N ) - 1;
  sig[0] &= 0xFF >> ( olen * 8 - msb );
  p += hlen;
  *p++ = 0xBC;
  mbedtls_zeroize( salt, sizeof( salt ) );
  exit:
  mbedtls_md_free( &md_ctx );
  if( ret != 0 )
  return( ret );
  return( ( mode == MBEDTLS_RSA_PUBLIC )
  ? mbedtls_rsa_public(  ctx, sig, sig )
  : mbedtls_rsa_private( ctx, f_rng, p_rng, sig, sig ) );
  }
  #endif /* MBEDTLS_PKCS1_V21 */
  #if defined(MBEDTLS_PKCS1_V21)
  /*
  * Implementation of the PKCS#1 v2.1 RSASSA-PSS-VERIFY function
  * RSASSA-PSS簽名算法校驗(yàn)函數(shù)
  */
  int mbedtls_rsa_rsassa_pss_verify_ext( mbedtls_rsa_context *ctx,
  int (*f_rng)(void *, unsigned char *, size_t),
  void *p_rng,
  int mode,
  mbedtls_md_type_t md_alg,
  unsigned int hashlen,
  const unsigned char *hash,
  mbedtls_md_type_t mgf1_hash_id,
  int expected_salt_len,
  const unsigned char *sig )
  {
  int ret;
  size_t siglen;
  unsigned char *p;
  unsigned char *hash_start;
  unsigned char result[MBEDTLS_MD_MAX_SIZE];
  unsigned char zeros[8];
  unsigned int hlen;
  size_t observed_salt_len, msb;
  const mbedtls_md_info_t *md_info;
  mbedtls_md_context_t md_ctx;
  unsigned char buf[MBEDTLS_MPI_MAX_SIZE];
  if( mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V21 )
  return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  siglen = ctx->len;
  if( siglen < 16 || siglen > sizeof( buf ) )
  return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  ret = ( mode == MBEDTLS_RSA_PUBLIC )
  ? mbedtls_rsa_public(  ctx, sig, buf )
  : mbedtls_rsa_private( ctx, f_rng, p_rng, sig, buf );
  if( ret != 0 )
  return( ret );
  p = buf;
  if( buf[siglen - 1] != 0xBC )
  return( MBEDTLS_ERR_RSA_INVALID_PADDING );
  if( md_alg != MBEDTLS_MD_NONE )
  {
  /* Gather length of hash to sign */
  md_info = mbedtls_md_info_from_type( md_alg );
  if( md_info == NULL )
  return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  hashlen = mbedtls_md_get_size( md_info );
  }
  md_info = mbedtls_md_info_from_type( mgf1_hash_id );
  if( md_info == NULL )
  return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  hlen = mbedtls_md_get_size( md_info );
  memset( zeros, 0, 8 );
  /*
  * Note: EMSA-PSS verification is over the length of N - 1 bits
  */
  msb = mbedtls_mpi_bitlen( &ctx->N ) - 1;
  if( buf[0] >> ( 8 - siglen * 8 + msb ) )
  return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  /* Compensate for boundary condition when applying mask */
  if( msb % 8 == 0 )
  {
  p++;
  siglen -= 1;
  }
  if( siglen < hlen + 2 )
  return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  hash_start = p + siglen - hlen - 1;
  mbedtls_md_init( &md_ctx );
  if( ( ret = mbedtls_md_setup( &md_ctx, md_info, 0 ) ) != 0 )
  goto exit;
  ret = mgf_mask( p, siglen - hlen - 1, hash_start, hlen, &md_ctx );
  if( ret != 0 )
  goto exit;
  buf[0] &= 0xFF >> ( siglen * 8 - msb );
  while( p < hash_start - 1 && *p == 0 )
  p++;
  if( *p++ != 0x01 )
  {
  ret = MBEDTLS_ERR_RSA_INVALID_PADDING;
  goto exit;
  }
  observed_salt_len = hash_start - p;
  if( expected_salt_len != MBEDTLS_RSA_SALT_LEN_ANY &&
  observed_salt_len != (size_t) expected_salt_len )
  {
  ret = MBEDTLS_ERR_RSA_INVALID_PADDING;
  goto exit;
  }
  /*
  * Generate H = Hash( M' )
  */
  ret = mbedtls_md_starts( &md_ctx );
  if ( ret != 0 )
  goto exit;
  ret = mbedtls_md_update( &md_ctx, zeros, 8 );
  if ( ret != 0 )
  goto exit;
  ret = mbedtls_md_update( &md_ctx, hash, hashlen );
  if ( ret != 0 )
  goto exit;
  ret = mbedtls_md_update( &md_ctx, p, observed_salt_len );
  if ( ret != 0 )
  goto exit;
  ret = mbedtls_md_finish( &md_ctx, result );
  if ( ret != 0 )
  goto exit;
  if( memcmp( hash_start, result, hlen ) != 0 )
  {
  ret = MBEDTLS_ERR_RSA_VERIFY_FAILED;
  goto exit;
  }
  exit:
  mbedtls_md_free( &md_ctx );
  return( ret );
  }
  /*
  * Simplified PKCS#1 v2.1 RSASSA-PSS-VERIFY function
  */
  int mbedtls_rsa_rsassa_pss_verify( mbedtls_rsa_context *ctx,
  int (*f_rng)(void *, unsigned char *, size_t),
  void *p_rng,
  int mode,
  mbedtls_md_type_t md_alg,
  unsigned int hashlen,
  const unsigned char *hash,
  const unsigned char *sig )
  {
  mbedtls_md_type_t mgf1_hash_id = ( ctx->hash_id != MBEDTLS_MD_NONE )
  ? (mbedtls_md_type_t) ctx->hash_id
  : md_alg;
  return( mbedtls_rsa_rsassa_pss_verify_ext( ctx, f_rng, p_rng, mode,
  md_alg, hashlen, hash,
  mgf1_hash_id, MBEDTLS_RSA_SALT_LEN_ANY,
  sig ) );
  }
  #endif /* MBEDTLS_PKCS1_V21 */

關(guān)鍵詞:基于mbedTLS實(shí)現(xiàn)的嵌入式固件知識(shí)產(chǎn)權(quán)保護(hù)方案mbedTLS,嵌入式

版權(quán)與免責(zé)聲明

凡本網(wǎng)注明“出處:維庫(kù)電子市場(chǎng)網(wǎng)”的所有作品,版權(quán)均屬于維庫(kù)電子市場(chǎng)網(wǎng),轉(zhuǎn)載請(qǐng)必須注明維庫(kù)電子市場(chǎng)網(wǎng),http://www.hbjingang.com,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。

本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個(gè)人從本網(wǎng)轉(zhuǎn)載時(shí),必須保留本網(wǎng)注明的作品出處,并自負(fù)版權(quán)等法律責(zé)任。

如涉及作品內(nèi)容、版權(quán)等問(wèn)題,請(qǐng)?jiān)谧髌钒l(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。

廣告
OEM清單文件: OEM清單文件
*公司名:
*聯(lián)系人:
*手機(jī)號(hào)碼:
QQ:
有效期:

掃碼下載APP,
一鍵連接廣大的電子世界。

在線人工客服

買家服務(wù):
賣家服務(wù):
技術(shù)客服:

0571-85317607

網(wǎng)站技術(shù)支持

13606545031

客服在線時(shí)間周一至周五
9:00-17:30

關(guān)注官方微信號(hào),
第一時(shí)間獲取資訊。

建議反饋

聯(lián)系人:

聯(lián)系方式:

按住滑塊,拖拽到最右邊
>>
感謝您向阿庫(kù)提出的寶貴意見,您的參與是維庫(kù)提升服務(wù)的動(dòng)力!意見一經(jīng)采納,將有感恩紅包奉上哦!