Coverage Report

Created: 2025-04-24 06:18

/src/hostap/src/tls/tlsv1_common.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * TLSv1 common routines
3
 * Copyright (c) 2006-2014, Jouni Malinen <j@w1.fi>
4
 *
5
 * This software may be distributed under the terms of the BSD license.
6
 * See README for more details.
7
 */
8
9
#include "includes.h"
10
11
#include "common.h"
12
#include "crypto/md5.h"
13
#include "crypto/sha1.h"
14
#include "crypto/sha256.h"
15
#include "x509v3.h"
16
#include "tlsv1_common.h"
17
18
19
/*
20
 * TODO:
21
 * RFC 2246 Section 9: Mandatory to implement TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA
22
 * Add support for commonly used cipher suites; don't bother with exportable
23
 * suites.
24
 */
25
26
static const struct tls_cipher_suite tls_cipher_suites[] = {
27
  { TLS_NULL_WITH_NULL_NULL, TLS_KEY_X_NULL, TLS_CIPHER_NULL,
28
    TLS_HASH_NULL },
29
  { TLS_RSA_WITH_RC4_128_MD5, TLS_KEY_X_RSA, TLS_CIPHER_RC4_128,
30
    TLS_HASH_MD5 },
31
  { TLS_RSA_WITH_RC4_128_SHA, TLS_KEY_X_RSA, TLS_CIPHER_RC4_128,
32
    TLS_HASH_SHA },
33
  { TLS_RSA_WITH_DES_CBC_SHA, TLS_KEY_X_RSA, TLS_CIPHER_DES_CBC,
34
    TLS_HASH_SHA },
35
  { TLS_RSA_WITH_3DES_EDE_CBC_SHA, TLS_KEY_X_RSA,
36
    TLS_CIPHER_3DES_EDE_CBC, TLS_HASH_SHA },
37
  { TLS_DHE_RSA_WITH_DES_CBC_SHA, TLS_KEY_X_DHE_RSA, TLS_CIPHER_DES_CBC,
38
    TLS_HASH_SHA},
39
  { TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA, TLS_KEY_X_DHE_RSA,
40
    TLS_CIPHER_3DES_EDE_CBC, TLS_HASH_SHA },
41
  { TLS_DH_anon_WITH_RC4_128_MD5, TLS_KEY_X_DH_anon,
42
    TLS_CIPHER_RC4_128, TLS_HASH_MD5 },
43
  { TLS_DH_anon_WITH_DES_CBC_SHA, TLS_KEY_X_DH_anon,
44
    TLS_CIPHER_DES_CBC, TLS_HASH_SHA },
45
  { TLS_DH_anon_WITH_3DES_EDE_CBC_SHA, TLS_KEY_X_DH_anon,
46
    TLS_CIPHER_3DES_EDE_CBC, TLS_HASH_SHA },
47
  { TLS_RSA_WITH_AES_128_CBC_SHA, TLS_KEY_X_RSA, TLS_CIPHER_AES_128_CBC,
48
    TLS_HASH_SHA },
49
  { TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_KEY_X_DHE_RSA,
50
    TLS_CIPHER_AES_128_CBC, TLS_HASH_SHA },
51
  { TLS_DH_anon_WITH_AES_128_CBC_SHA, TLS_KEY_X_DH_anon,
52
    TLS_CIPHER_AES_128_CBC, TLS_HASH_SHA },
53
  { TLS_RSA_WITH_AES_256_CBC_SHA, TLS_KEY_X_RSA, TLS_CIPHER_AES_256_CBC,
54
    TLS_HASH_SHA },
55
  { TLS_DHE_RSA_WITH_AES_256_CBC_SHA, TLS_KEY_X_DHE_RSA,
56
    TLS_CIPHER_AES_256_CBC, TLS_HASH_SHA },
57
  { TLS_DH_anon_WITH_AES_256_CBC_SHA, TLS_KEY_X_DH_anon,
58
    TLS_CIPHER_AES_256_CBC, TLS_HASH_SHA },
59
  { TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_KEY_X_RSA,
60
    TLS_CIPHER_AES_128_CBC, TLS_HASH_SHA256 },
61
  { TLS_RSA_WITH_AES_256_CBC_SHA256, TLS_KEY_X_RSA,
62
    TLS_CIPHER_AES_256_CBC, TLS_HASH_SHA256 },
63
  { TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, TLS_KEY_X_DHE_RSA,
64
    TLS_CIPHER_AES_128_CBC, TLS_HASH_SHA256 },
65
  { TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, TLS_KEY_X_DHE_RSA,
66
    TLS_CIPHER_AES_256_CBC, TLS_HASH_SHA256 },
67
  { TLS_DH_anon_WITH_AES_128_CBC_SHA256, TLS_KEY_X_DH_anon,
68
    TLS_CIPHER_AES_128_CBC, TLS_HASH_SHA256 },
69
  { TLS_DH_anon_WITH_AES_256_CBC_SHA256, TLS_KEY_X_DH_anon,
70
    TLS_CIPHER_AES_256_CBC, TLS_HASH_SHA256 }
71
};
72
73
2
#define NUM_TLS_CIPHER_SUITES ARRAY_SIZE(tls_cipher_suites)
74
75
76
static const struct tls_cipher_data tls_ciphers[] = {
77
  { TLS_CIPHER_NULL,         TLS_CIPHER_STREAM,  0,  0,  0,
78
    CRYPTO_CIPHER_NULL },
79
  { TLS_CIPHER_IDEA_CBC,     TLS_CIPHER_BLOCK,  16, 16,  8,
80
    CRYPTO_CIPHER_NULL },
81
  { TLS_CIPHER_RC2_CBC_40,   TLS_CIPHER_BLOCK,   5, 16,  0,
82
    CRYPTO_CIPHER_ALG_RC2 },
83
  { TLS_CIPHER_RC4_40,       TLS_CIPHER_STREAM,  5, 16,  0,
84
    CRYPTO_CIPHER_ALG_RC4 },
85
  { TLS_CIPHER_RC4_128,      TLS_CIPHER_STREAM, 16, 16,  0,
86
    CRYPTO_CIPHER_ALG_RC4 },
87
  { TLS_CIPHER_DES40_CBC,    TLS_CIPHER_BLOCK,   5,  8,  8,
88
    CRYPTO_CIPHER_ALG_DES },
89
  { TLS_CIPHER_DES_CBC,      TLS_CIPHER_BLOCK,   8,  8,  8,
90
    CRYPTO_CIPHER_ALG_DES },
91
  { TLS_CIPHER_3DES_EDE_CBC, TLS_CIPHER_BLOCK,  24, 24,  8,
92
    CRYPTO_CIPHER_ALG_3DES },
93
  { TLS_CIPHER_AES_128_CBC,  TLS_CIPHER_BLOCK,  16, 16, 16,
94
    CRYPTO_CIPHER_ALG_AES },
95
  { TLS_CIPHER_AES_256_CBC,  TLS_CIPHER_BLOCK,  32, 32, 16,
96
    CRYPTO_CIPHER_ALG_AES }
97
};
98
99
2
#define NUM_TLS_CIPHER_DATA ARRAY_SIZE(tls_ciphers)
100
101
102
/**
103
 * tls_get_cipher_suite - Get TLS cipher suite
104
 * @suite: Cipher suite identifier
105
 * Returns: Pointer to the cipher data or %NULL if not found
106
 */
107
const struct tls_cipher_suite * tls_get_cipher_suite(u16 suite)
108
2
{
109
2
  size_t i;
110
2
  for (i = 0; i < NUM_TLS_CIPHER_SUITES; i++)
111
2
    if (tls_cipher_suites[i].suite == suite)
112
2
      return &tls_cipher_suites[i];
113
0
  return NULL;
114
2
}
115
116
117
const struct tls_cipher_data * tls_get_cipher_data(tls_cipher cipher)
118
2
{
119
2
  size_t i;
120
2
  for (i = 0; i < NUM_TLS_CIPHER_DATA; i++)
121
2
    if (tls_ciphers[i].cipher == cipher)
122
2
      return &tls_ciphers[i];
123
0
  return NULL;
124
2
}
125
126
127
int tls_server_key_exchange_allowed(tls_cipher cipher)
128
0
{
129
0
  const struct tls_cipher_suite *suite;
130
131
  /* RFC 2246, Section 7.4.3 */
132
0
  suite = tls_get_cipher_suite(cipher);
133
0
  if (suite == NULL)
134
0
    return 0;
135
136
0
  switch (suite->key_exchange) {
137
0
  case TLS_KEY_X_DHE_DSS:
138
0
  case TLS_KEY_X_DHE_DSS_EXPORT:
139
0
  case TLS_KEY_X_DHE_RSA:
140
0
  case TLS_KEY_X_DHE_RSA_EXPORT:
141
0
  case TLS_KEY_X_DH_anon_EXPORT:
142
0
  case TLS_KEY_X_DH_anon:
143
0
    return 1;
144
0
  case TLS_KEY_X_RSA_EXPORT:
145
0
    return 1 /* FIX: public key len > 512 bits */;
146
0
  default:
147
0
    return 0;
148
0
  }
149
0
}
150
151
152
/**
153
 * tls_parse_cert - Parse DER encoded X.509 certificate and get public key
154
 * @buf: ASN.1 DER encoded certificate
155
 * @len: Length of the buffer
156
 * @pk: Buffer for returning the allocated public key
157
 * Returns: 0 on success, -1 on failure
158
 *
159
 * This functions parses an ASN.1 DER encoded X.509 certificate and retrieves
160
 * the public key from it. The caller is responsible for freeing the public key
161
 * by calling crypto_public_key_free().
162
 */
163
int tls_parse_cert(const u8 *buf, size_t len, struct crypto_public_key **pk)
164
0
{
165
0
  struct x509_certificate *cert;
166
167
0
  wpa_hexdump(MSG_MSGDUMP, "TLSv1: Parse ASN.1 DER certificate",
168
0
        buf, len);
169
170
0
  *pk = crypto_public_key_from_cert(buf, len);
171
0
  if (*pk)
172
0
    return 0;
173
174
0
  cert = x509_certificate_parse(buf, len);
175
0
  if (cert == NULL) {
176
0
    wpa_printf(MSG_DEBUG, "TLSv1: Failed to parse X.509 "
177
0
         "certificate");
178
0
    return -1;
179
0
  }
180
181
  /* TODO
182
   * verify key usage (must allow encryption)
183
   *
184
   * All certificate profiles, key and cryptographic formats are
185
   * defined by the IETF PKIX working group [PKIX]. When a key
186
   * usage extension is present, the digitalSignature bit must be
187
   * set for the key to be eligible for signing, as described
188
   * above, and the keyEncipherment bit must be present to allow
189
   * encryption, as described above. The keyAgreement bit must be
190
   * set on Diffie-Hellman certificates. (PKIX: RFC 3280)
191
   */
192
193
0
  *pk = crypto_public_key_import(cert->public_key, cert->public_key_len);
194
0
  x509_certificate_free(cert);
195
196
0
  if (*pk == NULL) {
197
0
    wpa_printf(MSG_ERROR, "TLSv1: Failed to import "
198
0
         "server public key");
199
0
    return -1;
200
0
  }
201
202
0
  return 0;
203
0
}
204
205
206
int tls_verify_hash_init(struct tls_verify_hash *verify)
207
2
{
208
2
  tls_verify_hash_free(verify);
209
2
  verify->md5_client = crypto_hash_init(CRYPTO_HASH_ALG_MD5, NULL, 0);
210
2
  verify->md5_server = crypto_hash_init(CRYPTO_HASH_ALG_MD5, NULL, 0);
211
2
  verify->md5_cert = crypto_hash_init(CRYPTO_HASH_ALG_MD5, NULL, 0);
212
2
  verify->sha1_client = crypto_hash_init(CRYPTO_HASH_ALG_SHA1, NULL, 0);
213
2
  verify->sha1_server = crypto_hash_init(CRYPTO_HASH_ALG_SHA1, NULL, 0);
214
2
  verify->sha1_cert = crypto_hash_init(CRYPTO_HASH_ALG_SHA1, NULL, 0);
215
2
  if (verify->md5_client == NULL || verify->md5_server == NULL ||
216
2
      verify->md5_cert == NULL || verify->sha1_client == NULL ||
217
2
      verify->sha1_server == NULL || verify->sha1_cert == NULL) {
218
0
    tls_verify_hash_free(verify);
219
0
    return -1;
220
0
  }
221
2
#ifdef CONFIG_TLSV12
222
2
  verify->sha256_client = crypto_hash_init(CRYPTO_HASH_ALG_SHA256, NULL,
223
2
             0);
224
2
  verify->sha256_server = crypto_hash_init(CRYPTO_HASH_ALG_SHA256, NULL,
225
2
             0);
226
2
  verify->sha256_cert = crypto_hash_init(CRYPTO_HASH_ALG_SHA256, NULL,
227
2
                 0);
228
2
  if (verify->sha256_client == NULL || verify->sha256_server == NULL ||
229
2
      verify->sha256_cert == NULL) {
230
0
    tls_verify_hash_free(verify);
231
0
    return -1;
232
0
  }
233
2
#endif /* CONFIG_TLSV12 */
234
2
  return 0;
235
2
}
236
237
238
void tls_verify_hash_add(struct tls_verify_hash *verify, const u8 *buf,
239
       size_t len)
240
0
{
241
0
  if (verify->md5_client && verify->sha1_client) {
242
0
    crypto_hash_update(verify->md5_client, buf, len);
243
0
    crypto_hash_update(verify->sha1_client, buf, len);
244
0
  }
245
0
  if (verify->md5_server && verify->sha1_server) {
246
0
    crypto_hash_update(verify->md5_server, buf, len);
247
0
    crypto_hash_update(verify->sha1_server, buf, len);
248
0
  }
249
0
  if (verify->md5_cert && verify->sha1_cert) {
250
0
    crypto_hash_update(verify->md5_cert, buf, len);
251
0
    crypto_hash_update(verify->sha1_cert, buf, len);
252
0
  }
253
0
#ifdef CONFIG_TLSV12
254
0
  if (verify->sha256_client)
255
0
    crypto_hash_update(verify->sha256_client, buf, len);
256
0
  if (verify->sha256_server)
257
0
    crypto_hash_update(verify->sha256_server, buf, len);
258
0
  if (verify->sha256_cert)
259
0
    crypto_hash_update(verify->sha256_cert, buf, len);
260
0
#endif /* CONFIG_TLSV12 */
261
0
}
262
263
264
void tls_verify_hash_free(struct tls_verify_hash *verify)
265
4
{
266
4
  crypto_hash_finish(verify->md5_client, NULL, NULL);
267
4
  crypto_hash_finish(verify->md5_server, NULL, NULL);
268
4
  crypto_hash_finish(verify->md5_cert, NULL, NULL);
269
4
  crypto_hash_finish(verify->sha1_client, NULL, NULL);
270
4
  crypto_hash_finish(verify->sha1_server, NULL, NULL);
271
4
  crypto_hash_finish(verify->sha1_cert, NULL, NULL);
272
4
  verify->md5_client = NULL;
273
4
  verify->md5_server = NULL;
274
4
  verify->md5_cert = NULL;
275
4
  verify->sha1_client = NULL;
276
4
  verify->sha1_server = NULL;
277
4
  verify->sha1_cert = NULL;
278
4
#ifdef CONFIG_TLSV12
279
4
  crypto_hash_finish(verify->sha256_client, NULL, NULL);
280
4
  crypto_hash_finish(verify->sha256_server, NULL, NULL);
281
4
  crypto_hash_finish(verify->sha256_cert, NULL, NULL);
282
4
  verify->sha256_client = NULL;
283
4
  verify->sha256_server = NULL;
284
4
  verify->sha256_cert = NULL;
285
4
#endif /* CONFIG_TLSV12 */
286
4
}
287
288
289
int tls_version_ok(u16 ver)
290
0
{
291
0
  if (ver == TLS_VERSION_1)
292
0
    return 1;
293
0
#ifdef CONFIG_TLSV11
294
0
  if (ver == TLS_VERSION_1_1)
295
0
    return 1;
296
0
#endif /* CONFIG_TLSV11 */
297
0
#ifdef CONFIG_TLSV12
298
0
  if (ver == TLS_VERSION_1_2)
299
0
    return 1;
300
0
#endif /* CONFIG_TLSV12 */
301
302
0
  return 0;
303
0
}
304
305
306
const char * tls_version_str(u16 ver)
307
0
{
308
0
  switch (ver) {
309
0
  case TLS_VERSION_1:
310
0
    return "1.0";
311
0
  case TLS_VERSION_1_1:
312
0
    return "1.1";
313
0
  case TLS_VERSION_1_2:
314
0
    return "1.2";
315
0
  }
316
317
0
  return "?";
318
0
}
319
320
321
int tls_prf(u16 ver, const u8 *secret, size_t secret_len, const char *label,
322
      const u8 *seed, size_t seed_len, u8 *out, size_t outlen)
323
0
{
324
0
#ifdef CONFIG_TLSV12
325
0
  if (ver >= TLS_VERSION_1_2) {
326
0
    tls_prf_sha256(secret, secret_len, label, seed, seed_len,
327
0
             out, outlen);
328
0
    return 0;
329
0
  }
330
0
#endif /* CONFIG_TLSV12 */
331
332
0
  return tls_prf_sha1_md5(secret, secret_len, label, seed, seed_len, out,
333
0
        outlen);
334
0
}
335
336
337
#ifdef CONFIG_TLSV12
338
int tlsv12_key_x_server_params_hash(u16 tls_version, u8 hash_alg,
339
            const u8 *client_random,
340
            const u8 *server_random,
341
            const u8 *server_params,
342
            size_t server_params_len, u8 *hash)
343
0
{
344
0
  size_t hlen;
345
0
  struct crypto_hash *ctx;
346
0
  enum crypto_hash_alg alg;
347
348
0
  switch (hash_alg) {
349
0
  case TLS_HASH_ALG_SHA256:
350
0
    alg = CRYPTO_HASH_ALG_SHA256;
351
0
    hlen = SHA256_MAC_LEN;
352
0
    break;
353
0
  case TLS_HASH_ALG_SHA384:
354
0
    alg = CRYPTO_HASH_ALG_SHA384;
355
0
    hlen = 48;
356
0
    break;
357
0
  case TLS_HASH_ALG_SHA512:
358
0
    alg = CRYPTO_HASH_ALG_SHA512;
359
0
    hlen = 64;
360
0
    break;
361
0
  default:
362
0
    return -1;
363
0
  }
364
0
  ctx = crypto_hash_init(alg, NULL, 0);
365
0
  if (ctx == NULL)
366
0
    return -1;
367
0
  crypto_hash_update(ctx, client_random, TLS_RANDOM_LEN);
368
0
  crypto_hash_update(ctx, server_random, TLS_RANDOM_LEN);
369
0
  crypto_hash_update(ctx, server_params, server_params_len);
370
0
  if (crypto_hash_finish(ctx, hash, &hlen) < 0)
371
0
    return -1;
372
373
0
  return hlen;
374
0
}
375
#endif /* CONFIG_TLSV12 */
376
377
378
int tls_key_x_server_params_hash(u16 tls_version, const u8 *client_random,
379
         const u8 *server_random,
380
         const u8 *server_params,
381
         size_t server_params_len, u8 *hash, size_t hsz)
382
0
{
383
0
  u8 *hpos;
384
0
  size_t hlen;
385
0
  struct crypto_hash *ctx;
386
387
0
  hpos = hash;
388
389
0
  ctx = crypto_hash_init(CRYPTO_HASH_ALG_MD5, NULL, 0);
390
0
  if (ctx == NULL)
391
0
    return -1;
392
0
  crypto_hash_update(ctx, client_random, TLS_RANDOM_LEN);
393
0
  crypto_hash_update(ctx, server_random, TLS_RANDOM_LEN);
394
0
  crypto_hash_update(ctx, server_params, server_params_len);
395
0
  hlen = MD5_MAC_LEN;
396
0
  if (hsz < hlen)
397
0
    return -1;
398
0
  if (crypto_hash_finish(ctx, hash, &hlen) < 0)
399
0
    return -1;
400
0
  hpos += hlen;
401
402
0
  ctx = crypto_hash_init(CRYPTO_HASH_ALG_SHA1, NULL, 0);
403
0
  if (ctx == NULL)
404
0
    return -1;
405
0
  crypto_hash_update(ctx, client_random, TLS_RANDOM_LEN);
406
0
  crypto_hash_update(ctx, server_random, TLS_RANDOM_LEN);
407
0
  crypto_hash_update(ctx, server_params, server_params_len);
408
0
  hlen = hsz - hlen;
409
0
  if (crypto_hash_finish(ctx, hpos, &hlen) < 0)
410
0
    return -1;
411
0
  hpos += hlen;
412
0
  return hpos - hash;
413
0
}
414
415
416
int tls_verify_signature(u16 tls_version, struct crypto_public_key *pk,
417
       const u8 *data, size_t data_len,
418
       const u8 *pos, size_t len, u8 *alert)
419
0
{
420
0
  u8 *buf;
421
0
  const u8 *end = pos + len;
422
0
  const u8 *decrypted;
423
0
  u16 slen;
424
0
  size_t buflen;
425
426
0
  if (end - pos < 2) {
427
0
    *alert = TLS_ALERT_DECODE_ERROR;
428
0
    return -1;
429
0
  }
430
0
  slen = WPA_GET_BE16(pos);
431
0
  pos += 2;
432
0
  if (end - pos < slen) {
433
0
    *alert = TLS_ALERT_DECODE_ERROR;
434
0
    return -1;
435
0
  }
436
0
  if (end - pos > slen) {
437
0
    wpa_hexdump(MSG_MSGDUMP, "Additional data after Signature",
438
0
          pos + slen, end - pos - slen);
439
0
    end = pos + slen;
440
0
  }
441
442
0
  wpa_hexdump(MSG_MSGDUMP, "TLSv1: Signature", pos, end - pos);
443
0
  if (pk == NULL) {
444
0
    wpa_printf(MSG_DEBUG, "TLSv1: No public key to verify signature");
445
0
    *alert = TLS_ALERT_INTERNAL_ERROR;
446
0
    return -1;
447
0
  }
448
449
0
  buflen = end - pos;
450
0
  buf = os_malloc(end - pos);
451
0
  if (buf == NULL) {
452
0
    *alert = TLS_ALERT_INTERNAL_ERROR;
453
0
    return -1;
454
0
  }
455
0
  if (crypto_public_key_decrypt_pkcs1(pk, pos, end - pos, buf, &buflen) <
456
0
      0) {
457
0
    wpa_printf(MSG_DEBUG, "TLSv1: Failed to decrypt signature");
458
0
    os_free(buf);
459
0
    *alert = TLS_ALERT_DECRYPT_ERROR;
460
0
    return -1;
461
0
  }
462
0
  decrypted = buf;
463
464
0
  wpa_hexdump_key(MSG_MSGDUMP, "TLSv1: Decrypted Signature",
465
0
      decrypted, buflen);
466
467
0
#ifdef CONFIG_TLSV12
468
0
  if (tls_version >= TLS_VERSION_1_2) {
469
    /*
470
     * RFC 3447, A.2.4 RSASSA-PKCS1-v1_5
471
     *
472
     * DigestInfo ::= SEQUENCE {
473
     *   digestAlgorithm DigestAlgorithm,
474
     *   digest OCTET STRING
475
     * }
476
     *
477
     * SHA-256 OID: sha256WithRSAEncryption ::= {pkcs-1 11}
478
     *
479
     * DER encoded DigestInfo for SHA256 per RFC 3447:
480
     * 30 31 30 0d 06 09 60 86 48 01 65 03 04 02 01 05 00 04 20 ||
481
     * H
482
     */
483
0
    if (buflen >= 19 + 32 &&
484
0
        os_memcmp(buf, "\x30\x31\x30\x0d\x06\x09\x60\x86\x48\x01"
485
0
            "\x65\x03\x04\x02\x01\x05\x00\x04\x20", 19) == 0)
486
0
    {
487
0
      wpa_printf(MSG_DEBUG, "TLSv1.2: DigestAlgorithm = SHA-256");
488
0
      decrypted = buf + 19;
489
0
      buflen -= 19;
490
0
    } else if (buflen >= 19 + 48 &&
491
0
        os_memcmp(buf, "\x30\x41\x30\x0d\x06\x09\x60\x86\x48\x01"
492
0
            "\x65\x03\x04\x02\x02\x05\x00\x04\x30", 19) == 0)
493
0
    {
494
0
      wpa_printf(MSG_DEBUG, "TLSv1.2: DigestAlgorithm = SHA-384");
495
0
      decrypted = buf + 19;
496
0
      buflen -= 19;
497
0
    } else if (buflen >= 19 + 64 &&
498
0
        os_memcmp(buf, "\x30\x51\x30\x0d\x06\x09\x60\x86\x48\x01"
499
0
            "\x65\x03\x04\x02\x03\x05\x00\x04\x40", 19) == 0)
500
0
    {
501
0
      wpa_printf(MSG_DEBUG, "TLSv1.2: DigestAlgorithm = SHA-512");
502
0
      decrypted = buf + 19;
503
0
      buflen -= 19;
504
505
0
    } else {
506
0
      wpa_printf(MSG_DEBUG, "TLSv1.2: Unrecognized DigestInfo");
507
0
      os_free(buf);
508
0
      *alert = TLS_ALERT_DECRYPT_ERROR;
509
0
      return -1;
510
0
    }
511
0
  }
512
0
#endif /* CONFIG_TLSV12 */
513
514
0
  if (buflen != data_len ||
515
0
      os_memcmp_const(decrypted, data, data_len) != 0) {
516
0
    wpa_printf(MSG_DEBUG, "TLSv1: Invalid Signature in CertificateVerify - did not match calculated hash");
517
0
    os_free(buf);
518
0
    *alert = TLS_ALERT_DECRYPT_ERROR;
519
0
    return -1;
520
0
  }
521
522
0
  os_free(buf);
523
524
0
  return 0;
525
0
}