1e71b7053SJung-uk Kim /*
2b077aed3SPierre Pronchery * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved.
397b2ed56SKris Kennaway *
4b077aed3SPierre Pronchery * Licensed under the Apache License 2.0 (the "License"). You may not use
5e71b7053SJung-uk Kim * this file except in compliance with the License. You can obtain a copy
6e71b7053SJung-uk Kim * in the file LICENSE in the source distribution or at
7e71b7053SJung-uk Kim * https://www.openssl.org/source/license.html
897b2ed56SKris Kennaway */
997b2ed56SKris Kennaway
10b077aed3SPierre Pronchery /*
11b077aed3SPierre Pronchery * RSA low level APIs are deprecated for public use, but still ok for
12b077aed3SPierre Pronchery * internal use.
13b077aed3SPierre Pronchery */
14b077aed3SPierre Pronchery #include "internal/deprecated.h"
15b077aed3SPierre Pronchery
1697b2ed56SKris Kennaway #include <stdio.h>
17e71b7053SJung-uk Kim #include "internal/cryptlib.h"
1897b2ed56SKris Kennaway #include <openssl/bn.h>
1997b2ed56SKris Kennaway #include <openssl/rsa.h>
2097b2ed56SKris Kennaway #include <openssl/objects.h>
2197b2ed56SKris Kennaway #include <openssl/x509.h>
2297b2ed56SKris Kennaway
RSA_sign_ASN1_OCTET_STRING(int type,const unsigned char * m,unsigned int m_len,unsigned char * sigret,unsigned int * siglen,RSA * rsa)235c87c606SMark Murray int RSA_sign_ASN1_OCTET_STRING(int type,
245c87c606SMark Murray const unsigned char *m, unsigned int m_len,
256f9291ceSJung-uk Kim unsigned char *sigret, unsigned int *siglen,
266f9291ceSJung-uk Kim RSA *rsa)
2797b2ed56SKris Kennaway {
2897b2ed56SKris Kennaway ASN1_OCTET_STRING sig;
2997b2ed56SKris Kennaway int i, j, ret = 1;
3097b2ed56SKris Kennaway unsigned char *p, *s;
3197b2ed56SKris Kennaway
3297b2ed56SKris Kennaway sig.type = V_ASN1_OCTET_STRING;
3397b2ed56SKris Kennaway sig.length = m_len;
345c87c606SMark Murray sig.data = (unsigned char *)m;
3597b2ed56SKris Kennaway
3697b2ed56SKris Kennaway i = i2d_ASN1_OCTET_STRING(&sig, NULL);
3797b2ed56SKris Kennaway j = RSA_size(rsa);
386f9291ceSJung-uk Kim if (i > (j - RSA_PKCS1_PADDING_SIZE)) {
39b077aed3SPierre Pronchery ERR_raise(ERR_LIB_RSA, RSA_R_DIGEST_TOO_BIG_FOR_RSA_KEY);
40e71b7053SJung-uk Kim return 0;
4197b2ed56SKris Kennaway }
42e71b7053SJung-uk Kim s = OPENSSL_malloc((unsigned int)j + 1);
436f9291ceSJung-uk Kim if (s == NULL) {
44b077aed3SPierre Pronchery ERR_raise(ERR_LIB_RSA, ERR_R_MALLOC_FAILURE);
45e71b7053SJung-uk Kim return 0;
4697b2ed56SKris Kennaway }
4797b2ed56SKris Kennaway p = s;
4897b2ed56SKris Kennaway i2d_ASN1_OCTET_STRING(&sig, &p);
4997b2ed56SKris Kennaway i = RSA_private_encrypt(i, s, sigret, rsa, RSA_PKCS1_PADDING);
5097b2ed56SKris Kennaway if (i <= 0)
5197b2ed56SKris Kennaway ret = 0;
5297b2ed56SKris Kennaway else
5397b2ed56SKris Kennaway *siglen = i;
5497b2ed56SKris Kennaway
55e71b7053SJung-uk Kim OPENSSL_clear_free(s, (unsigned int)j + 1);
56e71b7053SJung-uk Kim return ret;
5797b2ed56SKris Kennaway }
5897b2ed56SKris Kennaway
RSA_verify_ASN1_OCTET_STRING(int dtype,const unsigned char * m,unsigned int m_len,unsigned char * sigbuf,unsigned int siglen,RSA * rsa)595c87c606SMark Murray int RSA_verify_ASN1_OCTET_STRING(int dtype,
605c87c606SMark Murray const unsigned char *m,
616f9291ceSJung-uk Kim unsigned int m_len, unsigned char *sigbuf,
626f9291ceSJung-uk Kim unsigned int siglen, RSA *rsa)
6397b2ed56SKris Kennaway {
6497b2ed56SKris Kennaway int i, ret = 0;
653b4e3dcbSSimon L. B. Nielsen unsigned char *s;
663b4e3dcbSSimon L. B. Nielsen const unsigned char *p;
6797b2ed56SKris Kennaway ASN1_OCTET_STRING *sig = NULL;
6897b2ed56SKris Kennaway
696f9291ceSJung-uk Kim if (siglen != (unsigned int)RSA_size(rsa)) {
70b077aed3SPierre Pronchery ERR_raise(ERR_LIB_RSA, RSA_R_WRONG_SIGNATURE_LENGTH);
71e71b7053SJung-uk Kim return 0;
7297b2ed56SKris Kennaway }
7397b2ed56SKris Kennaway
74e71b7053SJung-uk Kim s = OPENSSL_malloc((unsigned int)siglen);
756f9291ceSJung-uk Kim if (s == NULL) {
76b077aed3SPierre Pronchery ERR_raise(ERR_LIB_RSA, ERR_R_MALLOC_FAILURE);
7797b2ed56SKris Kennaway goto err;
7897b2ed56SKris Kennaway }
7997b2ed56SKris Kennaway i = RSA_public_decrypt((int)siglen, sigbuf, s, rsa, RSA_PKCS1_PADDING);
8097b2ed56SKris Kennaway
816f9291ceSJung-uk Kim if (i <= 0)
826f9291ceSJung-uk Kim goto err;
8397b2ed56SKris Kennaway
8497b2ed56SKris Kennaway p = s;
8597b2ed56SKris Kennaway sig = d2i_ASN1_OCTET_STRING(NULL, &p, (long)i);
866f9291ceSJung-uk Kim if (sig == NULL)
876f9291ceSJung-uk Kim goto err;
8897b2ed56SKris Kennaway
8997b2ed56SKris Kennaway if (((unsigned int)sig->length != m_len) ||
906f9291ceSJung-uk Kim (memcmp(m, sig->data, m_len) != 0)) {
91b077aed3SPierre Pronchery ERR_raise(ERR_LIB_RSA, RSA_R_BAD_SIGNATURE);
92e71b7053SJung-uk Kim } else {
9397b2ed56SKris Kennaway ret = 1;
943b4e3dcbSSimon L. B. Nielsen }
95e71b7053SJung-uk Kim err:
96e71b7053SJung-uk Kim ASN1_OCTET_STRING_free(sig);
97e71b7053SJung-uk Kim OPENSSL_clear_free(s, (unsigned int)siglen);
98e71b7053SJung-uk Kim return ret;
9997b2ed56SKris Kennaway }
100