@@ -651,6 +651,122 @@ static void *tls_context_create(int verify,
651
651
return NULL ;
652
652
}
653
653
654
+ #if !defined(TLS1_3_VERSION )
655
+ # define TLS1_3_VERSION 0x0304
656
+ #endif
657
+
658
+ struct tls_proto_def {
659
+ char * name ;
660
+ int ver ;
661
+ };
662
+
663
+ struct tls_proto_options {
664
+ int ver ;
665
+ int no_opt ;
666
+ };
667
+
668
+ static int parse_proto_version (const char * proto_ver )
669
+ {
670
+ int i ;
671
+ struct tls_proto_def defs [] = {
672
+ { "SSLv2" , SSL2_VERSION },
673
+ { "SSLv3" , SSL3_VERSION },
674
+ { "TLSv1" , TLS1_VERSION },
675
+ { "TLSv1.1" , TLS1_1_VERSION },
676
+ { "TLSv1.2" , TLS1_2_VERSION },
677
+ #if defined(TLS1_3_VERSION )
678
+ { "TLSv1.3" , TLS1_3_VERSION },
679
+ #endif
680
+ { NULL , 0 },
681
+ };
682
+
683
+ if (proto_ver == NULL ) {
684
+ return 0 ;
685
+ }
686
+
687
+ for (i = 0 ; i < sizeof (defs ) / sizeof (struct tls_proto_def ); i ++ ) {
688
+ if (strncasecmp (defs [i ].name , proto_ver , strlen (proto_ver )) == 0 ) {
689
+ return defs [i ].ver ;
690
+ }
691
+ }
692
+
693
+ return -1 ;
694
+ }
695
+
696
+ #if defined(TLS1_3_VERSION )
697
+ #define DEFAULT_MAX_VERSION TLS1_3_VERSION
698
+ #else
699
+ #define DEFAULT_MAX_VERSION TLS1_2_VERSION
700
+ #endif
701
+
702
+ static int tls_set_minmax_proto (struct flb_tls * tls ,
703
+ const char * min_version ,
704
+ const char * max_version )
705
+ {
706
+ int i ;
707
+ unsigned long sum = 0 , opts = 0 ;
708
+ int min = TLS1_1_VERSION ;
709
+ int max = DEFAULT_MAX_VERSION ;
710
+ int val = -1 ;
711
+ struct tls_context * ctx = tls -> ctx ;
712
+
713
+ struct tls_proto_options tls_options [] = {
714
+ { SSL2_VERSION , SSL_OP_NO_SSLv2 },
715
+ { SSL3_VERSION , SSL_OP_NO_SSLv3 },
716
+ { TLS1_VERSION , SSL_OP_NO_TLSv1 },
717
+ { TLS1_1_VERSION , SSL_OP_NO_TLSv1_1 },
718
+ { TLS1_2_VERSION , SSL_OP_NO_TLSv1_2 },
719
+ #if defined(TLS1_3_VERSION ) && defined (SSL_OP_NO_TLSv1_3 )
720
+ { TLS1_3_VERSION , SSL_OP_NO_TLSv1_3 },
721
+ #endif
722
+ };
723
+
724
+ if (!ctx ) {
725
+ return -1 ;
726
+ }
727
+
728
+ val = parse_proto_version (min_version );
729
+ if (val >= 0 ) {
730
+ min = val ;
731
+ }
732
+
733
+ val = parse_proto_version (max_version );
734
+ if (val >= 0 ) {
735
+ max = val ;
736
+ }
737
+
738
+ pthread_mutex_lock (& ctx -> mutex );
739
+
740
+ for (i = 0 ; i < sizeof (tls_options ) / sizeof (struct tls_proto_options ); i ++ ) {
741
+ sum |= tls_options [i ].no_opt ;
742
+ if ((min && min > tls_options [i ].ver ) ||
743
+ (max && max < tls_options [i ].ver )) {
744
+ opts |= tls_options [i ].no_opt ;
745
+ }
746
+ }
747
+ SSL_CTX_clear_options (ctx -> ctx , sum );
748
+ SSL_CTX_set_options (ctx -> ctx , opts );
749
+
750
+ pthread_mutex_unlock (& ctx -> mutex );
751
+
752
+ return 0 ;
753
+ }
754
+
755
+ static int tls_set_ciphers (struct flb_tls * tls , const char * ciphers )
756
+ {
757
+ struct tls_context * ctx = tls -> ctx ;
758
+
759
+ pthread_mutex_lock (& ctx -> mutex );
760
+
761
+ if (!SSL_CTX_set_cipher_list (ctx -> ctx , ciphers )) {
762
+ return -1 ;
763
+ }
764
+
765
+ pthread_mutex_unlock (& ctx -> mutex );
766
+
767
+ return 0 ;
768
+ }
769
+
654
770
static void * tls_session_create (struct flb_tls * tls ,
655
771
int fd )
656
772
{
@@ -1043,6 +1159,8 @@ static struct flb_tls_backend tls_openssl = {
1043
1159
.context_destroy = tls_context_destroy ,
1044
1160
.context_alpn_set = tls_context_alpn_set ,
1045
1161
.session_alpn_get = tls_session_alpn_get ,
1162
+ .set_minmax_proto = tls_set_minmax_proto ,
1163
+ .set_ciphers = tls_set_ciphers ,
1046
1164
.session_create = tls_session_create ,
1047
1165
.session_destroy = tls_session_destroy ,
1048
1166
.net_read = tls_net_read ,
0 commit comments