~ubuntu-branches/ubuntu/raring/gnutls26/raring

« back to all changes in this revision

Viewing changes to lib/auth_dhe.c

  • Committer: Bazaar Package Importer
  • Author(s): Steve Langasek
  • Date: 2011-05-20 13:07:18 UTC
  • mfrom: (12.1.11 sid)
  • Revision ID: james.westby@ubuntu.com-20110520130718-db41dybbanzfvlji
Tags: 2.10.5-1ubuntu1
* Merge from Debian unstable, remaining changes:
  - Fix build failure with --no-add-needed.
  - Build for multiarch.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/*
2
 
 * Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2009 Free Software Foundation
 
2
 * Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2009, 2010
 
3
 * Free Software Foundation, Inc.
3
4
 *
4
5
 * Author: Nikos Mavrogiannopoulos
5
6
 *
6
 
 * This file is part of GNUTLS.
 
7
 * This file is part of GnuTLS.
7
8
 *
8
 
 * The GNUTLS library is free software; you can redistribute it and/or
 
9
 * The GnuTLS is free software; you can redistribute it and/or
9
10
 * modify it under the terms of the GNU Lesser General Public License
10
11
 * as published by the Free Software Foundation; either version 2.1 of
11
12
 * the License, or (at your option) any later version.
34
35
#include "gnutls_num.h"
35
36
#include "gnutls_sig.h"
36
37
#include <gnutls_datum.h>
 
38
#include <gnutls_algorithms.h>
37
39
#include <auth_cert.h>
38
40
#include <gnutls_x509.h>
39
41
#include <gnutls_state.h>
90
92
  gnutls_datum_t signature, ddata;
91
93
  gnutls_certificate_credentials_t cred;
92
94
  gnutls_dh_params_t dh_params;
 
95
  gnutls_sign_algorithm_t sign_algo;
 
96
  gnutls_protocol_t ver = gnutls_protocol_get_version (session);
93
97
 
94
98
  cred = (gnutls_certificate_credentials_t)
95
99
    _gnutls_get_cred (session->key, GNUTLS_CRD_CERTIFICATE, NULL);
145
149
  if (apr_cert_list_length > 0)
146
150
    {
147
151
      if ((ret =
148
 
           _gnutls_tls_sign_params (session, &apr_cert_list[0],
149
 
                                    apr_pkey, &ddata, &signature)) < 0)
 
152
           _gnutls_handshake_sign_data (session, &apr_cert_list[0],
 
153
                                        apr_pkey, &ddata, &signature,
 
154
                                        &sign_algo)) < 0)
150
155
        {
151
156
          gnutls_assert ();
152
157
          gnutls_free (*data);
159
164
      return data_size;         /* do not put a signature - ILLEGAL! */
160
165
    }
161
166
 
162
 
  *data = gnutls_realloc_fast (*data, data_size + signature.size + 2);
 
167
  *data = gnutls_realloc_fast (*data, data_size + signature.size + 4);
163
168
  if (*data == NULL)
164
169
    {
165
170
      _gnutls_free_datum (&signature);
167
172
      return GNUTLS_E_MEMORY_ERROR;
168
173
    }
169
174
 
 
175
  if (_gnutls_version_has_selectable_sighash (ver))
 
176
    {
 
177
      sign_algorithm_st aid;
 
178
 
 
179
      if (sign_algo == GNUTLS_SIGN_UNKNOWN)
 
180
        {
 
181
          _gnutls_free_datum (&signature);
 
182
          gnutls_assert ();
 
183
          return GNUTLS_E_UNKNOWN_PK_ALGORITHM;
 
184
        }
 
185
 
 
186
      aid = _gnutls_sign_to_tls_aid (sign_algo);
 
187
      (*data)[data_size++] = aid.hash_algorithm;
 
188
      (*data)[data_size++] = aid.sign_algorithm;
 
189
    }
 
190
 
170
191
  _gnutls_write_datum16 (&(*data)[data_size], signature);
171
192
  data_size += signature.size + 2;
172
193
 
180
201
                    size_t _data_size)
181
202
{
182
203
  int sigsize;
 
204
  opaque *sigdata;
183
205
  gnutls_datum_t vparams, signature;
184
206
  int ret;
185
207
  cert_auth_info_t info = _gnutls_get_auth_info (session);
186
208
  ssize_t data_size = _data_size;
187
209
  gnutls_cert peer_cert;
 
210
  gnutls_sign_algorithm_t sign_algo = GNUTLS_SIGN_UNKNOWN;
 
211
  gnutls_protocol_t ver = gnutls_protocol_get_version (session);
188
212
 
189
213
  if (info == NULL || info->ncerts == 0)
190
214
    {
205
229
  vparams.size = ret;
206
230
  vparams.data = data;
207
231
 
 
232
  sigdata = &data[vparams.size];
 
233
  if (_gnutls_version_has_selectable_sighash (ver))
 
234
    {
 
235
      sign_algorithm_st aid;
 
236
 
 
237
      DECR_LEN (data_size, 1);
 
238
      aid.hash_algorithm = *sigdata++;
 
239
      DECR_LEN (data_size, 1);
 
240
      aid.sign_algorithm = *sigdata++;
 
241
      sign_algo = _gnutls_tls_aid_to_sign (&aid);
 
242
      if (sign_algo == GNUTLS_SIGN_UNKNOWN)
 
243
        {
 
244
          gnutls_assert ();
 
245
          return GNUTLS_E_UNSUPPORTED_SIGNATURE_ALGORITHM;
 
246
        }
 
247
    }
208
248
  DECR_LEN (data_size, 2);
209
 
  sigsize = _gnutls_read_uint16 (&data[vparams.size]);
 
249
  sigsize = _gnutls_read_uint16 (sigdata);
 
250
  sigdata += 2;
210
251
 
211
252
  DECR_LEN (data_size, sigsize);
212
 
  signature.data = &data[vparams.size + 2];
 
253
  signature.data = sigdata;
213
254
  signature.size = sigsize;
214
255
 
215
256
  if ((ret =
221
262
      return ret;
222
263
    }
223
264
 
224
 
  ret = _gnutls_verify_sig_params (session, &peer_cert, &vparams, &signature);
 
265
  ret =
 
266
    _gnutls_handshake_verify_data (session, &peer_cert, &vparams, &signature,
 
267
                                   sign_algo);
225
268
 
226
269
  _gnutls_gcert_deinit (&peer_cert);
227
270
  if (ret < 0)