博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
EMSA-PKCS1-V1_5-ENCODE及EMSA-PKCS1-V1_5-ENCODE 的实现- just for sha1
阅读量:2220 次
发布时间:2019-05-08

本文共 4378 字,大约阅读时间需要 14 分钟。

头文件:

#ifndef _UPKI__UPKI_PKCS1_PAD_H

#define _UPKI__UPKI_PKCS1_PAD_H
#include <string.h>
#include <stdlib.h>

/* suggested int types */

  typedef unsigned char uint8_t;
  typedef unsigned short uint16_t;
  typedef unsigned int uint32_t;

/* boolean type */

  typedef enum { False, True } Boolean;

enum UPKIErrStatus {

  /** Requested operation completed successfully */

  UPKI_SUCCESS = 0, /* not necessary to force value to zero, but just to be safe */
  /** Message is too long for this function */
  UPKI_ERR_MSG_TOO_LONG,

};

#define MemCpy(s1,s2,n) memcpy((s1),(s2),(n))

#define MemSet(s1,c,n) memset((s1),(c),(n))
#define MemCmp(s1,s2,n) memcmp((s1),(s2),(n))

UPKIErrStatus UPKI_EMSA_PKCS1_v1_5_Encode(int modulusSize, uint8_t * data
          );

uint8_t *UPKI_EMSA_PKCS1_v1_5_Decode(int modulusSize, uint8_t * data

         );

#endif /* _UPKI__UPKI_PKCS1_PAD_H */

 

c文件

#include "upki_pkcs1_pad.h"

const uint8_t SHA1DigestInfo[] = {

  /* SEQUENCE */
  0x30,
  /* length */
  0x21,
  /* Algorithm Identifier */
  /* SEQUENCE */
  0x30,
  /* length */
#ifdef PKCS1_v2_1_BUG
  0x1f,
#else
  0x09,
#endif
  /* OBJECT IDENTIFIER */
  0x06,
  /* Length */
  0x05,
  /* id-SHA1 ::= { iso(1) identified-organisation(3) oiw(14) secsig(3)
   * algorithms(2) 26 */
  0x2b, 0x0e, 0x03, 0x02, 0x1a,
  /* NULL */
  0x05, 0x00,   /* NB: Oscar omits this parameter */
  /* OCTET STRING */
  0x04,
  /* length */
  0x14
};

#define SHA1DigestInfoLen sizeof(SHA1DigestInfo)

#define PKCS1_5_TYPE_01 0x01
#define PKCS1_5_TYPE_02 0x02

/** Encode a message using the EMSA-PKCS-v1_5-Encode method
 *
 * @ingroup upki_provider
 *
 * @param emLen Size of the modulus being used for the padding
 * @param data Buffer to place padded message in
 * @param alg Digest algorithm being used in this padding- just use sha1
 *
 * @pre The message to be encoded is already at
 *   data[emLen - messageLength - 1]
 */
UPKIErrStatus
UPKI_EMSA_PKCS1_v1_5_Encode(int emLen, uint8_t * data)
{
  int startM;
  const uint8_t *digestInfo;
  int digestInfoLen;

  /* EM = 01 || PS || 00 || T, where PS = >8 0xff bytes

   */
    digestInfo = SHA1DigestInfo;
    /* FIXME: Magic numbers */
    startM = emLen - (20 + SHA1DigestInfoLen);
    digestInfoLen = SHA1DigestInfoLen;

 

  /* Check message length */
  if (startM < 10) {
    return UPKI_ERR_MSG_TOO_LONG;
  }

  /* 01 */

  data[0] = PKCS1_5_TYPE_01;

  /* PS */

  MemSet(data + 1, 0xff, startM - 2);

  /* 00 */

  data[startM - 1] = 0;

  /* DigestInfo */

  MemCpy(data + startM, digestInfo, digestInfoLen);

  /* M is already in there */

  return UPKI_SUCCESS;
}

/** Decode a message using the EME-PKCS-v1_5-Decode method

 *
 * @ingroup upki_provider
 *
 * @param emLen Size of the modulus being used for the padding
 * @param data Buffer containing the padded message
 * @param alg Digest algorithm being used in this padding- just use sha1
 *
 * @return offset of the message or NULL on error
 *
 * @pre The message to be encoded is already at
 *   data[emLen - digestSize - 1]
 */
uint8_t *UPKI_EMSA_PKCS1_v1_5_Decode
  (int emLen, uint8_t * data) {
  const uint8_t *digestInfo;
  int i;
  int startM;
  int digestInfoLen;

  /* EM = 01 || PS || 00 || T, where PS = >8 0xff bytes

   */
    digestInfo = SHA1DigestInfo;
    /* FIXME: Magic numbers */
    startM = emLen - (20 + SHA1DigestInfoLen);
    digestInfoLen = SHA1DigestInfoLen;

  /* Check type */

  if (data[0] != PKCS1_5_TYPE_01) {
    return 0;
  }

  /* Check FF */

  for (i = 1; i < startM - 1; i++) {
    if (data[i] != 0xff) {
      return 0;
    }
  }

  /* Check 0 */

  if (data[i] != 0) {
    return 0;
  }

  /* Check digest info */

  if (MemCmp(data + startM, digestInfo, digestInfoLen) != 0) {
    return 0;
  }

  /* All hunky dory, return offset */

  return data + startM + digestInfoLen;
}
 

 

测试代码

#include<stdio.h>

#include "upki_pkcs1_pad.h"

const uint8_t testSHA1[] =

{
  0xa9, 0x99, 0x3e, 0x36, 0x47, 0x06, 0x81, 0x6a, 0xba, 0x3e,
  0x25, 0x71, 0x78, 0x50, 0xc2, 0x6c, 0x9c, 0xd0, 0xd8, 0x9d
};

 

/* Digest algorithm sizes */

 enum DigestAlgorithmSize
 {
    ALG_SHA1_DIGEST_SIZE = 20,
    ALG_MD5_DIGEST_SIZE = 16,
    ALG_MD2_DIGEST_SIZE = 16
  };

int main()
{
  uint8_t buf[128];
  uint8_t *data;
  int errs = 0;

  printf("EMSA-PKCS1-v1_5-Encode with SHA-1/n");

  memcpy(buf + 127 - ALG_SHA1_DIGEST_SIZE, testSHA1, ALG_SHA1_DIGEST_SIZE);
  if (UPKI_EMSA_PKCS1_v1_5_Encode(127, buf) != UPKI_SUCCESS)
  {
    printf("failed/n");
  } else
  {
    printf("ok/n");
  }

  printf("EMSA-PKCS1-v1_5-Decode with SHA-1/n");

  data = UPKI_EMSA_PKCS1_v1_5_Decode(127, buf);
  if (!data || memcmp(data, testSHA1, ALG_SHA1_DIGEST_SIZE) != 0)
  {
    printf("failed/n");
    errs++;
  } else
  {
    printf("ok/n");
  }

 
  while(1);
  return 0;
}

转载地址:http://qpnfb.baihongyu.com/

你可能感兴趣的文章
什么是 Q-learning
查看>>
用一个小游戏入门深度强化学习
查看>>
5 分钟入门 Google 最强NLP模型:BERT
查看>>
初探Java设计模式4:一文带你掌握JDK中的设计模式
查看>>
初探Java设计模式5:一文了解Spring涉及到的9种设计模式
查看>>
Java集合详解1:一文读懂ArrayList,Vector与Stack使用方法和实现原理
查看>>
Java集合详解2:一文读懂Queue和LinkedList
查看>>
Java集合详解3:一文读懂Iterator,fail-fast机制与比较器
查看>>
Java集合详解4:一文读懂HashMap和HashTable的区别以及常见面试题
查看>>
Java集合详解5:深入理解LinkedHashMap和LRU缓存
查看>>
Java集合详解6:这次,从头到尾带你解读Java中的红黑树
查看>>
Java集合详解8:Java集合类细节精讲,细节决定成败
查看>>
Java并发指南1:并发基础与Java多线程
查看>>
Java并发指南2:深入理解Java内存模型JMM
查看>>
Java并发指南5:JMM中的final关键字解析
查看>>
Java并发指南6:Java内存模型JMM总结
查看>>
Java并发指南7:JUC的核心类AQS详解
查看>>
Java并发指南8:AQS中的公平锁与非公平锁,Condtion
查看>>
Java网络编程和NIO详解6:Linux epoll实现原理详解
查看>>
Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理
查看>>