/*
 * Copyright 1999-2016 The OpenSSL Project Authors. All Rights Reserved.
 *
 * Licensed under the OpenSSL license (the "License").  You may not use
 * this file except in compliance with the License.  You can obtain a copy
 * in the file LICENSE in the source distribution or at
 * https://www.openssl.org/source/license.html
 */

#include <stdio.h>
#include "internal/cryptlib.h"
#include <openssl/bn.h>
#include <openssl/rand.h>
#include "rsa_locl.h"

/*
 * This is a dummy RSA implementation that just returns errors when called.
 * It is designed to allow some RSA functions to work while stopping those
 * covered by the RSA patent. That is RSA, encryption, decryption, signing
 * and verify is not allowed but RSA key generation, key checking and other
 * operations (like storing RSA keys) are permitted.
 */

static int RSA_null_public_encrypt(int flen, const unsigned char *from,
                                   unsigned char *to, RSA *rsa, int padding);
static int RSA_null_private_encrypt(int flen, const unsigned char *from,
                                    unsigned char *to, RSA *rsa, int padding);
static int RSA_null_public_decrypt(int flen, const unsigned char *from,
                                   unsigned char *to, RSA *rsa, int padding);
static int RSA_null_private_decrypt(int flen, const unsigned char *from,
                                    unsigned char *to, RSA *rsa, int padding);
static int RSA_null_init(RSA *rsa);
static int RSA_null_finish(RSA *rsa);
static RSA_METHOD rsa_null_meth = {
    "Null RSA",
    RSA_null_public_encrypt,
    RSA_null_public_decrypt,
    RSA_null_private_encrypt,
    RSA_null_private_decrypt,
    NULL,
    NULL,
    RSA_null_init,
    RSA_null_finish,
    0,
    NULL,
    NULL,
    NULL,
    NULL
};

const RSA_METHOD *RSA_null_method(void)
{
    return (&rsa_null_meth);
}

static int RSA_null_public_encrypt(int flen, const unsigned char *from,
                                   unsigned char *to, RSA *rsa, int padding)
{
    RSAerr(RSA_F_RSA_NULL_PUBLIC_ENCRYPT, RSA_R_RSA_OPERATIONS_NOT_SUPPORTED);
    return -1;
}

static int RSA_null_private_encrypt(int flen, const unsigned char *from,
                                    unsigned char *to, RSA *rsa, int padding)
{
    RSAerr(RSA_F_RSA_NULL_PRIVATE_ENCRYPT,
           RSA_R_RSA_OPERATIONS_NOT_SUPPORTED);
    return -1;
}

static int RSA_null_private_decrypt(int flen, const unsigned char *from,
                                    unsigned char *to, RSA *rsa, int padding)
{
    RSAerr(RSA_F_RSA_NULL_PRIVATE_DECRYPT,
           RSA_R_RSA_OPERATIONS_NOT_SUPPORTED);
    return -1;
}

static int RSA_null_public_decrypt(int flen, const unsigned char *from,
                                   unsigned char *to, RSA *rsa, int padding)
{
    RSAerr(RSA_F_RSA_NULL_PUBLIC_DECRYPT, RSA_R_RSA_OPERATIONS_NOT_SUPPORTED);
    return -1;
}

static int RSA_null_init(RSA *rsa)
{
    return (1);
}

static int RSA_null_finish(RSA *rsa)
{
    return (1);
}
