]>
Commit | Line | Data |
---|---|---|
2039c421 | 1 | /* |
33388b44 | 2 | * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved. |
d02b48c6 | 3 | * |
2a7b6f39 | 4 | * Licensed under the Apache License 2.0 (the "License"). You may not use |
2039c421 RS |
5 | * this file except in compliance with the License. You can obtain a copy |
6 | * in the file LICENSE in the source distribution or at | |
7 | * https://www.openssl.org/source/license.html | |
d02b48c6 RE |
8 | */ |
9 | ||
c5f87134 P |
10 | /* |
11 | * RSA low level APIs are deprecated for public use, but still ok for | |
12 | * internal use. | |
13 | */ | |
14 | #include "internal/deprecated.h" | |
15 | ||
d02b48c6 | 16 | #include <stdio.h> |
b39fc560 | 17 | #include "internal/cryptlib.h" |
ec577822 BM |
18 | #include <openssl/bn.h> |
19 | #include <openssl/rsa.h> | |
20 | #include <openssl/objects.h> | |
21 | #include <openssl/x509.h> | |
d02b48c6 | 22 | |
29c1f061 | 23 | int RSA_sign_ASN1_OCTET_STRING(int type, |
0f113f3e MC |
24 | const unsigned char *m, unsigned int m_len, |
25 | unsigned char *sigret, unsigned int *siglen, | |
26 | RSA *rsa) | |
27 | { | |
28 | ASN1_OCTET_STRING sig; | |
29 | int i, j, ret = 1; | |
30 | unsigned char *p, *s; | |
d02b48c6 | 31 | |
0f113f3e MC |
32 | sig.type = V_ASN1_OCTET_STRING; |
33 | sig.length = m_len; | |
34 | sig.data = (unsigned char *)m; | |
d02b48c6 | 35 | |
0f113f3e MC |
36 | i = i2d_ASN1_OCTET_STRING(&sig, NULL); |
37 | j = RSA_size(rsa); | |
38 | if (i > (j - RSA_PKCS1_PADDING_SIZE)) { | |
9311d0c4 | 39 | ERR_raise(ERR_LIB_RSA, RSA_R_DIGEST_TOO_BIG_FOR_RSA_KEY); |
8686c474 | 40 | return 0; |
0f113f3e | 41 | } |
b196e7d9 | 42 | s = OPENSSL_malloc((unsigned int)j + 1); |
e077455e | 43 | if (s == NULL) |
8686c474 | 44 | return 0; |
0f113f3e MC |
45 | p = s; |
46 | i2d_ASN1_OCTET_STRING(&sig, &p); | |
47 | i = RSA_private_encrypt(i, s, sigret, rsa, RSA_PKCS1_PADDING); | |
48 | if (i <= 0) | |
49 | ret = 0; | |
50 | else | |
51 | *siglen = i; | |
d02b48c6 | 52 | |
4b45c6e5 | 53 | OPENSSL_clear_free(s, (unsigned int)j + 1); |
8686c474 | 54 | return ret; |
0f113f3e | 55 | } |
d02b48c6 | 56 | |
29c1f061 | 57 | int RSA_verify_ASN1_OCTET_STRING(int dtype, |
0f113f3e MC |
58 | const unsigned char *m, |
59 | unsigned int m_len, unsigned char *sigbuf, | |
60 | unsigned int siglen, RSA *rsa) | |
61 | { | |
62 | int i, ret = 0; | |
63 | unsigned char *s; | |
64 | const unsigned char *p; | |
65 | ASN1_OCTET_STRING *sig = NULL; | |
d02b48c6 | 66 | |
0f113f3e | 67 | if (siglen != (unsigned int)RSA_size(rsa)) { |
9311d0c4 | 68 | ERR_raise(ERR_LIB_RSA, RSA_R_WRONG_SIGNATURE_LENGTH); |
8686c474 | 69 | return 0; |
0f113f3e | 70 | } |
d02b48c6 | 71 | |
b196e7d9 | 72 | s = OPENSSL_malloc((unsigned int)siglen); |
e077455e | 73 | if (s == NULL) |
0f113f3e | 74 | goto err; |
0f113f3e | 75 | i = RSA_public_decrypt((int)siglen, sigbuf, s, rsa, RSA_PKCS1_PADDING); |
d02b48c6 | 76 | |
0f113f3e MC |
77 | if (i <= 0) |
78 | goto err; | |
d02b48c6 | 79 | |
0f113f3e MC |
80 | p = s; |
81 | sig = d2i_ASN1_OCTET_STRING(NULL, &p, (long)i); | |
82 | if (sig == NULL) | |
83 | goto err; | |
d02b48c6 | 84 | |
0f113f3e MC |
85 | if (((unsigned int)sig->length != m_len) || |
86 | (memcmp(m, sig->data, m_len) != 0)) { | |
9311d0c4 | 87 | ERR_raise(ERR_LIB_RSA, RSA_R_BAD_SIGNATURE); |
90862ab4 | 88 | } else { |
0f113f3e | 89 | ret = 1; |
90862ab4 | 90 | } |
0f113f3e | 91 | err: |
0dfb9398 | 92 | ASN1_OCTET_STRING_free(sig); |
4b45c6e5 | 93 | OPENSSL_clear_free(s, (unsigned int)siglen); |
8686c474 | 94 | return ret; |
0f113f3e | 95 | } |