Annotation of rsaref/source/r_encode.c, revision 1.1.1.2

1.1.1.2 ! root        1: /* R_ENCODE.C - RFC 1113 encoding and decoding routines
1.1       root        2:  */
                      3: 
1.1.1.2 ! root        4: /* Copyright (C) RSA Laboratories, a division of RSA Data Security,
        !             5:      Inc., created 1991. All rights reserved.
1.1       root        6:  */
                      7: 
                      8: #include "global.h"
                      9: #include "rsaref.h"
                     10: 
                     11: /* RFC 1113 encoding:
                     12: 
                     13:    Value Encoding  Value Encoding  Value Encoding  Value Encoding
                     14:        0 A            17 R            34 i            51 z
                     15:        1 B            18 S            35 j            52 0
                     16:        2 C            19 T            36 k            53 1
                     17:        3 D            20 U            37 l            54 2
                     18:        4 E            21 V            38 m            55 3
                     19:        5 F            22 W            39 n            56 4
                     20:        6 G            23 X            40 o            57 5
                     21:        7 H            24 Y            41 p            58 6
                     22:        8 I            25 Z            42 q            59 7
                     23:        9 J            26 a            43 r            60 8
                     24:       10 K            27 b            44 s            61 9
                     25:       11 L            28 c            45 t            62 +
                     26:       12 M            29 d            46 u            63 /
                     27:       13 N            30 e            47 v
                     28:       14 O            31 f            48 w         (pad) =
                     29:       15 P            32 g            49 x
                     30:       16 Q            33 h            50 y
                     31: */
                     32: #define ENCODING(i) \
                     33:   (unsigned char)(((i) < 26) ? ((i) + 0x41) : \
                     34:                   (((i) < 52) ? ((i) - 26 + 0x61) : \
                     35:                    (((i) < 62) ? ((i) - 52 + 0x30) : \
                     36:                     (((i) == 62) ? 0x2b : 0x2f))))
                     37: #define ENCODING_PAD 0x3d
                     38: 
                     39: #define IS_ENCODING(c) \
                     40:   ((((c) >= 0x41) && ((c) <= 0x5a)) || \
                     41:    (((c) >= 0x61) && ((c) <= 0x7a)) || \
                     42:    (((c) >= 0x30) && ((c) <= 0x39)) || \
                     43:    ((c) == 0x2b) || \
                     44:    ((c) == 0x2f))
                     45: 
                     46: /* assumes IS_ENCODING (c) == 1 */
                     47: #define DECODING(c) \
                     48:   (((c) == 0x2b) ? 62 : \
                     49:    (((c) == 0x2f) ? 63 : \
                     50:     (((c) <= 0x39) ? ((c) - 0x30 + 52) : \
                     51:      (((c) <= 0x5a) ? ((c) - 0x41) : ((c) - 0x61 + 26)))))
                     52:       
                     53: static void EncodeQuantum PROTO_LIST ((unsigned char [4], unsigned char [3]));
                     54: static int DecodeQuantum PROTO_LIST ((unsigned char [3], unsigned char [4]));
                     55: static void EncodeLastQuantum
                     56:   PROTO_LIST ((unsigned char [4], unsigned char *, unsigned int));
                     57: static int DecodeLastQuantum
                     58:   PROTO_LIST ((unsigned char *, unsigned int *, unsigned char [4]));
                     59: 
1.1.1.2 ! root       60: /* This always returns 0.  It is an int function for future compatibility.
        !            61:  */
        !            62: int R_EncodePEMBlock (encodedBlock, encodedBlockLen, block, blockLen)
1.1       root       63: unsigned char *encodedBlock;                               /* encoded block */
                     64: unsigned int *encodedBlockLen;                   /* length of encoded block */
                     65: unsigned char *block;                                              /* block */
                     66: unsigned int blockLen;                                   /* length of block */
                     67: {
                     68:   unsigned int i, lastLen;
                     69:   
                     70:   if (blockLen < 1) {
                     71:     *encodedBlockLen = 0;
1.1.1.2 ! root       72:     return (0);
1.1       root       73:   }
                     74:   
                     75:   for (i = 0; i < (blockLen-1)/3; i++)
                     76:     EncodeQuantum (&encodedBlock[4*i], &block[3*i]);
                     77:   
                     78:   lastLen = blockLen - 3*i;
                     79:   EncodeLastQuantum (&encodedBlock[4*i], &block[3*i], lastLen);
                     80:   *encodedBlockLen = 4*i + 4;
1.1.1.2 ! root       81: 
        !            82:   return (0);
1.1       root       83: }
                     84:                     
                     85: int R_DecodePEMBlock (block, blockLen, encodedBlock, encodedBlockLen)
                     86: unsigned char *block;                                              /* block */
                     87: unsigned int *blockLen;                                  /* length of block */
                     88: unsigned char *encodedBlock;                               /* encoded block */
                     89: unsigned int encodedBlockLen;                    /* length of encoded block */
                     90: {
                     91:   int status;
                     92:   unsigned int i, lastLen;
                     93: 
                     94:   if (encodedBlockLen % 4)
                     95:     return (RE_ENCODING);
                     96:   
                     97:   if (encodedBlockLen < 1) {
                     98:     *blockLen = 0;
                     99:     return (0);
                    100:   }
                    101:   
                    102:   for (i = 0; i < (encodedBlockLen-1)/4; i++)
                    103:     if (status = DecodeQuantum (&block[3*i], &encodedBlock[4*i]))
                    104:       return (status);
                    105:     
                    106:   if (status = DecodeLastQuantum (&block[3*i], &lastLen, &encodedBlock[4*i]))
                    107:     return (status);
                    108: 
                    109:   *blockLen = 3*i + lastLen;
                    110:   return (0);
                    111: }
                    112: 
                    113: static void EncodeQuantum (encodedQuantum, quantum)
                    114: unsigned char encodedQuantum[4];
                    115: unsigned char quantum[3];
                    116: {
                    117:   UINT4 temp;
                    118:   unsigned int a, b, c, d;
                    119:   
                    120:   temp = ((UINT4)quantum[0]) << 16;
                    121:   temp |= ((UINT4)quantum[1]) << 8;
                    122:   temp |= (UINT4)quantum[2];
                    123:   
                    124:   a = (unsigned int)((temp >> 18) & 0x3f);
                    125:   b = (unsigned int)((temp >> 12) & 0x3f);
                    126:   c = (unsigned int)((temp >> 6) & 0x3f);
                    127:   d = (unsigned int)(temp & 0x3f);
                    128: 
                    129:   encodedQuantum[0] = ENCODING (a);
                    130:   encodedQuantum[1] = ENCODING (b);
                    131:   encodedQuantum[2] = ENCODING (c);
                    132:   encodedQuantum[3] = ENCODING (d);
                    133: 
                    134:   /* Zeroize potentially sensitive information.
                    135:    */
                    136:   temp = 0;
                    137:   a = b = c = d = 0;
                    138: }
                    139: 
                    140: static int DecodeQuantum (quantum, encodedQuantum)
                    141: unsigned char quantum[3];
                    142: unsigned char encodedQuantum[4];
                    143: {
                    144:   UINT4 temp;
                    145:   unsigned int a, b, c, d;
                    146:   
                    147:   if (! IS_ENCODING (encodedQuantum[0]) ||
                    148:       ! IS_ENCODING (encodedQuantum[1]) ||
                    149:       ! IS_ENCODING (encodedQuantum[2]) ||
                    150:       ! IS_ENCODING (encodedQuantum[3]))
                    151:     return (RE_ENCODING);
                    152:   
                    153:   a = DECODING (encodedQuantum[0]);
                    154:   b = DECODING (encodedQuantum[1]);
                    155:   c = DECODING (encodedQuantum[2]);
                    156:   d = DECODING (encodedQuantum[3]);
                    157:   
                    158:   temp = ((UINT4)a) << 18;
                    159:   temp |= ((UINT4)b) << 12;
                    160:   temp |= ((UINT4)c) << 6;
                    161:   temp |= (UINT4)d;
                    162: 
                    163:   quantum[0] = (unsigned char)(temp >> 16);
                    164:   quantum[1] = (unsigned char)(temp >> 8);
                    165:   quantum[2] = (unsigned char)temp;
                    166:   
                    167:   /* Zeroize potentially sensitive information.
                    168:    */
                    169:   temp = 0;
                    170:   a = b = c = d = 0;
                    171: 
                    172:   return (0);
                    173: }
                    174: 
                    175: static void EncodeLastQuantum (encodedQuantum, quantum, quantumLen)
                    176: unsigned char encodedQuantum[4];
                    177: unsigned char *quantum;
                    178: unsigned int quantumLen;                                       /* 1, 2 or 3 */
                    179: {
                    180:   UINT4 temp;
                    181:   unsigned int a, b, c, d;
                    182: 
                    183:   temp = ((UINT4)quantum[0]) << 16;
                    184:   if (quantumLen >= 2)
                    185:     temp |= ((UINT4)quantum[1]) << 8;
                    186:   if (quantumLen == 3)
                    187:     temp |= ((UINT4)quantum[2]);
                    188:   
                    189:   a = (unsigned int)((temp >> 18) & 0x3f);
                    190:   b = (unsigned int)((temp >> 12) & 0x3f);
                    191:   if (quantumLen >= 2)
                    192:     c = (unsigned int)((temp >> 6) & 0x3f);
                    193:   if (quantumLen == 3)
                    194:     d = (unsigned int)(temp & 0x3f);
                    195: 
                    196:   encodedQuantum[0] = ENCODING (a);
                    197:   encodedQuantum[1] = ENCODING (b);
                    198:   if (quantumLen >= 2)
                    199:     encodedQuantum[2] = ENCODING (c);
                    200:   else
                    201:     encodedQuantum[2] = ENCODING_PAD;
                    202:   if (quantumLen == 3)
                    203:     encodedQuantum[3] = ENCODING (d);
                    204:   else
                    205:     encodedQuantum[3] = ENCODING_PAD;
                    206: 
                    207:   /* Zeroize potentially sensitive information.
                    208:    */
                    209:   temp = 0;
                    210:   a = b = c = d = 0;
                    211: }
                    212: 
                    213: static int DecodeLastQuantum (quantum, quantumLen, encodedQuantum)
                    214: unsigned char *quantum;
                    215: unsigned int *quantumLen;                                      /* 1, 2 or 3 */
                    216: unsigned char encodedQuantum[4];
                    217: {
                    218:   UINT4 temp;
                    219:   unsigned int a, b, c, d;
                    220:   
                    221:   if (! IS_ENCODING (encodedQuantum[0]) ||
                    222:       ! IS_ENCODING (encodedQuantum[1]) ||
                    223:       (! IS_ENCODING (encodedQuantum[2]) &&
                    224:        (encodedQuantum[2] != ENCODING_PAD)) ||
                    225:       (! IS_ENCODING (encodedQuantum[3]) &&
                    226:        (encodedQuantum[3] != ENCODING_PAD)))
                    227:     return (RE_ENCODING);
                    228:         
                    229:   if (encodedQuantum[2] == ENCODING_PAD)
                    230:     *quantumLen = 1;
                    231:   else if (encodedQuantum[3] == ENCODING_PAD)
                    232:     *quantumLen = 2;
                    233:   else
                    234:     *quantumLen = 3;
                    235:   
                    236:   a = DECODING (encodedQuantum[0]);
                    237:   b = DECODING (encodedQuantum[1]);
                    238:   if (*quantumLen >= 2)
                    239:     c = DECODING (encodedQuantum[2]);
                    240:   if (*quantumLen == 3)
                    241:     d = DECODING (encodedQuantum[3]);
                    242:   
                    243:   temp = ((UINT4)a) << 18;
                    244:   temp |= ((UINT4)b) << 12;
                    245:   if (*quantumLen >= 2)
                    246:     temp |= ((UINT4)c) << 6;
                    247:   if (*quantumLen == 3)
                    248:     temp |= ((UINT4)d);
                    249: 
                    250:   quantum[0] = (unsigned char)(temp >> 16);
                    251:   if (*quantumLen >= 2)
                    252:     quantum[1] = (unsigned char)(temp >> 8);
                    253:   if (*quantumLen == 3)
                    254:     quantum[2] = (unsigned char)temp;
                    255:   
                    256:   /* Zeroize potentially sensitive information.
                    257:    */
                    258:   temp = 0;
                    259:   a = b = c = d = 0;
                    260:   
                    261:   return (0);
                    262: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.