Home | History | Annotate | Download | only in rsa
      1 /* Written by Dr Stephen N Henson (steve (at) openssl.org) for the OpenSSL
      2  * project 2000.
      3  */
      4 /* ====================================================================
      5  * Copyright (c) 2000-2005 The OpenSSL Project.  All rights reserved.
      6  *
      7  * Redistribution and use in source and binary forms, with or without
      8  * modification, are permitted provided that the following conditions
      9  * are met:
     10  *
     11  * 1. Redistributions of source code must retain the above copyright
     12  *    notice, this list of conditions and the following disclaimer.
     13  *
     14  * 2. Redistributions in binary form must reproduce the above copyright
     15  *    notice, this list of conditions and the following disclaimer in
     16  *    the documentation and/or other materials provided with the
     17  *    distribution.
     18  *
     19  * 3. All advertising materials mentioning features or use of this
     20  *    software must display the following acknowledgment:
     21  *    "This product includes software developed by the OpenSSL Project
     22  *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
     23  *
     24  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
     25  *    endorse or promote products derived from this software without
     26  *    prior written permission. For written permission, please contact
     27  *    licensing (at) OpenSSL.org.
     28  *
     29  * 5. Products derived from this software may not be called "OpenSSL"
     30  *    nor may "OpenSSL" appear in their names without prior written
     31  *    permission of the OpenSSL Project.
     32  *
     33  * 6. Redistributions of any form whatsoever must retain the following
     34  *    acknowledgment:
     35  *    "This product includes software developed by the OpenSSL Project
     36  *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
     37  *
     38  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
     39  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     40  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     41  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
     42  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     43  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     44  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     45  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     46  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     47  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     48  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
     49  * OF THE POSSIBILITY OF SUCH DAMAGE.
     50  * ====================================================================
     51  *
     52  * This product includes cryptographic software written by Eric Young
     53  * (eay (at) cryptsoft.com).  This product includes software written by Tim
     54  * Hudson (tjh (at) cryptsoft.com). */
     55 
     56 #include <openssl/rsa.h>
     57 
     58 #include <openssl/asn1.h>
     59 #include <openssl/asn1t.h>
     60 
     61 #include "internal.h"
     62 
     63 
     64 /* Override the default free and new methods */
     65 static int rsa_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it,
     66                   void *exarg) {
     67   if (operation == ASN1_OP_NEW_PRE) {
     68     *pval = (ASN1_VALUE *)RSA_new();
     69     if (*pval) {
     70       return 2;
     71     }
     72     return 0;
     73   } else if (operation == ASN1_OP_FREE_PRE) {
     74     RSA_free((RSA *)*pval);
     75     *pval = NULL;
     76     return 2;
     77   }
     78   return 1;
     79 }
     80 
     81 ASN1_SEQUENCE_cb(RSAPrivateKey, rsa_cb) = {
     82   ASN1_SIMPLE(RSA, version, LONG),
     83   ASN1_SIMPLE(RSA, n, BIGNUM),
     84   ASN1_SIMPLE(RSA, e, BIGNUM),
     85   ASN1_SIMPLE(RSA, d, BIGNUM),
     86   ASN1_SIMPLE(RSA, p, BIGNUM),
     87   ASN1_SIMPLE(RSA, q, BIGNUM),
     88   ASN1_SIMPLE(RSA, dmp1, BIGNUM),
     89   ASN1_SIMPLE(RSA, dmq1, BIGNUM),
     90   ASN1_SIMPLE(RSA, iqmp, BIGNUM),
     91 } ASN1_SEQUENCE_END_cb(RSA, RSAPrivateKey);
     92 
     93 ASN1_SEQUENCE_cb(RSAPublicKey, rsa_cb) = {
     94     ASN1_SIMPLE(RSA, n, BIGNUM),
     95     ASN1_SIMPLE(RSA, e, BIGNUM),
     96 } ASN1_SEQUENCE_END_cb(RSA, RSAPublicKey);
     97 
     98 ASN1_SEQUENCE(RSA_PSS_PARAMS) = {
     99   ASN1_EXP_OPT(RSA_PSS_PARAMS, hashAlgorithm, X509_ALGOR,0),
    100   ASN1_EXP_OPT(RSA_PSS_PARAMS, maskGenAlgorithm, X509_ALGOR,1),
    101   ASN1_EXP_OPT(RSA_PSS_PARAMS, saltLength, ASN1_INTEGER,2),
    102   ASN1_EXP_OPT(RSA_PSS_PARAMS, trailerField, ASN1_INTEGER,3),
    103 } ASN1_SEQUENCE_END(RSA_PSS_PARAMS);
    104 
    105 IMPLEMENT_ASN1_FUNCTIONS(RSA_PSS_PARAMS);
    106 
    107 ASN1_SEQUENCE(RSA_OAEP_PARAMS) = {
    108   ASN1_EXP_OPT(RSA_OAEP_PARAMS, hashFunc, X509_ALGOR, 0),
    109   ASN1_EXP_OPT(RSA_OAEP_PARAMS, maskGenFunc, X509_ALGOR, 1),
    110   ASN1_EXP_OPT(RSA_OAEP_PARAMS, pSourceFunc, X509_ALGOR, 2),
    111 } ASN1_SEQUENCE_END(RSA_OAEP_PARAMS);
    112 
    113 IMPLEMENT_ASN1_FUNCTIONS(RSA_OAEP_PARAMS);
    114 
    115 IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(RSA, RSAPrivateKey, RSAPrivateKey);
    116 
    117 IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(RSA, RSAPublicKey, RSAPublicKey);
    118 
    119 RSA *RSAPublicKey_dup(const RSA *rsa) {
    120   return ASN1_item_dup(ASN1_ITEM_rptr(RSAPublicKey), (RSA *) rsa);
    121 }
    122 
    123 RSA *RSAPrivateKey_dup(const RSA *rsa) {
    124   return ASN1_item_dup(ASN1_ITEM_rptr(RSAPrivateKey), (RSA *) rsa);
    125 }
    126