|
|
1.1 ! root 1: /* R_ENCODE.C - RFC 1113 encoding and decoding routines ! 2: */ ! 3: ! 4: /* Copyright (C) RSA Laboratories, a division of RSA Data Security, ! 5: Inc., created 1991. All rights reserved. ! 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: ! 60: /* This always returns 0. It is an int function for future compatibility. ! 61: */ ! 62: int R_EncodePEMBlock (encodedBlock, encodedBlockLen, block, blockLen) ! 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; ! 72: return (0); ! 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; ! 81: ! 82: return (0); ! 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.