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

📄 r_encode.c

📁 椭圆曲线密码C实现的
💻 C
字号:
/* R_ENCODE.C - RFC 1113 encoding and decoding routines *//* Copyright (C) RSA Laboratories, a division of RSA Data Security,     Inc., created 1991. All rights reserved. */#include "global.h"#include "rsaref.h"/* RFC 1113 encoding:   Value Encoding  Value Encoding  Value Encoding  Value Encoding       0 A            17 R            34 i            51 z       1 B            18 S            35 j            52 0       2 C            19 T            36 k            53 1       3 D            20 U            37 l            54 2       4 E            21 V            38 m            55 3       5 F            22 W            39 n            56 4       6 G            23 X            40 o            57 5       7 H            24 Y            41 p            58 6       8 I            25 Z            42 q            59 7       9 J            26 a            43 r            60 8      10 K            27 b            44 s            61 9      11 L            28 c            45 t            62 +      12 M            29 d            46 u            63 /      13 N            30 e            47 v      14 O            31 f            48 w         (pad) =      15 P            32 g            49 x      16 Q            33 h            50 y*/#define ENCODING(i) \  (unsigned char)(((i) < 26) ? ((i) + 0x41) : \                  (((i) < 52) ? ((i) - 26 + 0x61) : \                   (((i) < 62) ? ((i) - 52 + 0x30) : \                    (((i) == 62) ? 0x2b : 0x2f))))#define ENCODING_PAD 0x3d#define IS_ENCODING(c) \  ((((c) >= 0x41) && ((c) <= 0x5a)) || \   (((c) >= 0x61) && ((c) <= 0x7a)) || \   (((c) >= 0x30) && ((c) <= 0x39)) || \   ((c) == 0x2b) || \   ((c) == 0x2f))/* assumes IS_ENCODING (c) == 1 */#define DECODING(c) \  (((c) == 0x2b) ? 62 : \   (((c) == 0x2f) ? 63 : \    (((c) <= 0x39) ? ((c) - 0x30 + 52) : \     (((c) <= 0x5a) ? ((c) - 0x41) : ((c) - 0x61 + 26)))))      static void EncodeQuantum PROTO_LIST ((unsigned char [4], unsigned char [3]));static int DecodeQuantum PROTO_LIST ((unsigned char [3], unsigned char [4]));static void EncodeLastQuantum  PROTO_LIST ((unsigned char [4], unsigned char *, unsigned int));static int DecodeLastQuantum  PROTO_LIST ((unsigned char *, unsigned int *, unsigned char [4]));/* This always returns 0.  It is an int function for future compatibility. */int R_EncodePEMBlock (encodedBlock, encodedBlockLen, block, blockLen)unsigned char *encodedBlock;                               /* encoded block */unsigned int *encodedBlockLen;                   /* length of encoded block */unsigned char *block;                                              /* block */unsigned int blockLen;                                   /* length of block */{  unsigned int i, lastLen;    if (blockLen < 1) {    *encodedBlockLen = 0;    return (0);  }    for (i = 0; i < (blockLen-1)/3; i++)    EncodeQuantum (&encodedBlock[4*i], &block[3*i]);    lastLen = blockLen - 3*i;  EncodeLastQuantum (&encodedBlock[4*i], &block[3*i], lastLen);  *encodedBlockLen = 4*i + 4;  return (0);}                    int R_DecodePEMBlock (block, blockLen, encodedBlock, encodedBlockLen)unsigned char *block;                                              /* block */unsigned int *blockLen;                                  /* length of block */unsigned char *encodedBlock;                               /* encoded block */unsigned int encodedBlockLen;                    /* length of encoded block */{  int status;  unsigned int i, lastLen;  if (encodedBlockLen % 4)    return (RE_ENCODING);    if (encodedBlockLen < 1) {    *blockLen = 0;    return (0);  }    for (i = 0; i < (encodedBlockLen-1)/4; i++)    if (status = DecodeQuantum (&block[3*i], &encodedBlock[4*i]))      return (status);      if (status = DecodeLastQuantum (&block[3*i], &lastLen, &encodedBlock[4*i]))    return (status);  *blockLen = 3*i + lastLen;  return (0);}static void EncodeQuantum (encodedQuantum, quantum)unsigned char encodedQuantum[4];unsigned char quantum[3];{  UINT4 temp;  unsigned int a, b, c, d;    temp = ((UINT4)quantum[0]) << 16;  temp |= ((UINT4)quantum[1]) << 8;  temp |= (UINT4)quantum[2];    a = (unsigned int)((temp >> 18) & 0x3f);  b = (unsigned int)((temp >> 12) & 0x3f);  c = (unsigned int)((temp >> 6) & 0x3f);  d = (unsigned int)(temp & 0x3f);  encodedQuantum[0] = ENCODING (a);  encodedQuantum[1] = ENCODING (b);  encodedQuantum[2] = ENCODING (c);  encodedQuantum[3] = ENCODING (d);  /* Zeroize potentially sensitive information.   */  temp = 0;  a = b = c = d = 0;}static int DecodeQuantum (quantum, encodedQuantum)unsigned char quantum[3];unsigned char encodedQuantum[4];{  UINT4 temp;  unsigned int a, b, c, d;    if (! IS_ENCODING (encodedQuantum[0]) ||      ! IS_ENCODING (encodedQuantum[1]) ||      ! IS_ENCODING (encodedQuantum[2]) ||      ! IS_ENCODING (encodedQuantum[3]))    return (RE_ENCODING);    a = DECODING (encodedQuantum[0]);  b = DECODING (encodedQuantum[1]);  c = DECODING (encodedQuantum[2]);  d = DECODING (encodedQuantum[3]);    temp = ((UINT4)a) << 18;  temp |= ((UINT4)b) << 12;  temp |= ((UINT4)c) << 6;  temp |= (UINT4)d;  quantum[0] = (unsigned char)(temp >> 16);  quantum[1] = (unsigned char)(temp >> 8);  quantum[2] = (unsigned char)temp;    /* Zeroize potentially sensitive information.   */  temp = 0;  a = b = c = d = 0;  return (0);}static void EncodeLastQuantum (encodedQuantum, quantum, quantumLen)unsigned char encodedQuantum[4];unsigned char *quantum;unsigned int quantumLen;                                       /* 1, 2 or 3 */{  UINT4 temp;  unsigned int a, b, c, d;  temp = ((UINT4)quantum[0]) << 16;  if (quantumLen >= 2)    temp |= ((UINT4)quantum[1]) << 8;  if (quantumLen == 3)    temp |= ((UINT4)quantum[2]);    a = (unsigned int)((temp >> 18) & 0x3f);  b = (unsigned int)((temp >> 12) & 0x3f);  if (quantumLen >= 2)    c = (unsigned int)((temp >> 6) & 0x3f);  if (quantumLen == 3)    d = (unsigned int)(temp & 0x3f);  encodedQuantum[0] = ENCODING (a);  encodedQuantum[1] = ENCODING (b);  if (quantumLen >= 2)    encodedQuantum[2] = ENCODING (c);  else    encodedQuantum[2] = ENCODING_PAD;  if (quantumLen == 3)    encodedQuantum[3] = ENCODING (d);  else    encodedQuantum[3] = ENCODING_PAD;  /* Zeroize potentially sensitive information.   */  temp = 0;  a = b = c = d = 0;}static int DecodeLastQuantum (quantum, quantumLen, encodedQuantum)unsigned char *quantum;unsigned int *quantumLen;                                      /* 1, 2 or 3 */unsigned char encodedQuantum[4];{  UINT4 temp;  unsigned int a, b, c, d;    if (! IS_ENCODING (encodedQuantum[0]) ||      ! IS_ENCODING (encodedQuantum[1]) ||      (! IS_ENCODING (encodedQuantum[2]) &&       (encodedQuantum[2] != ENCODING_PAD)) ||      (! IS_ENCODING (encodedQuantum[3]) &&       (encodedQuantum[3] != ENCODING_PAD)))    return (RE_ENCODING);          if (encodedQuantum[2] == ENCODING_PAD)    *quantumLen = 1;  else if (encodedQuantum[3] == ENCODING_PAD)    *quantumLen = 2;  else    *quantumLen = 3;    a = DECODING (encodedQuantum[0]);  b = DECODING (encodedQuantum[1]);  if (*quantumLen >= 2)    c = DECODING (encodedQuantum[2]);  if (*quantumLen == 3)    d = DECODING (encodedQuantum[3]);    temp = ((UINT4)a) << 18;  temp |= ((UINT4)b) << 12;  if (*quantumLen >= 2)    temp |= ((UINT4)c) << 6;  if (*quantumLen == 3)    temp |= ((UINT4)d);  quantum[0] = (unsigned char)(temp >> 16);  if (*quantumLen >= 2)    quantum[1] = (unsigned char)(temp >> 8);  if (*quantumLen == 3)    quantum[2] = (unsigned char)temp;    /* Zeroize potentially sensitive information.   */  temp = 0;  a = b = c = d = 0;    return (0);}

⌨️ 快捷键说明

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