xref: /freebsd/crypto/openssl/crypto/rsa/rsa_saos.c (revision b077aed3)
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