Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(49)

Side by Side Diff: openssl/crypto/evp/evp_aead.c

Issue 59083010: third_party/openssl: add ChaCha20+Poly1305 support. Base URL: https://chromium.googlesource.com/chromium/deps/openssl.git@master
Patch Set: Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « openssl/crypto/evp/evp.h ('k') | openssl/crypto/evp/evp_err.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* crypto/x509/x509_set.c */
2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 1 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 2 * All rights reserved.
4 * 3 *
5 * This package is an SSL implementation written 4 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com). 5 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL. 6 * The implementation was written so as to conform with Netscapes SSL.
8 * 7 *
9 * This library is free for commercial and non-commercial use as long as 8 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions 9 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA, 10 * apply to all code found in this distribution, be it the RC4, RSA,
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 48 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 49 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51 * SUCH DAMAGE. 50 * SUCH DAMAGE.
52 * 51 *
53 * The licence and distribution terms for any publically available version or 52 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be 53 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence 54 * copied and put under another distribution licence
56 * [including the GNU Public Licence.] 55 * [including the GNU Public Licence.]
57 */ 56 */
58 57
59 #include <stdio.h> 58 #include <limits.h>
60 #include "cryptlib.h" 59 #include <string.h>
61 #include <openssl/asn1.h> 60
62 #include <openssl/objects.h>
63 #include <openssl/evp.h> 61 #include <openssl/evp.h>
64 #include <openssl/x509.h> 62 #include <openssl/err.h>
65 63
66 int X509_set_version(X509 *x, long version) 64 #include "evp_locl.h"
65
66 size_t EVP_AEAD_key_length(const EVP_AEAD *aead)
67 { 67 {
68 » if (x == NULL) return(0); 68 » return aead->key_len;
69 » if (x->cert_info->version == NULL)
70 » » {
71 » » if ((x->cert_info->version=M_ASN1_INTEGER_new()) == NULL)
72 » » » return(0);
73 » » }
74 » return(ASN1_INTEGER_set(x->cert_info->version,version));
75 } 69 }
76 70
77 int X509_set_serialNumber(X509 *x, ASN1_INTEGER *serial) 71 size_t EVP_AEAD_nonce_length(const EVP_AEAD *aead)
78 { 72 {
79 » ASN1_INTEGER *in; 73 » return aead->nonce_len;
80
81 » if (x == NULL) return(0);
82 » in=x->cert_info->serialNumber;
83 » if (in != serial)
84 » » {
85 » » in=M_ASN1_INTEGER_dup(serial);
86 » » if (in != NULL)
87 » » » {
88 » » » M_ASN1_INTEGER_free(x->cert_info->serialNumber);
89 » » » x->cert_info->serialNumber=in;
90 » » » }
91 » » }
92 » return(in != NULL);
93 } 74 }
94 75
95 int X509_set_issuer_name(X509 *x, X509_NAME *name) 76 size_t EVP_AEAD_max_overhead(const EVP_AEAD *aead)
96 { 77 {
97 » if ((x == NULL) || (x->cert_info == NULL)) return(0); 78 » return aead->overhead;
98 » return(X509_NAME_set(&x->cert_info->issuer,name));
99 } 79 }
100 80
101 int X509_set_subject_name(X509 *x, X509_NAME *name) 81 size_t EVP_AEAD_max_tag_len(const EVP_AEAD *aead)
102 { 82 {
103 » if ((x == NULL) || (x->cert_info == NULL)) return(0); 83 » return aead->max_tag_len;
104 » return(X509_NAME_set(&x->cert_info->subject,name));
105 } 84 }
106 85
107 int X509_set_notBefore(X509 *x, const ASN1_TIME *tm) 86 int EVP_AEAD_CTX_init(EVP_AEAD_CTX *ctx, const EVP_AEAD *aead,
87 » » const unsigned char *key, size_t key_len,
88 » » size_t tag_len, ENGINE *impl)
108 { 89 {
109 » ASN1_TIME *in; 90 » ctx->aead = aead;
110 91 » if (key_len != aead->key_len)
111 » if ((x == NULL) || (x->cert_info->validity == NULL)) return(0);
112 » in=x->cert_info->validity->notBefore;
113 » if (in != tm)
114 { 92 {
115 » » in=M_ASN1_TIME_dup(tm); 93 » » EVPerr(EVP_F_EVP_AEAD_CTX_INIT,EVP_R_UNSUPPORTED_KEY_SIZE);
116 » » if (in != NULL) 94 » » return 0;
117 » » » {
118 » » » M_ASN1_TIME_free(x->cert_info->validity->notBefore);
119 » » » x->cert_info->validity->notBefore=in;
120 » » » }
121 } 95 }
122 » return(in != NULL); 96 » return aead->init(ctx, key, key_len, tag_len);
123 } 97 }
124 98
125 int X509_set_notAfter(X509 *x, const ASN1_TIME *tm) 99 void EVP_AEAD_CTX_cleanup(EVP_AEAD_CTX *ctx)
126 { 100 {
127 » ASN1_TIME *in; 101 » if (ctx->aead == NULL)
128 102 » » return;
129 » if ((x == NULL) || (x->cert_info->validity == NULL)) return(0); 103 » ctx->aead->cleanup(ctx);
130 » in=x->cert_info->validity->notAfter; 104 » ctx->aead = NULL;
131 » if (in != tm)
132 » » {
133 » » in=M_ASN1_TIME_dup(tm);
134 » » if (in != NULL)
135 » » » {
136 » » » M_ASN1_TIME_free(x->cert_info->validity->notAfter);
137 » » » x->cert_info->validity->notAfter=in;
138 » » » }
139 » » }
140 » return(in != NULL);
141 } 105 }
142 106
143 int X509_set_pubkey(X509 *x, EVP_PKEY *pkey) 107 /* check_alias returns 0 if |out| points within the buffer determined by |in|
108 * and |in_len| and 1 otherwise.
109 *
110 * When processing, there's only an issue if |out| points within in[:in_len]
111 * and isn't equal to |in|. If that's the case then writing the output will
112 * stomp input that hasn't been read yet.
113 *
114 * This function checks for that case. */
115 static int check_alias(const unsigned char *in, size_t in_len,
116 » » const unsigned char *out)
144 { 117 {
145 » if ((x == NULL) || (x->cert_info == NULL)) return(0); 118 » if (out <= in)
146 » return(X509_PUBKEY_set(&(x->cert_info->key),pkey)); 119 » » return 1;
120 » if (in + in_len <= out)
121 » » return 1;
122 » return 0;
147 } 123 }
148 124
125 ssize_t EVP_AEAD_CTX_seal(const EVP_AEAD_CTX *ctx,
126 unsigned char *out, size_t max_out_len,
127 const unsigned char *nonce, size_t nonce_len,
128 const unsigned char *in, size_t in_len,
129 const unsigned char *ad, size_t ad_len)
130 {
131 size_t possible_out_len = in_len + ctx->aead->overhead;
132 ssize_t r;
149 133
134 if (possible_out_len < in_len /* overflow */ ||
135 possible_out_len > SSIZE_MAX /* return value cannot be
136 represented */)
137 {
138 EVPerr(EVP_F_AEAD_CTX_SEAL, EVP_R_TOO_LARGE);
139 goto error;
140 }
150 141
142 if (!check_alias(in, in_len, out))
143 {
144 EVPerr(EVP_F_AEAD_CTX_SEAL, EVP_R_OUTPUT_ALIASES_INPUT);
145 goto error;
146 }
147
148 r = ctx->aead->seal(ctx, out, max_out_len, nonce, nonce_len,
149 in, in_len, ad, ad_len);
150 if (r >= 0)
151 return r;
152
153 error:
154 /* In the event of an error, clear the output buffer so that a caller
155 * that doesn't check the return value doesn't send raw data. */
156 memset(out, 0, max_out_len);
157 return -1;
158 }
159
160 ssize_t EVP_AEAD_CTX_open(const EVP_AEAD_CTX *ctx,
161 unsigned char *out, size_t max_out_len,
162 const unsigned char *nonce, size_t nonce_len,
163 const unsigned char *in, size_t in_len,
164 const unsigned char *ad, size_t ad_len)
165 {
166 ssize_t r;
167
168 if (in_len > SSIZE_MAX)
169 {
170 EVPerr(EVP_F_AEAD_CTX_OPEN, EVP_R_TOO_LARGE);
171 goto error; /* may not be able to represent return value. */
172 }
173
174 if (!check_alias(in, in_len, out))
175 {
176 EVPerr(EVP_F_AEAD_CTX_OPEN, EVP_R_OUTPUT_ALIASES_INPUT);
177 goto error;
178 }
179
180 r = ctx->aead->open(ctx, out, max_out_len, nonce, nonce_len,
181 in, in_len, ad, ad_len);
182
183 if (r >= 0)
184 return r;
185
186 error:
187 /* In the event of an error, clear the output buffer so that a caller
188 * that doesn't check the return value doesn't try and process bad
189 * data. */
190 memset(out, 0, max_out_len);
191 return -1;
192 }
OLDNEW
« no previous file with comments | « openssl/crypto/evp/evp.h ('k') | openssl/crypto/evp/evp_err.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698