⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 asn1.c

📁 IBM的Linux上的PKCS#11实现
💻 C
📖 第 1 页 / 共 4 页
字号:
   }   if (length_octets == 2) {      len = ber_int[2];      len = len << 8;      len |= ber_int[3];      *data      = &ber_int[4];      *data_len  = len;      *field_len = 1 + (1 + 2) + len;      return CKR_OK;   }   if (length_octets == 3) {      len = ber_int[2];      len = len << 8;      len |= ber_int[3];      len = len << 8;      len |= ber_int[4];      *data      = &ber_int[5];      *data_len  = len;      *field_len = 1 + (1 + 3) + len;      return CKR_OK;   }   // > 3 length octets implies a length > 16MB which isn't possible for   // the coprocessor   //   st_err_log(4, __FILE__, __LINE__, __FUNCTION__);   return CKR_FUNCTION_FAILED;}////CK_RVber_encode_OCTET_STRING( CK_BBOOL    length_only,                         CK_BYTE  ** str,                         CK_ULONG  * str_len,                         CK_BYTE   * data,                         CK_ULONG    data_len ){   CK_BYTE   *buf = NULL;   CK_ULONG   len;   // I only support Primitive encoding for OCTET STRINGS   //   // if data_len < 128 use short-form length id   // if data_len < 256 use long-form length id with 1-byte length field   // if data_len < 65536 use long-form length id with 2-byte length field   //   if (data_len < 128)      len = 1 + 1 + data_len;   else if (data_len < 256)      len = 1 + (1 + 1) + data_len;   else if (data_len < (1 << 16))      len = 1 + (1 + 2) + data_len;   else if (data_len < (1 << 24))      len = 1 + (1 + 3) + data_len;   else{      st_err_log(4, __FILE__, __LINE__, __FUNCTION__);      return CKR_FUNCTION_FAILED;   }   if (length_only == TRUE) {      *str_len = len;      return CKR_OK;   }   buf = (CK_BYTE *)malloc( len );   if (!buf){      st_err_log(1, __FILE__, __LINE__);      return CKR_HOST_MEMORY;   }   if (data_len < 128) {      buf[0] = 0x04;       // primitive, OCTET STRING      buf[1] = data_len;      memcpy( &buf[2], data, data_len );      *str_len = len;      *str = buf;      return CKR_OK;   }   if (data_len < 256) {      buf[0] = 0x04;       // primitive, OCTET STRING      buf[1] = 0x81;       // length header -- 1 length octets      buf[2] = data_len;      memcpy( &buf[3], data, data_len );      *str_len = len;      *str = buf;      return CKR_OK;   }   if (data_len < (1 << 16)) {      buf[0] = 0x04;       // primitive, OCTET STRING      buf[1] = 0x82;       // length header -- 2 length octets      buf[2] = (data_len >> 8) & 0xFF;      buf[3] = (data_len     ) & 0xFF;      memcpy( &buf[4], data, data_len );      *str_len = len;      *str = buf;      return CKR_OK;   }   if (data_len < (1 << 24)) {      buf[0] = 0x04;       // primitive, OCTET STRING      buf[1] = 0x83;       // length header -- 3 length octets      buf[2] = (data_len >> 16) & 0xFF;      buf[3] = (data_len >>  8) & 0xFF;      buf[4] = (data_len      ) & 0xFF;      memcpy( &buf[5], data, data_len );      *str_len = len;      *str = buf;      return CKR_OK;   }   // we should never reach this   //   free( buf );   st_err_log(4, __FILE__, __LINE__, __FUNCTION__);   return CKR_FUNCTION_FAILED;}////CK_RVber_decode_OCTET_STRING( CK_BYTE  * str,                         CK_BYTE ** data,                         CK_ULONG * data_len,                         CK_ULONG * field_len ){   CK_ULONG  len, length_octets;   // I only support decoding primitive OCTET STRINGS   //   if (!str){      st_err_log(4, __FILE__, __LINE__, __FUNCTION__);      return CKR_FUNCTION_FAILED;   }   if (str[0] != 0x04){      st_err_log(4, __FILE__, __LINE__, __FUNCTION__);      return CKR_FUNCTION_FAILED;   }   // short form lengths are easy   //   if ((str[1] & 0x80) == 0) {      len = str[1] & 0x7F;      *data = &str[2];      *data_len  = len;      *field_len = 1 + (1) + len;      return CKR_OK;   }   length_octets = str[1] & 0x7F;   if (length_octets == 1) {      len = str[2];      *data = &str[3];      *data_len  = len;      *field_len = 1 + (1 + 1) + len;      return CKR_OK;   }   if (length_octets == 2) {      len = str[2];      len = len << 8;      len |= str[3];      *data = &str[4];      *data_len  = len;      *field_len = 1 + (1 + 2) + len;      return CKR_OK;   }   if (length_octets == 3) {      len = str[2];      len = len << 8;      len |= str[3];      len = len << 8;      len |= str[4];      *data = &str[5];      *data_len  = len;      *field_len = 1 + (1 + 3) + len;      return CKR_OK;   }   // > 3 length octets implies a length > 16MB   //   st_err_log(4, __FILE__, __LINE__, __FUNCTION__);   return CKR_FUNCTION_FAILED;}////CK_RVber_encode_SEQUENCE( CK_BBOOL    length_only,                     CK_BYTE  ** seq,                     CK_ULONG  * seq_len,                     CK_BYTE   * data,                     CK_ULONG    data_len ){   CK_BYTE   *buf = NULL;   CK_ULONG   len;   // if data_len < 127 use short-form length id   // if data_len < 65536 use long-form length id with 2-byte length field   //   if (data_len < 128)      len = 1 + 1 + data_len;   else if (data_len < 256)      len = 1 + (1 + 1) + data_len;   else if (data_len < (1 << 16))      len = 1 + (1 + 2) + data_len;   else if (data_len < (1 << 24))      len = 1 + (1 + 3) + data_len;   else{      st_err_log(4, __FILE__, __LINE__, __FUNCTION__);      return CKR_FUNCTION_FAILED;   }   if (length_only == TRUE) {      *seq_len = len;      return CKR_OK;   }   buf = (CK_BYTE *)malloc( len );   if (!buf){      st_err_log(1, __FILE__, __LINE__);      return CKR_HOST_MEMORY;   }   if (data_len < 128) {      buf[0] = 0x30;       // constructed, SEQUENCE      buf[1] = data_len;      memcpy( &buf[2], data, data_len );      *seq_len = len;      *seq = buf;      return CKR_OK;   }   if (data_len < 256) {      buf[0] = 0x30;       // constructed, SEQUENCE      buf[1] = 0x81;       // length header -- 1 length octets      buf[2] = data_len;      memcpy( &buf[3], data, data_len );      *seq_len = len;      *seq = buf;      return CKR_OK;   }   if (data_len < (1 << 16)) {      buf[0] = 0x30;       // constructed, SEQUENCE      buf[1] = 0x82;       // length header -- 2 length octets      buf[2] = (data_len >> 8) & 0xFF;      buf[3] = (data_len     ) & 0xFF;      memcpy( &buf[4], data, data_len );      *seq_len = len;      *seq = buf;      return CKR_OK;   }   if (data_len < (1 << 24)) {      buf[0] = 0x30;       // constructed, SEQUENCE      buf[1] = 0x83;       // length header -- 3 length octets      buf[2] = (data_len >> 16) & 0xFF;      buf[3] = (data_len >>  8) & 0xFF;      buf[4] = (data_len      ) & 0xFF;      memcpy( &buf[5], data, data_len );      *seq_len = len;      *seq = buf;      return CKR_OK;   }   st_err_log(4, __FILE__, __LINE__, __FUNCTION__);   return CKR_FUNCTION_FAILED;}////CK_RVber_decode_SEQUENCE( CK_BYTE  * seq,                     CK_BYTE ** data,                     CK_ULONG * data_len,                     CK_ULONG * field_len ){   CK_ULONG  len, length_octets;   if (!seq){       st_err_log(4, __FILE__, __LINE__, __FUNCTION__);      return CKR_FUNCTION_FAILED;   }   if (seq[0] != 0x30){      st_err_log(4, __FILE__, __LINE__, __FUNCTION__);      return CKR_FUNCTION_FAILED;   }   // short form lengths are easy   //   if ((seq[1] & 0x80) == 0) {      len = seq[1] & 0x7F;      *data = &seq[2];      *data_len  = len;      *field_len = 1 + (1) + len;      return CKR_OK;   }   length_octets = seq[1] & 0x7F;   if (length_octets == 1) {      len = seq[2];      *data = &seq[3];      *data_len  = len;      *field_len = 1 + (1 + 1) + len;      return CKR_OK;   }   if (length_octets == 2) {      len = seq[2];      len = len << 8;      len |= seq[3];      *data = &seq[4];      *data_len  = len;      *field_len = 1 + (1 + 2) + len;      return CKR_OK;   }   if (length_octets == 3) {      len = seq[2];      len = len << 8;      len |= seq[3];      len = len << 8;      len |= seq[4];      *data = &seq[5];      *data_len  = len;      *field_len = 1 + (1 + 3) + len;      return CKR_OK;   }   // > 3 length octets implies a length > 16MB   //   st_err_log(4, __FILE__, __LINE__, __FUNCTION__);   return CKR_FUNCTION_FAILED;}// PrivateKeyInfo ::= SEQUENCE {//    version  Version  -- always '0' for now//    privateKeyAlgorithm PrivateKeyAlgorithmIdentifier//    privateKey  PrivateKey//    attributes// }//CK_RVber_encode_PrivateKeyInfo( CK_BBOOL    length_only,                           CK_BYTE  ** data,                           CK_ULONG  * data_len,                           CK_BYTE   * algorithm_id,                           CK_ULONG    algorithm_id_len,                           CK_BYTE   * priv_key,                           CK_ULONG    priv_key_len ){   CK_BYTE  * buf = NULL;   CK_BYTE  * tmp = NULL;   CK_BYTE    version[] = { 0 };   CK_BYTE    attrib[]  = {0x05, 0x00};   CK_ULONG   len, total;   CK_RV      rc;   len = 0;   rc = ber_encode_INTEGER( TRUE, NULL, &total, version, sizeof(version) );   if (rc != CKR_OK){      st_err_log(76, __FILE__, __LINE__);      return rc;   }   else      len += total;   len += algorithm_id_len;   rc = ber_encode_OCTET_STRING( TRUE, NULL, &total, priv_key, priv_key_len );   if (rc != CKR_OK){      st_err_log(77, __FILE__, __LINE__);      return rc;   }   else      len += total;   // for this stuff, attributes are always NULL == 05 00   //   len += sizeof(attrib);   if (length_only == TRUE) {      rc = ber_encode_SEQUENCE( TRUE, NULL, &total, NULL, len );      if (rc == CKR_OK)         *data_len = total;      if (rc != CKR_OK)         st_err_log(78, __FILE__, __LINE__);      return rc;   }   buf = (CK_BYTE *)malloc(len);   if (!buf){      st_err_log(1, __FILE__, __LINE__);      return CKR_HOST_MEMORY;   }   len = 0;   rc = ber_encode_INTEGER( FALSE, &tmp, &total, version, sizeof(version) );   if (rc != CKR_OK){      st_err_log(76, __FILE__, __LINE__);      goto error;   }   memcpy( buf+len, tmp, total );

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -