#
source:
trunk/third/moira/util/rsaref/rsaref.h
@
23095

Revision 23095, 8.1 KB checked in by ghudson, 16 years ago (diff) |
---|

Line | |
---|---|

1 | /* RSAREF.H - header file for RSAREF cryptographic toolkit |

2 | */ |

3 | |

4 | /* Copyright (C) RSA Laboratories, a division of RSA Data Security, |

5 | Inc., created 1991. All rights reserved. |

6 | */ |

7 | |

8 | #ifndef _RSAREF_H_ |

9 | #define _RSAREF_H_ 1 |

10 | |

11 | #include "md2.h" |

12 | #include "md5.h" |

13 | #include "des.h" |

14 | |

15 | #ifdef __cplusplus |

16 | extern "C" { |

17 | #endif |

18 | |

19 | /* Message-digest algorithms. |

20 | */ |

21 | #define DA_MD2 3 |

22 | #define DA_MD5 5 |

23 | |

24 | /* Encryption algorithms to be ored with digest algorithm in Seal and Open. |

25 | */ |

26 | #define EA_DES_CBC 1 |

27 | #define EA_DES_EDE2_CBC 2 |

28 | #define EA_DES_EDE3_CBC 3 |

29 | #define EA_DESX_CBC 4 |

30 | |

31 | /* RSA key lengths. |

32 | */ |

33 | #define MIN_RSA_MODULUS_BITS 508 |

34 | #define MAX_RSA_MODULUS_BITS 1024 |

35 | #define MAX_RSA_MODULUS_LEN ((MAX_RSA_MODULUS_BITS + 7) / 8) |

36 | #define MAX_RSA_PRIME_BITS ((MAX_RSA_MODULUS_BITS + 1) / 2) |

37 | #define MAX_RSA_PRIME_LEN ((MAX_RSA_PRIME_BITS + 7) / 8) |

38 | |

39 | /* Maximum lengths of encoded and encrypted content, as a function of |

40 | content length len. Also, inverse functions. |

41 | */ |

42 | #define ENCODED_CONTENT_LEN(len) (4*(len)/3 + 3) |

43 | #define ENCRYPTED_CONTENT_LEN(len) ENCODED_CONTENT_LEN ((len)+8) |

44 | #define DECODED_CONTENT_LEN(len) (3*(len)/4 + 1) |

45 | #define DECRYPTED_CONTENT_LEN(len) (DECODED_CONTENT_LEN (len) - 1) |

46 | |

47 | /* Maximum lengths of signatures, encrypted keys, encrypted |

48 | signatures, and message digests. |

49 | */ |

50 | #define MAX_SIGNATURE_LEN MAX_RSA_MODULUS_LEN |

51 | #define MAX_PEM_SIGNATURE_LEN ENCODED_CONTENT_LEN (MAX_SIGNATURE_LEN) |

52 | #define MAX_ENCRYPTED_KEY_LEN MAX_RSA_MODULUS_LEN |

53 | #define MAX_PEM_ENCRYPTED_KEY_LEN ENCODED_CONTENT_LEN (MAX_ENCRYPTED_KEY_LEN) |

54 | #define MAX_PEM_ENCRYPTED_SIGNATURE_LEN \ |

55 | ENCRYPTED_CONTENT_LEN (MAX_SIGNATURE_LEN) |

56 | #define MAX_DIGEST_LEN 16 |

57 | |

58 | /* Maximum length of Diffie-Hellman parameters. |

59 | */ |

60 | #define DH_PRIME_LEN(bits) (((bits) + 7) / 8) |

61 | |

62 | /* Error codes. |

63 | */ |

64 | #define RE_CONTENT_ENCODING 0x0400 |

65 | #define RE_DATA 0x0401 |

66 | #define RE_DIGEST_ALGORITHM 0x0402 |

67 | #define RE_ENCODING 0x0403 |

68 | #define RE_KEY 0x0404 |

69 | #define RE_KEY_ENCODING 0x0405 |

70 | #define RE_LEN 0x0406 |

71 | #define RE_MODULUS_LEN 0x0407 |

72 | #define RE_NEED_RANDOM 0x0408 |

73 | #define RE_PRIVATE_KEY 0x0409 |

74 | #define RE_PUBLIC_KEY 0x040a |

75 | #define RE_SIGNATURE 0x040b |

76 | #define RE_SIGNATURE_ENCODING 0x040c |

77 | #define RE_ENCRYPTION_ALGORITHM 0x040d |

78 | |

79 | /* Random structure. |

80 | */ |

81 | typedef struct { |

82 | unsigned int bytesNeeded; |

83 | unsigned char state[16]; |

84 | unsigned int outputAvailable; |

85 | unsigned char output[16]; |

86 | } R_RANDOM_STRUCT; |

87 | |

88 | /* RSA public and private key. |

89 | */ |

90 | typedef struct { |

91 | unsigned int bits; /* length in bits of modulus */ |

92 | unsigned char modulus[MAX_RSA_MODULUS_LEN]; /* modulus */ |

93 | unsigned char exponent[MAX_RSA_MODULUS_LEN]; /* public exponent */ |

94 | } R_RSA_PUBLIC_KEY; |

95 | |

96 | typedef struct { |

97 | unsigned int bits; /* length in bits of modulus */ |

98 | unsigned char modulus[MAX_RSA_MODULUS_LEN]; /* modulus */ |

99 | unsigned char publicExponent[MAX_RSA_MODULUS_LEN]; /* public exponent */ |

100 | unsigned char exponent[MAX_RSA_MODULUS_LEN]; /* private exponent */ |

101 | unsigned char prime[2][MAX_RSA_PRIME_LEN]; /* prime factors */ |

102 | unsigned char primeExponent[2][MAX_RSA_PRIME_LEN]; /* exponents for CRT */ |

103 | unsigned char coefficient[MAX_RSA_PRIME_LEN]; /* CRT coefficient */ |

104 | } R_RSA_PRIVATE_KEY; |

105 | |

106 | /* RSA prototype key. |

107 | */ |

108 | typedef struct { |

109 | unsigned int bits; /* length in bits of modulus */ |

110 | int useFermat4; /* public exponent (1 = F4, 0 = 3) */ |

111 | } R_RSA_PROTO_KEY; |

112 | |

113 | /* Diffie-Hellman parameters. |

114 | */ |

115 | typedef struct { |

116 | unsigned char *prime; /* prime */ |

117 | unsigned int primeLen; /* length of prime */ |

118 | unsigned char *generator; /* generator */ |

119 | unsigned int generatorLen; /* length of generator */ |

120 | } R_DH_PARAMS; |

121 | |

122 | typedef struct { |

123 | int digestAlgorithm; |

124 | union { |

125 | MD2_CTX md2; |

126 | MD5_CTX md5; |

127 | } context; |

128 | } R_DIGEST_CTX; |

129 | |

130 | typedef struct { |

131 | R_DIGEST_CTX digestContext; |

132 | } R_SIGNATURE_CTX; |

133 | |

134 | typedef struct { |

135 | int encryptionAlgorithm; |

136 | union { |

137 | DES_CBC_CTX des; |

138 | DES3_CBC_CTX des3; |

139 | DESX_CBC_CTX desx; |

140 | } cipherContext; |

141 | |

142 | unsigned char buffer[8]; |

143 | unsigned int bufferLen; |

144 | } R_ENVELOPE_CTX; |

145 | |

146 | /* Random structures. |

147 | */ |

148 | int R_RandomInit PROTO_LIST ((R_RANDOM_STRUCT *)); |

149 | int R_RandomUpdate PROTO_LIST |

150 | ((R_RANDOM_STRUCT *, unsigned char *, unsigned int)); |

151 | int R_GetRandomBytesNeeded PROTO_LIST ((unsigned int *, R_RANDOM_STRUCT *)); |

152 | void R_RandomFinal PROTO_LIST ((R_RANDOM_STRUCT *)); |

153 | |

154 | /* Cryptographic procedures "by parts" |

155 | */ |

156 | int R_DigestInit PROTO_LIST ((R_DIGEST_CTX *, int)); |

157 | int R_DigestUpdate PROTO_LIST |

158 | ((R_DIGEST_CTX *, unsigned char *, unsigned int)); |

159 | int R_DigestFinal PROTO_LIST |

160 | ((R_DIGEST_CTX *, unsigned char *, unsigned int *)); |

161 | |

162 | int R_SignInit PROTO_LIST ((R_SIGNATURE_CTX *, int)); |

163 | int R_SignUpdate PROTO_LIST |

164 | ((R_SIGNATURE_CTX *, unsigned char *, unsigned int)); |

165 | int R_SignFinal PROTO_LIST |

166 | ((R_SIGNATURE_CTX *, unsigned char *, unsigned int *, R_RSA_PRIVATE_KEY *)); |

167 | |

168 | int R_VerifyInit PROTO_LIST ((R_SIGNATURE_CTX *, int)); |

169 | int R_VerifyUpdate PROTO_LIST |

170 | ((R_SIGNATURE_CTX *, unsigned char *, unsigned int)); |

171 | int R_VerifyFinal PROTO_LIST |

172 | ((R_SIGNATURE_CTX *, unsigned char *, unsigned int, R_RSA_PUBLIC_KEY *)); |

173 | |

174 | int R_SealInit PROTO_LIST |

175 | ((R_ENVELOPE_CTX *, unsigned char **, unsigned int *, unsigned char [8], |

176 | unsigned int, R_RSA_PUBLIC_KEY **, int, R_RANDOM_STRUCT *)); |

177 | int R_SealUpdate PROTO_LIST |

178 | ((R_ENVELOPE_CTX *, unsigned char *, unsigned int *, unsigned char *, |

179 | unsigned int)); |

180 | int R_SealFinal PROTO_LIST |

181 | ((R_ENVELOPE_CTX *, unsigned char *, unsigned int *)); |

182 | |

183 | int R_OpenInit PROTO_LIST |

184 | ((R_ENVELOPE_CTX *, int, unsigned char *, unsigned int, unsigned char [8], |

185 | R_RSA_PRIVATE_KEY *)); |

186 | int R_OpenUpdate PROTO_LIST |

187 | ((R_ENVELOPE_CTX *, unsigned char *, unsigned int *, unsigned char *, |

188 | unsigned int)); |

189 | int R_OpenFinal PROTO_LIST |

190 | ((R_ENVELOPE_CTX *, unsigned char *, unsigned int *)); |

191 | |

192 | /* Cryptographic enhancements by block. |

193 | */ |

194 | int R_SignPEMBlock PROTO_LIST |

195 | ((unsigned char *, unsigned int *, unsigned char *, unsigned int *, |

196 | unsigned char *, unsigned int, int, int, R_RSA_PRIVATE_KEY *)); |

197 | int R_SignBlock PROTO_LIST |

198 | ((unsigned char *, unsigned int *, unsigned char *, unsigned int, int, |

199 | R_RSA_PRIVATE_KEY *)); |

200 | int R_VerifyPEMSignature PROTO_LIST |

201 | ((unsigned char *, unsigned int *, unsigned char *, unsigned int, |

202 | unsigned char *, unsigned int, int, int, R_RSA_PUBLIC_KEY *)); |

203 | int R_VerifyBlockSignature PROTO_LIST |

204 | ((unsigned char *, unsigned int, unsigned char *, unsigned int, int, |

205 | R_RSA_PUBLIC_KEY *)); |

206 | int R_SealPEMBlock PROTO_LIST |

207 | ((unsigned char *, unsigned int *, unsigned char *, unsigned int *, |

208 | unsigned char *, unsigned int *, unsigned char [8], unsigned char *, |

209 | unsigned int, int, R_RSA_PUBLIC_KEY *, R_RSA_PRIVATE_KEY *, |

210 | R_RANDOM_STRUCT *)); |

211 | int R_OpenPEMBlock PROTO_LIST |

212 | ((unsigned char *, unsigned int *, unsigned char *, unsigned int, |

213 | unsigned char *, unsigned int, unsigned char *, unsigned int, |

214 | unsigned char [8], int, R_RSA_PRIVATE_KEY *, R_RSA_PUBLIC_KEY *)); |

215 | int R_DigestBlock PROTO_LIST |

216 | ((unsigned char *, unsigned int *, unsigned char *, unsigned int, int)); |

217 | |

218 | /* Printable ASCII encoding and decoding. |

219 | */ |

220 | int R_EncodePEMBlock PROTO_LIST |

221 | ((unsigned char *, unsigned int *, unsigned char *, unsigned int)); |

222 | int R_DecodePEMBlock PROTO_LIST |

223 | ((unsigned char *, unsigned int *, unsigned char *, unsigned int)); |

224 | |

225 | /* Key-pair generation. |

226 | */ |

227 | int R_GeneratePEMKeys PROTO_LIST |

228 | ((R_RSA_PUBLIC_KEY *, R_RSA_PRIVATE_KEY *, R_RSA_PROTO_KEY *, |

229 | R_RANDOM_STRUCT *)); |

230 | |

231 | /* Diffie-Hellman key agreement. |

232 | */ |

233 | int R_GenerateDHParams PROTO_LIST |

234 | ((R_DH_PARAMS *, unsigned int, unsigned int, R_RANDOM_STRUCT *)); |

235 | int R_SetupDHAgreement PROTO_LIST |

236 | ((unsigned char *, unsigned char *, unsigned int, R_DH_PARAMS *, |

237 | R_RANDOM_STRUCT *)); |

238 | int R_ComputeDHAgreedKey PROTO_LIST |

239 | ((unsigned char *, unsigned char *, unsigned char *, unsigned int, |

240 | R_DH_PARAMS *)); |

241 | |

242 | /* Routines supplied by the implementor. |

243 | */ |

244 | void R_memset PROTO_LIST ((POINTER, int, unsigned int)); |

245 | void R_memcpy PROTO_LIST ((POINTER, POINTER, unsigned int)); |

246 | int R_memcmp PROTO_LIST ((POINTER, POINTER, unsigned int)); |

247 | |

248 | #ifdef __cplusplus |

249 | } |

250 | #endif |

251 | |

252 | #endif |

**Note:**See TracBrowser for help on using the repository browser.