Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.
 
 
 
 
 
 

238 рядки
9.9 KiB

  1. /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  2. * All rights reserved.
  3. *
  4. * This package is an SSL implementation written
  5. * by Eric Young (eay@cryptsoft.com).
  6. * The implementation was written so as to conform with Netscapes SSL.
  7. *
  8. * This library is free for commercial and non-commercial use as long as
  9. * the following conditions are aheared to. The following conditions
  10. * apply to all code found in this distribution, be it the RC4, RSA,
  11. * lhash, DES, etc., code; not just the SSL code. The SSL documentation
  12. * included with this distribution is covered by the same copyright terms
  13. * except that the holder is Tim Hudson (tjh@cryptsoft.com).
  14. *
  15. * Copyright remains Eric Young's, and as such any Copyright notices in
  16. * the code are not to be removed.
  17. * If this package is used in a product, Eric Young should be given attribution
  18. * as the author of the parts of the library used.
  19. * This can be in the form of a textual message at program startup or
  20. * in documentation (online or textual) provided with the package.
  21. *
  22. * Redistribution and use in source and binary forms, with or without
  23. * modification, are permitted provided that the following conditions
  24. * are met:
  25. * 1. Redistributions of source code must retain the copyright
  26. * notice, this list of conditions and the following disclaimer.
  27. * 2. Redistributions in binary form must reproduce the above copyright
  28. * notice, this list of conditions and the following disclaimer in the
  29. * documentation and/or other materials provided with the distribution.
  30. * 3. All advertising materials mentioning features or use of this software
  31. * must display the following acknowledgement:
  32. * "This product includes cryptographic software written by
  33. * Eric Young (eay@cryptsoft.com)"
  34. * The word 'cryptographic' can be left out if the rouines from the library
  35. * being used are not cryptographic related :-).
  36. * 4. If you include any Windows specific code (or a derivative thereof) from
  37. * the apps directory (application code) you must include an acknowledgement:
  38. * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
  39. *
  40. * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
  41. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  42. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  43. * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  44. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  45. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  46. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  47. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  48. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  49. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  50. * SUCH DAMAGE.
  51. *
  52. * The licence and distribution terms for any publically available version or
  53. * derivative of this code cannot be changed. i.e. this code cannot simply be
  54. * copied and put under another distribution licence
  55. * [including the GNU Public Licence.] */
  56. #ifndef OPENSSL_HEADER_EVP_INTERNAL_H
  57. #define OPENSSL_HEADER_EVP_INTERNAL_H
  58. #include <openssl/base.h>
  59. #include <openssl/rsa.h>
  60. #if defined(__cplusplus)
  61. extern "C" {
  62. #endif
  63. struct evp_pkey_asn1_method_st {
  64. int pkey_id;
  65. uint8_t oid[9];
  66. uint8_t oid_len;
  67. /* pub_decode decodes |params| and |key| as a SubjectPublicKeyInfo
  68. * and writes the result into |out|. It returns one on success and zero on
  69. * error. |params| is the AlgorithmIdentifier after the OBJECT IDENTIFIER
  70. * type field, and |key| is the contents of the subjectPublicKey with the
  71. * leading padding byte checked and removed. Although X.509 uses BIT STRINGs
  72. * to represent SubjectPublicKeyInfo, every key type defined encodes the key
  73. * as a byte string with the same conversion to BIT STRING. */
  74. int (*pub_decode)(EVP_PKEY *out, CBS *params, CBS *key);
  75. /* pub_encode encodes |key| as a SubjectPublicKeyInfo and appends the result
  76. * to |out|. It returns one on success and zero on error. */
  77. int (*pub_encode)(CBB *out, const EVP_PKEY *key);
  78. int (*pub_cmp)(const EVP_PKEY *a, const EVP_PKEY *b);
  79. /* priv_decode decodes |params| and |key| as a PrivateKeyInfo and writes the
  80. * result into |out|. It returns one on success and zero on error. |params| is
  81. * the AlgorithmIdentifier after the OBJECT IDENTIFIER type field, and |key|
  82. * is the contents of the OCTET STRING privateKey field. */
  83. int (*priv_decode)(EVP_PKEY *out, CBS *params, CBS *key);
  84. /* priv_encode encodes |key| as a PrivateKeyInfo and appends the result to
  85. * |out|. It returns one on success and zero on error. */
  86. int (*priv_encode)(CBB *out, const EVP_PKEY *key);
  87. /* pkey_opaque returns 1 if the |pk| is opaque. Opaque keys are backed by
  88. * custom implementations which do not expose key material and parameters.*/
  89. int (*pkey_opaque)(const EVP_PKEY *pk);
  90. /* pkey_supports_digest returns one if |pkey| supports digests of
  91. * type |md|. This is intended for use with EVP_PKEYs backing custom
  92. * implementations which can't sign all digests. If null, it is
  93. * assumed that all digests are supported. */
  94. int (*pkey_supports_digest)(const EVP_PKEY *pkey, const EVP_MD *md);
  95. int (*pkey_size)(const EVP_PKEY *pk);
  96. int (*pkey_bits)(const EVP_PKEY *pk);
  97. int (*param_missing)(const EVP_PKEY *pk);
  98. int (*param_copy)(EVP_PKEY *to, const EVP_PKEY *from);
  99. int (*param_cmp)(const EVP_PKEY *a, const EVP_PKEY *b);
  100. void (*pkey_free)(EVP_PKEY *pkey);
  101. } /* EVP_PKEY_ASN1_METHOD */;
  102. #define EVP_PKEY_OP_UNDEFINED 0
  103. #define EVP_PKEY_OP_KEYGEN (1 << 2)
  104. #define EVP_PKEY_OP_SIGN (1 << 3)
  105. #define EVP_PKEY_OP_VERIFY (1 << 4)
  106. #define EVP_PKEY_OP_VERIFYRECOVER (1 << 5)
  107. #define EVP_PKEY_OP_ENCRYPT (1 << 6)
  108. #define EVP_PKEY_OP_DECRYPT (1 << 7)
  109. #define EVP_PKEY_OP_DERIVE (1 << 8)
  110. #define EVP_PKEY_OP_TYPE_SIG \
  111. (EVP_PKEY_OP_SIGN | EVP_PKEY_OP_VERIFY | EVP_PKEY_OP_VERIFYRECOVER)
  112. #define EVP_PKEY_OP_TYPE_CRYPT (EVP_PKEY_OP_ENCRYPT | EVP_PKEY_OP_DECRYPT)
  113. #define EVP_PKEY_OP_TYPE_NOGEN \
  114. (EVP_PKEY_OP_SIG | EVP_PKEY_OP_CRYPT | EVP_PKEY_OP_DERIVE)
  115. #define EVP_PKEY_OP_TYPE_GEN EVP_PKEY_OP_KEYGEN
  116. /* EVP_PKEY_CTX_ctrl performs |cmd| on |ctx|. The |keytype| and |optype|
  117. * arguments can be -1 to specify that any type and operation are acceptable,
  118. * otherwise |keytype| must match the type of |ctx| and the bits of |optype|
  119. * must intersect the operation flags set on |ctx|.
  120. *
  121. * The |p1| and |p2| arguments depend on the value of |cmd|.
  122. *
  123. * It returns one on success and zero on error. */
  124. OPENSSL_EXPORT int EVP_PKEY_CTX_ctrl(EVP_PKEY_CTX *ctx, int keytype, int optype,
  125. int cmd, int p1, void *p2);
  126. #define EVP_PKEY_CTRL_MD 1
  127. #define EVP_PKEY_CTRL_GET_MD 2
  128. /* EVP_PKEY_CTRL_PEER_KEY is called with different values of |p1|:
  129. * 0: Is called from |EVP_PKEY_derive_set_peer| and |p2| contains a peer key.
  130. * If the return value is <= 0, the key is rejected.
  131. * 1: Is called at the end of |EVP_PKEY_derive_set_peer| and |p2| contains a
  132. * peer key. If the return value is <= 0, the key is rejected.
  133. * 2: Is called with |p2| == NULL to test whether the peer's key was used.
  134. * (EC)DH always return one in this case.
  135. * 3: Is called with |p2| == NULL to set whether the peer's key was used.
  136. * (EC)DH always return one in this case. This was only used for GOST. */
  137. #define EVP_PKEY_CTRL_PEER_KEY 3
  138. /* EVP_PKEY_ALG_CTRL is the base value from which key-type specific ctrl
  139. * commands are numbered. */
  140. #define EVP_PKEY_ALG_CTRL 0x1000
  141. #define EVP_PKEY_CTRL_RSA_PADDING (EVP_PKEY_ALG_CTRL + 1)
  142. #define EVP_PKEY_CTRL_GET_RSA_PADDING (EVP_PKEY_ALG_CTRL + 2)
  143. #define EVP_PKEY_CTRL_RSA_PSS_SALTLEN (EVP_PKEY_ALG_CTRL + 3)
  144. #define EVP_PKEY_CTRL_GET_RSA_PSS_SALTLEN (EVP_PKEY_ALG_CTRL + 4)
  145. #define EVP_PKEY_CTRL_RSA_KEYGEN_BITS (EVP_PKEY_ALG_CTRL + 5)
  146. #define EVP_PKEY_CTRL_RSA_KEYGEN_PUBEXP (EVP_PKEY_ALG_CTRL + 6)
  147. #define EVP_PKEY_CTRL_RSA_OAEP_MD (EVP_PKEY_ALG_CTRL + 7)
  148. #define EVP_PKEY_CTRL_GET_RSA_OAEP_MD (EVP_PKEY_ALG_CTRL + 8)
  149. #define EVP_PKEY_CTRL_RSA_MGF1_MD (EVP_PKEY_ALG_CTRL + 9)
  150. #define EVP_PKEY_CTRL_GET_RSA_MGF1_MD (EVP_PKEY_ALG_CTRL + 10)
  151. #define EVP_PKEY_CTRL_RSA_OAEP_LABEL (EVP_PKEY_ALG_CTRL + 11)
  152. #define EVP_PKEY_CTRL_GET_RSA_OAEP_LABEL (EVP_PKEY_ALG_CTRL + 12)
  153. struct evp_pkey_ctx_st {
  154. /* Method associated with this operation */
  155. const EVP_PKEY_METHOD *pmeth;
  156. /* Engine that implements this method or NULL if builtin */
  157. ENGINE *engine;
  158. /* Key: may be NULL */
  159. EVP_PKEY *pkey;
  160. /* Peer key for key agreement, may be NULL */
  161. EVP_PKEY *peerkey;
  162. /* operation contains one of the |EVP_PKEY_OP_*| values. */
  163. int operation;
  164. /* Algorithm specific data */
  165. void *data;
  166. } /* EVP_PKEY_CTX */;
  167. struct evp_pkey_method_st {
  168. int pkey_id;
  169. int (*init)(EVP_PKEY_CTX *ctx);
  170. int (*copy)(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src);
  171. void (*cleanup)(EVP_PKEY_CTX *ctx);
  172. int (*keygen)(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey);
  173. int (*sign)(EVP_PKEY_CTX *ctx, uint8_t *sig, size_t *siglen,
  174. const uint8_t *tbs, size_t tbslen);
  175. int (*verify)(EVP_PKEY_CTX *ctx, const uint8_t *sig, size_t siglen,
  176. const uint8_t *tbs, size_t tbslen);
  177. int (*verify_recover)(EVP_PKEY_CTX *ctx, uint8_t *out, size_t *out_len,
  178. const uint8_t *sig, size_t sig_len);
  179. int (*encrypt)(EVP_PKEY_CTX *ctx, uint8_t *out, size_t *outlen,
  180. const uint8_t *in, size_t inlen);
  181. int (*decrypt)(EVP_PKEY_CTX *ctx, uint8_t *out, size_t *outlen,
  182. const uint8_t *in, size_t inlen);
  183. int (*derive)(EVP_PKEY_CTX *ctx, uint8_t *key, size_t *keylen);
  184. int (*ctrl)(EVP_PKEY_CTX *ctx, int type, int p1, void *p2);
  185. } /* EVP_PKEY_METHOD */;
  186. extern const EVP_PKEY_ASN1_METHOD dsa_asn1_meth;
  187. extern const EVP_PKEY_ASN1_METHOD ec_asn1_meth;
  188. extern const EVP_PKEY_ASN1_METHOD rsa_asn1_meth;
  189. extern const EVP_PKEY_METHOD rsa_pkey_meth;
  190. extern const EVP_PKEY_METHOD ec_pkey_meth;
  191. #if defined(__cplusplus)
  192. } /* extern C */
  193. #endif
  194. #endif /* OPENSSL_HEADER_EVP_INTERNAL_H */