25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.
 
 
 
 
 
 

151 satır
5.3 KiB

  1. /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
  2. * project 2000. */
  3. /* ====================================================================
  4. * Copyright (c) 2000-2005 The OpenSSL Project. All rights reserved.
  5. *
  6. * Redistribution and use in source and binary forms, with or without
  7. * modification, are permitted provided that the following conditions
  8. * are met:
  9. *
  10. * 1. Redistributions of source code must retain the above copyright
  11. * notice, this list of conditions and the following disclaimer.
  12. *
  13. * 2. Redistributions in binary form must reproduce the above copyright
  14. * notice, this list of conditions and the following disclaimer in
  15. * the documentation and/or other materials provided with the
  16. * distribution.
  17. *
  18. * 3. All advertising materials mentioning features or use of this
  19. * software must display the following acknowledgment:
  20. * "This product includes software developed by the OpenSSL Project
  21. * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
  22. *
  23. * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
  24. * endorse or promote products derived from this software without
  25. * prior written permission. For written permission, please contact
  26. * licensing@OpenSSL.org.
  27. *
  28. * 5. Products derived from this software may not be called "OpenSSL"
  29. * nor may "OpenSSL" appear in their names without prior written
  30. * permission of the OpenSSL Project.
  31. *
  32. * 6. Redistributions of any form whatsoever must retain the following
  33. * acknowledgment:
  34. * "This product includes software developed by the OpenSSL Project
  35. * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
  36. *
  37. * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
  38. * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  39. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  40. * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
  41. * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  42. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  43. * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  44. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  45. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  46. * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  47. * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
  48. * OF THE POSSIBILITY OF SUCH DAMAGE.
  49. * ====================================================================
  50. *
  51. * This product includes cryptographic software written by Eric Young
  52. * (eay@cryptsoft.com). This product includes software written by Tim
  53. * Hudson (tjh@cryptsoft.com). */
  54. #include <openssl/dsa.h>
  55. #include <string.h>
  56. #include <openssl/asn1.h>
  57. #include <openssl/asn1t.h>
  58. #include <openssl/err.h>
  59. #include <openssl/mem.h>
  60. #include "internal.h"
  61. static int dsa_sig_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it,
  62. void *exarg) {
  63. if (operation != ASN1_OP_NEW_PRE) {
  64. return 1;
  65. }
  66. DSA_SIG *sig;
  67. sig = OPENSSL_malloc(sizeof(DSA_SIG));
  68. if (!sig) {
  69. OPENSSL_PUT_ERROR(DSA, ERR_R_MALLOC_FAILURE);
  70. return 0;
  71. }
  72. memset(sig, 0, sizeof(DSA_SIG));
  73. *pval = (ASN1_VALUE *)sig;
  74. return 2;
  75. }
  76. ASN1_SEQUENCE_cb(DSA_SIG, dsa_sig_cb) = {
  77. ASN1_SIMPLE(DSA_SIG, r, CBIGNUM),
  78. ASN1_SIMPLE(DSA_SIG, s, CBIGNUM)} ASN1_SEQUENCE_END_cb(DSA_SIG, DSA_SIG);
  79. IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(DSA_SIG, DSA_SIG, DSA_SIG);
  80. static int dsa_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it,
  81. void *exarg) {
  82. switch (operation) {
  83. case ASN1_OP_NEW_PRE:
  84. *pval = (ASN1_VALUE *)DSA_new();
  85. if (*pval) {
  86. return 2;
  87. }
  88. return 0;
  89. case ASN1_OP_FREE_PRE:
  90. DSA_free((DSA *)*pval);
  91. *pval = NULL;
  92. return 2;
  93. default:
  94. return 1;
  95. }
  96. }
  97. ASN1_SEQUENCE_cb(DSAPrivateKey, dsa_cb) = {
  98. ASN1_SIMPLE(DSA, version, LONG),
  99. ASN1_SIMPLE(DSA, p, BIGNUM),
  100. ASN1_SIMPLE(DSA, q, BIGNUM),
  101. ASN1_SIMPLE(DSA, g, BIGNUM),
  102. ASN1_SIMPLE(DSA, pub_key, BIGNUM),
  103. ASN1_SIMPLE(DSA, priv_key, BIGNUM)} ASN1_SEQUENCE_END_cb(DSA,
  104. DSAPrivateKey);
  105. IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(DSA, DSAPrivateKey, DSAPrivateKey);
  106. ASN1_SEQUENCE_cb(DSAparams, dsa_cb) = {
  107. ASN1_SIMPLE(DSA, p, BIGNUM), ASN1_SIMPLE(DSA, q, BIGNUM),
  108. ASN1_SIMPLE(DSA, g, BIGNUM), } ASN1_SEQUENCE_END_cb(DSA, DSAparams);
  109. IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(DSA, DSAparams, DSAparams);
  110. /* DSA public key is a bit trickier... its effectively a CHOICE type decided by
  111. * a field called write_params which can either write out just the public key
  112. * as an INTEGER or the parameters and public key in a SEQUENCE. */
  113. ASN1_SEQUENCE(dsa_pub_internal) = {
  114. ASN1_SIMPLE(DSA, pub_key, BIGNUM),
  115. ASN1_SIMPLE(DSA, p, BIGNUM),
  116. ASN1_SIMPLE(DSA, q, BIGNUM),
  117. ASN1_SIMPLE(DSA, g, BIGNUM)
  118. } ASN1_SEQUENCE_END_name(DSA, dsa_pub_internal);
  119. ASN1_CHOICE_cb(DSAPublicKey, dsa_cb) = {
  120. ASN1_SIMPLE(DSA, pub_key, BIGNUM),
  121. ASN1_EX_COMBINE(0, 0, dsa_pub_internal)
  122. } ASN1_CHOICE_END_cb(DSA, DSAPublicKey, write_params);
  123. IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(DSA, DSAPublicKey, DSAPublicKey);
  124. DSA *DSAparams_dup(const DSA *dsa) {
  125. return ASN1_item_dup(ASN1_ITEM_rptr(DSAparams), (DSA*) dsa);
  126. }