diff options
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libssl/ssl_algs.c | 5 | ||||
| -rw-r--r-- | src/lib/libssl/ssl_ciph.c | 216 | ||||
| -rw-r--r-- | src/lib/libssl/ssl_locl.h | 3 | 
3 files changed, 45 insertions, 179 deletions
| diff --git a/src/lib/libssl/ssl_algs.c b/src/lib/libssl/ssl_algs.c index b63f36b3f1..bb736c5de9 100644 --- a/src/lib/libssl/ssl_algs.c +++ b/src/lib/libssl/ssl_algs.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: ssl_algs.c,v 1.27 2017/08/12 02:55:22 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_algs.c,v 1.28 2019/04/04 16:44:24 jsing Exp $ */ | 
| 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 
| 3 | * All rights reserved. | 3 | * All rights reserved. | 
| 4 | * | 4 | * | 
| @@ -119,8 +119,7 @@ SSL_library_init(void) | |||
| 119 | EVP_add_digest(EVP_streebog256()); | 119 | EVP_add_digest(EVP_streebog256()); | 
| 120 | EVP_add_digest(EVP_streebog512()); | 120 | EVP_add_digest(EVP_streebog512()); | 
| 121 | #endif | 121 | #endif | 
| 122 | /* initialize cipher/digest methods table */ | 122 | |
| 123 | ssl_load_ciphers(); | ||
| 124 | return (1); | 123 | return (1); | 
| 125 | } | 124 | } | 
| 126 | 125 | ||
| diff --git a/src/lib/libssl/ssl_ciph.c b/src/lib/libssl/ssl_ciph.c index 3cbf368ad3..ed167efffd 100644 --- a/src/lib/libssl/ssl_ciph.c +++ b/src/lib/libssl/ssl_ciph.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: ssl_ciph.c,v 1.107 2019/03/24 17:10:54 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_ciph.c,v 1.108 2019/04/04 16:44:24 jsing Exp $ */ | 
| 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 
| 3 | * All rights reserved. | 3 | * All rights reserved. | 
| 4 | * | 4 | * | 
| @@ -150,41 +150,6 @@ | |||
| 150 | 150 | ||
| 151 | #include "ssl_locl.h" | 151 | #include "ssl_locl.h" | 
| 152 | 152 | ||
| 153 | #define SSL_ENC_3DES_IDX 0 | ||
| 154 | #define SSL_ENC_RC4_IDX 1 | ||
| 155 | #define SSL_ENC_NULL_IDX 2 | ||
| 156 | #define SSL_ENC_AES128_IDX 3 | ||
| 157 | #define SSL_ENC_AES256_IDX 4 | ||
| 158 | #define SSL_ENC_CAMELLIA128_IDX 5 | ||
| 159 | #define SSL_ENC_CAMELLIA256_IDX 6 | ||
| 160 | #define SSL_ENC_GOST89_IDX 7 | ||
| 161 | #define SSL_ENC_NUM_IDX 8 | ||
| 162 | |||
| 163 | static const EVP_CIPHER *ssl_cipher_methods[SSL_ENC_NUM_IDX] = { | ||
| 164 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
| 165 | }; | ||
| 166 | |||
| 167 | #define SSL_MD_MD5_IDX 0 | ||
| 168 | #define SSL_MD_SHA1_IDX 1 | ||
| 169 | #define SSL_MD_GOST94_IDX 2 | ||
| 170 | #define SSL_MD_GOST89MAC_IDX 3 | ||
| 171 | #define SSL_MD_SHA256_IDX 4 | ||
| 172 | #define SSL_MD_SHA384_IDX 5 | ||
| 173 | #define SSL_MD_STREEBOG256_IDX 6 | ||
| 174 | #define SSL_MD_NUM_IDX 7 | ||
| 175 | static const EVP_MD *ssl_digest_methods[SSL_MD_NUM_IDX] = { | ||
| 176 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, | ||
| 177 | }; | ||
| 178 | |||
| 179 | static int ssl_mac_pkey_id[SSL_MD_NUM_IDX] = { | ||
| 180 | EVP_PKEY_HMAC, EVP_PKEY_HMAC, EVP_PKEY_HMAC, EVP_PKEY_GOSTIMIT, | ||
| 181 | EVP_PKEY_HMAC, EVP_PKEY_HMAC, EVP_PKEY_HMAC, | ||
| 182 | }; | ||
| 183 | |||
| 184 | static int ssl_mac_secret_size[SSL_MD_NUM_IDX] = { | ||
| 185 | 0, 0, 0, 0, 0, 0, 0, | ||
| 186 | }; | ||
| 187 | |||
| 188 | #define CIPHER_ADD 1 | 153 | #define CIPHER_ADD 1 | 
| 189 | #define CIPHER_KILL 2 | 154 | #define CIPHER_KILL 2 | 
| 190 | #define CIPHER_DEL 3 | 155 | #define CIPHER_DEL 3 | 
| @@ -446,164 +411,77 @@ static const SSL_CIPHER cipher_aliases[] = { | |||
| 446 | }, | 411 | }, | 
| 447 | }; | 412 | }; | 
| 448 | 413 | ||
| 449 | void | ||
| 450 | ssl_load_ciphers(void) | ||
| 451 | { | ||
| 452 | ssl_cipher_methods[SSL_ENC_3DES_IDX] = | ||
| 453 | EVP_get_cipherbyname(SN_des_ede3_cbc); | ||
| 454 | ssl_cipher_methods[SSL_ENC_RC4_IDX] = | ||
| 455 | EVP_get_cipherbyname(SN_rc4); | ||
| 456 | ssl_cipher_methods[SSL_ENC_AES128_IDX] = | ||
| 457 | EVP_get_cipherbyname(SN_aes_128_cbc); | ||
| 458 | ssl_cipher_methods[SSL_ENC_AES256_IDX] = | ||
| 459 | EVP_get_cipherbyname(SN_aes_256_cbc); | ||
| 460 | ssl_cipher_methods[SSL_ENC_CAMELLIA128_IDX] = | ||
| 461 | EVP_get_cipherbyname(SN_camellia_128_cbc); | ||
| 462 | ssl_cipher_methods[SSL_ENC_CAMELLIA256_IDX] = | ||
| 463 | EVP_get_cipherbyname(SN_camellia_256_cbc); | ||
| 464 | ssl_cipher_methods[SSL_ENC_GOST89_IDX] = | ||
| 465 | EVP_get_cipherbyname(SN_gost89_cnt); | ||
| 466 | |||
| 467 | ssl_digest_methods[SSL_MD_MD5_IDX] = | ||
| 468 | EVP_get_digestbyname(SN_md5); | ||
| 469 | ssl_mac_secret_size[SSL_MD_MD5_IDX] = | ||
| 470 | EVP_MD_size(ssl_digest_methods[SSL_MD_MD5_IDX]); | ||
| 471 | OPENSSL_assert(ssl_mac_secret_size[SSL_MD_MD5_IDX] >= 0); | ||
| 472 | ssl_digest_methods[SSL_MD_SHA1_IDX] = | ||
| 473 | EVP_get_digestbyname(SN_sha1); | ||
| 474 | ssl_mac_secret_size[SSL_MD_SHA1_IDX] = | ||
| 475 | EVP_MD_size(ssl_digest_methods[SSL_MD_SHA1_IDX]); | ||
| 476 | OPENSSL_assert(ssl_mac_secret_size[SSL_MD_SHA1_IDX] >= 0); | ||
| 477 | ssl_digest_methods[SSL_MD_GOST94_IDX] = | ||
| 478 | EVP_get_digestbyname(SN_id_GostR3411_94); | ||
| 479 | if (ssl_digest_methods[SSL_MD_GOST94_IDX]) { | ||
| 480 | ssl_mac_secret_size[SSL_MD_GOST94_IDX] = | ||
| 481 | EVP_MD_size(ssl_digest_methods[SSL_MD_GOST94_IDX]); | ||
| 482 | OPENSSL_assert(ssl_mac_secret_size[SSL_MD_GOST94_IDX] >= 0); | ||
| 483 | } | ||
| 484 | ssl_digest_methods[SSL_MD_GOST89MAC_IDX] = | ||
| 485 | EVP_get_digestbyname(SN_id_Gost28147_89_MAC); | ||
| 486 | if (ssl_mac_pkey_id[SSL_MD_GOST89MAC_IDX]) { | ||
| 487 | ssl_mac_secret_size[SSL_MD_GOST89MAC_IDX] = 32; | ||
| 488 | } | ||
| 489 | |||
| 490 | ssl_digest_methods[SSL_MD_SHA256_IDX] = | ||
| 491 | EVP_get_digestbyname(SN_sha256); | ||
| 492 | ssl_mac_secret_size[SSL_MD_SHA256_IDX] = | ||
| 493 | EVP_MD_size(ssl_digest_methods[SSL_MD_SHA256_IDX]); | ||
| 494 | ssl_digest_methods[SSL_MD_SHA384_IDX] = | ||
| 495 | EVP_get_digestbyname(SN_sha384); | ||
| 496 | ssl_mac_secret_size[SSL_MD_SHA384_IDX] = | ||
| 497 | EVP_MD_size(ssl_digest_methods[SSL_MD_SHA384_IDX]); | ||
| 498 | ssl_digest_methods[SSL_MD_STREEBOG256_IDX] = | ||
| 499 | EVP_get_digestbyname(SN_id_tc26_gost3411_2012_256); | ||
| 500 | ssl_mac_secret_size[SSL_MD_STREEBOG256_IDX] = | ||
| 501 | EVP_MD_size(ssl_digest_methods[SSL_MD_STREEBOG256_IDX]); | ||
| 502 | } | ||
| 503 | |||
| 504 | int | 414 | int | 
| 505 | ssl_cipher_get_evp(const SSL_SESSION *s, const EVP_CIPHER **enc, | 415 | ssl_cipher_get_evp(const SSL_SESSION *ss, const EVP_CIPHER **enc, | 
| 506 | const EVP_MD **md, int *mac_pkey_type, int *mac_secret_size) | 416 | const EVP_MD **md, int *mac_pkey_type, int *mac_secret_size) | 
| 507 | { | 417 | { | 
| 508 | const SSL_CIPHER *c; | 418 | *enc = NULL; | 
| 509 | int i; | 419 | *md = NULL; | 
| 420 | *mac_pkey_type = NID_undef; | ||
| 421 | *mac_secret_size = 0; | ||
| 510 | 422 | ||
| 511 | c = s->cipher; | 423 | if (ss->cipher == NULL) | 
| 512 | if (c == NULL) | 424 | return 0; | 
| 513 | return (0); | ||
| 514 | 425 | ||
| 515 | /* | 426 | /* | 
| 516 | * This function does not handle EVP_AEAD. | 427 | * This function does not handle EVP_AEAD. | 
| 517 | * See ssl_cipher_get_aead_evp instead. | 428 | * See ssl_cipher_get_aead_evp instead. | 
| 518 | */ | 429 | */ | 
| 519 | if (c->algorithm_mac & SSL_AEAD) | 430 | if (ss->cipher->algorithm_mac & SSL_AEAD) | 
| 520 | return(0); | 431 | return 0; | 
| 521 | |||
| 522 | if ((enc == NULL) || (md == NULL)) | ||
| 523 | return (0); | ||
| 524 | 432 | ||
| 525 | switch (c->algorithm_enc) { | 433 | switch (ss->cipher->algorithm_enc) { | 
| 526 | case SSL_3DES: | 434 | case SSL_3DES: | 
| 527 | i = SSL_ENC_3DES_IDX; | 435 | *enc = EVP_des_ede3_cbc(); | 
| 528 | break; | 436 | break; | 
| 529 | case SSL_RC4: | 437 | case SSL_RC4: | 
| 530 | i = SSL_ENC_RC4_IDX; | 438 | *enc = EVP_rc4(); | 
| 531 | break; | 439 | break; | 
| 532 | case SSL_eNULL: | 440 | case SSL_eNULL: | 
| 533 | i = SSL_ENC_NULL_IDX; | 441 | *enc = EVP_enc_null(); | 
| 534 | break; | 442 | break; | 
| 535 | case SSL_AES128: | 443 | case SSL_AES128: | 
| 536 | i = SSL_ENC_AES128_IDX; | 444 | *enc = EVP_aes_128_cbc(); | 
| 537 | break; | 445 | break; | 
| 538 | case SSL_AES256: | 446 | case SSL_AES256: | 
| 539 | i = SSL_ENC_AES256_IDX; | 447 | *enc = EVP_aes_256_cbc(); | 
| 540 | break; | 448 | break; | 
| 541 | case SSL_CAMELLIA128: | 449 | case SSL_CAMELLIA128: | 
| 542 | i = SSL_ENC_CAMELLIA128_IDX; | 450 | *enc = EVP_camellia_128_cbc(); | 
| 543 | break; | 451 | break; | 
| 544 | case SSL_CAMELLIA256: | 452 | case SSL_CAMELLIA256: | 
| 545 | i = SSL_ENC_CAMELLIA256_IDX; | 453 | *enc = EVP_camellia_256_cbc(); | 
| 546 | break; | 454 | break; | 
| 547 | case SSL_eGOST2814789CNT: | 455 | case SSL_eGOST2814789CNT: | 
| 548 | i = SSL_ENC_GOST89_IDX; | 456 | *enc = EVP_gost2814789_cnt(); | 
| 549 | break; | 457 | break; | 
| 550 | default: | ||
| 551 | i = -1; | ||
| 552 | break; | ||
| 553 | } | ||
| 554 | |||
| 555 | if ((i < 0) || (i >= SSL_ENC_NUM_IDX)) | ||
| 556 | *enc = NULL; | ||
| 557 | else { | ||
| 558 | if (i == SSL_ENC_NULL_IDX) | ||
| 559 | *enc = EVP_enc_null(); | ||
| 560 | else | ||
| 561 | *enc = ssl_cipher_methods[i]; | ||
| 562 | } | 458 | } | 
| 563 | 459 | ||
| 564 | switch (c->algorithm_mac) { | 460 | switch (ss->cipher->algorithm_mac) { | 
| 565 | case SSL_MD5: | 461 | case SSL_MD5: | 
| 566 | i = SSL_MD_MD5_IDX; | 462 | *md = EVP_md5(); | 
| 567 | break; | 463 | break; | 
| 568 | case SSL_SHA1: | 464 | case SSL_SHA1: | 
| 569 | i = SSL_MD_SHA1_IDX; | 465 | *md = EVP_sha1(); | 
| 570 | break; | 466 | break; | 
| 571 | case SSL_SHA256: | 467 | case SSL_SHA256: | 
| 572 | i = SSL_MD_SHA256_IDX; | 468 | *md = EVP_sha256(); | 
| 573 | break; | 469 | break; | 
| 574 | case SSL_SHA384: | 470 | case SSL_SHA384: | 
| 575 | i = SSL_MD_SHA384_IDX; | 471 | *md = EVP_sha384(); | 
| 576 | break; | ||
| 577 | case SSL_GOST94: | ||
| 578 | i = SSL_MD_GOST94_IDX; | ||
| 579 | break; | 472 | break; | 
| 580 | case SSL_GOST89MAC: | 473 | case SSL_GOST89MAC: | 
| 581 | i = SSL_MD_GOST89MAC_IDX; | 474 | *md = EVP_gost2814789imit(); | 
| 582 | break; | 475 | break; | 
| 583 | case SSL_STREEBOG256: | 476 | case SSL_GOST94: | 
| 584 | i = SSL_MD_STREEBOG256_IDX; | 477 | *md = EVP_gostr341194(); | 
| 585 | break; | 478 | break; | 
| 586 | default: | 479 | case SSL_STREEBOG256: | 
| 587 | i = -1; | 480 | *md = EVP_streebog256(); | 
| 588 | break; | 481 | break; | 
| 589 | } | 482 | } | 
| 590 | if ((i < 0) || (i >= SSL_MD_NUM_IDX)) { | ||
| 591 | *md = NULL; | ||
| 592 | |||
| 593 | if (mac_pkey_type != NULL) | ||
| 594 | *mac_pkey_type = NID_undef; | ||
| 595 | if (mac_secret_size != NULL) | ||
| 596 | *mac_secret_size = 0; | ||
| 597 | } else { | ||
| 598 | *md = ssl_digest_methods[i]; | ||
| 599 | if (mac_pkey_type != NULL) | ||
| 600 | *mac_pkey_type = ssl_mac_pkey_id[i]; | ||
| 601 | if (mac_secret_size != NULL) | ||
| 602 | *mac_secret_size = ssl_mac_secret_size[i]; | ||
| 603 | } | ||
| 604 | 483 | ||
| 605 | if (*enc == NULL || *md == NULL || | 484 | if (*enc == NULL || *md == NULL) | 
| 606 | (mac_pkey_type != NULL && *mac_pkey_type == NID_undef)) | ||
| 607 | return 0; | 485 | return 0; | 
| 608 | 486 | ||
| 609 | /* | 487 | /* | 
| @@ -615,6 +493,14 @@ ssl_cipher_get_evp(const SSL_SESSION *s, const EVP_CIPHER **enc, | |||
| 615 | if (EVP_CIPHER_mode(*enc) == EVP_CIPH_GCM_MODE) | 493 | if (EVP_CIPHER_mode(*enc) == EVP_CIPH_GCM_MODE) | 
| 616 | return 0; | 494 | return 0; | 
| 617 | 495 | ||
| 496 | if (ss->cipher->algorithm_mac == SSL_GOST89MAC) { | ||
| 497 | *mac_pkey_type = EVP_PKEY_GOSTIMIT; | ||
| 498 | *mac_secret_size = 32; /* XXX */ | ||
| 499 | } else { | ||
| 500 | *mac_pkey_type = EVP_PKEY_HMAC; | ||
| 501 | *mac_secret_size = EVP_MD_size(*md); | ||
| 502 | } | ||
| 503 | |||
| 618 | return 1; | 504 | return 1; | 
| 619 | } | 505 | } | 
| 620 | 506 | ||
| @@ -623,18 +509,16 @@ ssl_cipher_get_evp(const SSL_SESSION *s, const EVP_CIPHER **enc, | |||
| 623 | * for s->cipher. It returns 1 on success and 0 on error. | 509 | * for s->cipher. It returns 1 on success and 0 on error. | 
| 624 | */ | 510 | */ | 
| 625 | int | 511 | int | 
| 626 | ssl_cipher_get_evp_aead(const SSL_SESSION *s, const EVP_AEAD **aead) | 512 | ssl_cipher_get_evp_aead(const SSL_SESSION *ss, const EVP_AEAD **aead) | 
| 627 | { | 513 | { | 
| 628 | const SSL_CIPHER *c = s->cipher; | ||
| 629 | |||
| 630 | *aead = NULL; | 514 | *aead = NULL; | 
| 631 | 515 | ||
| 632 | if (c == NULL) | 516 | if (ss->cipher == NULL) | 
| 633 | return 0; | 517 | return 0; | 
| 634 | if ((c->algorithm_mac & SSL_AEAD) == 0) | 518 | if ((ss->cipher->algorithm_mac & SSL_AEAD) == 0) | 
| 635 | return 0; | 519 | return 0; | 
| 636 | 520 | ||
| 637 | switch (c->algorithm_enc) { | 521 | switch (ss->cipher->algorithm_enc) { | 
| 638 | case SSL_AES128GCM: | 522 | case SSL_AES128GCM: | 
| 639 | *aead = EVP_aead_aes_128_gcm(); | 523 | *aead = EVP_aead_aes_128_gcm(); | 
| 640 | return 1; | 524 | return 1; | 
| @@ -740,22 +624,6 @@ ssl_cipher_get_disabled(unsigned long *mkey, unsigned long *auth, | |||
| 740 | #ifdef SSL_FORBID_ENULL | 624 | #ifdef SSL_FORBID_ENULL | 
| 741 | *enc |= SSL_eNULL; | 625 | *enc |= SSL_eNULL; | 
| 742 | #endif | 626 | #endif | 
| 743 | |||
| 744 | *enc |= (ssl_cipher_methods[SSL_ENC_3DES_IDX] == NULL) ? SSL_3DES : 0; | ||
| 745 | *enc |= (ssl_cipher_methods[SSL_ENC_RC4_IDX ] == NULL) ? SSL_RC4 : 0; | ||
| 746 | *enc |= (ssl_cipher_methods[SSL_ENC_AES128_IDX] == NULL) ? SSL_AES128 : 0; | ||
| 747 | *enc |= (ssl_cipher_methods[SSL_ENC_AES256_IDX] == NULL) ? SSL_AES256 : 0; | ||
| 748 | *enc |= (ssl_cipher_methods[SSL_ENC_CAMELLIA128_IDX] == NULL) ? SSL_CAMELLIA128 : 0; | ||
| 749 | *enc |= (ssl_cipher_methods[SSL_ENC_CAMELLIA256_IDX] == NULL) ? SSL_CAMELLIA256 : 0; | ||
| 750 | *enc |= (ssl_cipher_methods[SSL_ENC_GOST89_IDX] == NULL) ? SSL_eGOST2814789CNT : 0; | ||
| 751 | |||
| 752 | *mac |= (ssl_digest_methods[SSL_MD_MD5_IDX ] == NULL) ? SSL_MD5 : 0; | ||
| 753 | *mac |= (ssl_digest_methods[SSL_MD_SHA1_IDX] == NULL) ? SSL_SHA1 : 0; | ||
| 754 | *mac |= (ssl_digest_methods[SSL_MD_SHA256_IDX] == NULL) ? SSL_SHA256 : 0; | ||
| 755 | *mac |= (ssl_digest_methods[SSL_MD_SHA384_IDX] == NULL) ? SSL_SHA384 : 0; | ||
| 756 | *mac |= (ssl_digest_methods[SSL_MD_GOST94_IDX] == NULL) ? SSL_GOST94 : 0; | ||
| 757 | *mac |= (ssl_digest_methods[SSL_MD_GOST89MAC_IDX] == NULL) ? SSL_GOST89MAC : 0; | ||
| 758 | *mac |= (ssl_digest_methods[SSL_MD_STREEBOG256_IDX] == NULL) ? SSL_STREEBOG256 : 0; | ||
| 759 | } | 627 | } | 
| 760 | 628 | ||
| 761 | static void | 629 | static void | 
| diff --git a/src/lib/libssl/ssl_locl.h b/src/lib/libssl/ssl_locl.h index 2dae72309c..31f3e60893 100644 --- a/src/lib/libssl/ssl_locl.h +++ b/src/lib/libssl/ssl_locl.h | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: ssl_locl.h,v 1.244 2019/03/25 17:33:26 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_locl.h,v 1.245 2019/04/04 16:44:24 jsing Exp $ */ | 
| 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 
| 3 | * All rights reserved. | 3 | * All rights reserved. | 
| 4 | * | 4 | * | 
| @@ -1127,7 +1127,6 @@ void ssl_set_cert_masks(CERT *c, const SSL_CIPHER *cipher); | |||
| 1127 | STACK_OF(SSL_CIPHER) *ssl_get_ciphers_by_id(SSL *s); | 1127 | STACK_OF(SSL_CIPHER) *ssl_get_ciphers_by_id(SSL *s); | 
| 1128 | int ssl_has_ecc_ciphers(SSL *s); | 1128 | int ssl_has_ecc_ciphers(SSL *s); | 
| 1129 | int ssl_verify_alarm_type(long type); | 1129 | int ssl_verify_alarm_type(long type); | 
| 1130 | void ssl_load_ciphers(void); | ||
| 1131 | 1130 | ||
| 1132 | int SSL_SESSION_ticket(SSL_SESSION *ss, unsigned char **out, size_t *out_len); | 1131 | int SSL_SESSION_ticket(SSL_SESSION *ss, unsigned char **out, size_t *out_len); | 
| 1133 | 1132 | ||
