tttls1.3 0.2.2 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +6 -0
- data/Rakefile +14 -0
- data/interop/Dockerfile +1 -1
- data/interop/client_spec.rb +15 -5
- data/interop/helper.rb +4 -0
- data/interop/server_spec.rb +24 -5
- data/lib/tttls1.3/client.rb +18 -0
- data/lib/tttls1.3/server.rb +21 -5
- data/lib/tttls1.3/version.rb +1 -1
- metadata +2 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 9b99157535ca4f2b06f4fc6d374116fbc6e496a7807184c56b31be11852d6e5f
         | 
| 4 | 
            +
              data.tar.gz: 33ff8b94d80529bcabd7c4b3d8fe5ea9ee6513d1d90f4efe307f4edf7bbfb1ac
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 29f4cd4e505e33ef0b6f03265a3ecdc8e988a32a965a9079b8c92ee57e50a6ad7e7864fb24d07a14b0ec956fce6ce1c85d9d8072e908e202393c1bd73ad54c1f
         | 
| 7 | 
            +
              data.tar.gz: c5ed00504bbdb7ee0b051a3534ab2c51bbfdbadbd703ca761fb06367b85798217b04ba7b7d1a8003aeff756d3e9b8e7b6f7c375872250de4139e7400760608d4
         | 
    
        data/.travis.yml
    CHANGED
    
    
    
        data/Rakefile
    CHANGED
    
    | @@ -128,4 +128,18 @@ end | |
| 128 128 |  | 
| 129 129 | 
             
            RuboCop::RakeTask.new
         | 
| 130 130 | 
             
            RSpec::Core::RakeTask.new(:spec)
         | 
| 131 | 
            +
             | 
| 132 | 
            +
            desc 'interoperability test: TTTLS13::Client'
         | 
| 133 | 
            +
            RSpec::Core::RakeTask.new(:interop_client) do |t|
         | 
| 134 | 
            +
              t.pattern = Dir.glob('interop/client_spec.rb')
         | 
| 135 | 
            +
            end
         | 
| 136 | 
            +
             | 
| 137 | 
            +
            desc 'interoperability test: TTTLS13::Server'
         | 
| 138 | 
            +
            RSpec::Core::RakeTask.new(:interop_server) do |t|
         | 
| 139 | 
            +
              t.pattern = Dir.glob('interop/server_spec.rb')
         | 
| 140 | 
            +
            end
         | 
| 141 | 
            +
             | 
| 142 | 
            +
            desc 'interoperability test between openssl'
         | 
| 143 | 
            +
            task interop: %i[interop_client interop_server]
         | 
| 144 | 
            +
             | 
| 131 145 | 
             
            task default: %i[rubocop spec]
         | 
    
        data/interop/Dockerfile
    CHANGED
    
    
    
        data/interop/client_spec.rb
    CHANGED
    
    | @@ -4,6 +4,7 @@ | |
| 4 4 | 
             
            require_relative 'helper'
         | 
| 5 5 |  | 
| 6 6 | 
             
            FIXTURES_DIR = __dir__ + '/../spec/fixtures'
         | 
| 7 | 
            +
            PORT = 4433
         | 
| 7 8 |  | 
| 8 9 | 
             
            RSpec.describe Client do
         | 
| 9 10 | 
             
              # testcases
         | 
| @@ -147,28 +148,37 @@ RSpec.describe Client do | |
| 147 148 | 
             
                  'rsa_rsa.crt',
         | 
| 148 149 | 
             
                  'rsa_rsa.key',
         | 
| 149 150 | 
             
                  key_share_groups: []
         | 
| 151 | 
            +
                ],
         | 
| 152 | 
            +
                [
         | 
| 153 | 
            +
                  true,
         | 
| 154 | 
            +
                  '-alpn http/1.1',
         | 
| 155 | 
            +
                  'rsa_rsa.crt',
         | 
| 156 | 
            +
                  'rsa_rsa.key',
         | 
| 157 | 
            +
                  alpn: ['http/1.1']
         | 
| 150 158 | 
             
                ]
         | 
| 151 159 | 
             
                # rubocop: enable Metrics/LineLength
         | 
| 152 160 | 
             
              ].each do |normal, opt, crt, key, settings|
         | 
| 153 161 | 
             
                context 'client interop' do
         | 
| 154 162 | 
             
                  before do
         | 
| 155 | 
            -
                    cmd =  | 
| 156 | 
            -
                          + 'openssl s_server ' \
         | 
| 163 | 
            +
                    cmd = 'openssl s_server ' \
         | 
| 157 164 | 
             
                          + "-cert /tmp/#{crt} " \
         | 
| 158 165 | 
             
                          + "-key /tmp/#{key} " \
         | 
| 159 166 | 
             
                          + '-tls1_3 ' \
         | 
| 160 167 | 
             
                          + '-www ' \
         | 
| 161 168 | 
             
                          + '-quiet ' \
         | 
| 162 169 | 
             
                          + opt
         | 
| 163 | 
            -
                    pid = spawn( | 
| 170 | 
            +
                    pid = spawn('docker run ' \
         | 
| 171 | 
            +
                                + "--volume #{FIXTURES_DIR}:/tmp " \
         | 
| 172 | 
            +
                                + "--publish #{PORT}:#{PORT} " \
         | 
| 173 | 
            +
                                + 'openssl ' + cmd)
         | 
| 164 174 | 
             
                    Process.detach(pid)
         | 
| 165 175 |  | 
| 166 | 
            -
                     | 
| 176 | 
            +
                    wait_to_listen(PORT)
         | 
| 167 177 | 
             
                  end
         | 
| 168 178 |  | 
| 169 179 | 
             
                  let(:client) do
         | 
| 170 180 | 
             
                    hostname = 'localhost'
         | 
| 171 | 
            -
                    @socket = TCPSocket.new(hostname,  | 
| 181 | 
            +
                    @socket = TCPSocket.new(hostname, PORT)
         | 
| 172 182 | 
             
                    settings[:ca_file] = FIXTURES_DIR + '/rsa_ca.crt'
         | 
| 173 183 | 
             
                    Client.new(@socket, hostname, settings)
         | 
| 174 184 | 
             
                  end
         | 
    
        data/interop/helper.rb
    CHANGED
    
    
    
        data/interop/server_spec.rb
    CHANGED
    
    | @@ -4,7 +4,9 @@ | |
| 4 4 | 
             
            require_relative 'helper'
         | 
| 5 5 |  | 
| 6 6 | 
             
            FIXTURES_DIR = __dir__ + '/../spec/fixtures'
         | 
| 7 | 
            -
             | 
| 7 | 
            +
            PORT = 4433
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            tcpserver = TCPServer.open(PORT)
         | 
| 8 10 |  | 
| 9 11 | 
             
            RSpec.describe Server do
         | 
| 10 12 | 
             
              # testcases
         | 
| @@ -141,6 +143,20 @@ RSpec.describe Server do | |
| 141 143 | 
             
                  FIXTURES_DIR + '/rsa_rsa.crt',
         | 
| 142 144 | 
             
                  FIXTURES_DIR + '/rsa_rsa.key',
         | 
| 143 145 | 
             
                  {}
         | 
| 146 | 
            +
                ],
         | 
| 147 | 
            +
                [
         | 
| 148 | 
            +
                  true,
         | 
| 149 | 
            +
                  '-groups P-256:P-384:P-521 -alpn http/1.1',
         | 
| 150 | 
            +
                  FIXTURES_DIR + '/rsa_rsa.crt',
         | 
| 151 | 
            +
                  FIXTURES_DIR + '/rsa_rsa.key',
         | 
| 152 | 
            +
                  alpn: 'http/1.1'
         | 
| 153 | 
            +
                ],
         | 
| 154 | 
            +
                [
         | 
| 155 | 
            +
                  false,
         | 
| 156 | 
            +
                  '-groups P-256:P-384:P-521 -alpn foo',
         | 
| 157 | 
            +
                  FIXTURES_DIR + '/rsa_rsa.crt',
         | 
| 158 | 
            +
                  FIXTURES_DIR + '/rsa_rsa.key',
         | 
| 159 | 
            +
                  alpn: 'http/1.1'
         | 
| 144 160 | 
             
                ]
         | 
| 145 161 | 
             
                # rubocop: enable Metrics/LineLength
         | 
| 146 162 | 
             
              ].each do |normal, opt, crt, key, settings|
         | 
| @@ -153,15 +169,18 @@ RSpec.describe Server do | |
| 153 169 | 
             
                  end
         | 
| 154 170 |  | 
| 155 171 | 
             
                  let(:client) do
         | 
| 172 | 
            +
                    wait_to_listen(PORT)
         | 
| 173 | 
            +
             | 
| 156 174 | 
             
                    ip = Socket.ip_address_list.find(&:ipv4_private?).ip_address
         | 
| 157 175 | 
             
                    cmd = 'echo -n ping | openssl s_client ' \
         | 
| 158 | 
            -
                          +  | 
| 176 | 
            +
                          + "-connect local:#{PORT} " \
         | 
| 159 177 | 
             
                          + '-tls1_3 ' \
         | 
| 160 178 | 
             
                          + '-CAfile /tmp/rsa_ca.crt ' \
         | 
| 161 179 | 
             
                          + '-servername localhost ' \
         | 
| 162 180 | 
             
                          + '-quiet ' \
         | 
| 163 181 | 
             
                          + opt
         | 
| 164 | 
            -
                     | 
| 182 | 
            +
                    'docker run ' \
         | 
| 183 | 
            +
                    + "--volume #{FIXTURES_DIR}:/tmp " \
         | 
| 165 184 | 
             
                    + "--add-host=local:#{ip} -it openssl " \
         | 
| 166 185 | 
             
                    + "sh -c \"#{cmd}\" 2>&1 >/dev/null"
         | 
| 167 186 | 
             
                  end
         | 
| @@ -173,7 +192,7 @@ RSpec.describe Server do | |
| 173 192 |  | 
| 174 193 | 
             
                  if normal
         | 
| 175 194 | 
             
                    it "should accept request from openssl s_client ...#{opt}" do
         | 
| 176 | 
            -
                      spawn( | 
| 195 | 
            +
                      spawn(client)
         | 
| 177 196 | 
             
                      expect { server.accept }.to_not raise_error
         | 
| 178 197 | 
             
                      expect(server.read).to include 'ping'
         | 
| 179 198 | 
             
                      expect { server.write('pong') }.to_not raise_error
         | 
| @@ -181,7 +200,7 @@ RSpec.describe Server do | |
| 181 200 | 
             
                    end
         | 
| 182 201 | 
             
                  else # exceptions scenarios
         | 
| 183 202 | 
             
                    it "should NOT accept request from openssl s_client ...#{opt}" do
         | 
| 184 | 
            -
                      spawn( | 
| 203 | 
            +
                      spawn(client)
         | 
| 185 204 | 
             
                      expect { server.accept }.to raise_error ErrorAlerts
         | 
| 186 205 | 
             
                    end
         | 
| 187 206 | 
             
                  end
         | 
    
        data/lib/tttls1.3/client.rb
    CHANGED
    
    | @@ -50,6 +50,7 @@ module TTTLS13 | |
| 50 50 | 
             
                signature_algorithms_cert: nil,
         | 
| 51 51 | 
             
                supported_groups: DEFAULT_CH_NAMED_GROUP_LIST,
         | 
| 52 52 | 
             
                key_share_groups: nil,
         | 
| 53 | 
            +
                alpn: nil,
         | 
| 53 54 | 
             
                process_new_session_ticket: nil,
         | 
| 54 55 | 
             
                ticket: nil,
         | 
| 55 56 | 
             
                resumption_master_secret: nil,
         | 
| @@ -280,6 +281,10 @@ module TTTLS13 | |
| 280 281 | 
             
                      @succeed_early_data = true \
         | 
| 281 282 | 
             
                        if ee.extensions.include?(Message::ExtensionType::EARLY_DATA)
         | 
| 282 283 |  | 
| 284 | 
            +
                      @alpn = ee.extensions[
         | 
| 285 | 
            +
                        Message::ExtensionType::APPLICATION_LAYER_PROTOCOL_NEGOTIATION
         | 
| 286 | 
            +
                      ]&.protocol_name_list&.first
         | 
| 287 | 
            +
             | 
| 283 288 | 
             
                      @state = ClientState::WAIT_CERT_CR
         | 
| 284 289 | 
             
                      @state = ClientState::WAIT_FINISHED unless psk.nil?
         | 
| 285 290 | 
             
                    when ClientState::WAIT_CERT_CR
         | 
| @@ -397,6 +402,11 @@ module TTTLS13 | |
| 397 402 | 
             
                  @succeed_early_data
         | 
| 398 403 | 
             
                end
         | 
| 399 404 |  | 
| 405 | 
            +
                # @return [String]
         | 
| 406 | 
            +
                def negotiated_alpn
         | 
| 407 | 
            +
                  @alpn
         | 
| 408 | 
            +
                end
         | 
| 409 | 
            +
             | 
| 400 410 | 
             
                private
         | 
| 401 411 |  | 
| 402 412 | 
             
                # @return [Boolean]
         | 
| @@ -471,6 +481,8 @@ module TTTLS13 | |
| 471 481 |  | 
| 472 482 | 
             
                # @return [TTTLS13::Message::Extensions]
         | 
| 473 483 | 
             
                # @return [Hash of NamedGroup => OpenSSL::PKey::EC.$Object]
         | 
| 484 | 
            +
                # rubocop: disable Metrics/AbcSize
         | 
| 485 | 
            +
                # rubocop: disable Metrics/CyclomaticComplexity
         | 
| 474 486 | 
             
                def gen_ch_extensions
         | 
| 475 487 | 
             
                  exs = []
         | 
| 476 488 | 
             
                  # supported_versions: only TLS 1.3
         | 
| @@ -507,8 +519,14 @@ module TTTLS13 | |
| 507 519 | 
             
                  # early_data
         | 
| 508 520 | 
             
                  exs << Message::Extension::EarlyDataIndication.new if use_early_data?
         | 
| 509 521 |  | 
| 522 | 
            +
                  # alpn
         | 
| 523 | 
            +
                  exs << Message::Extension::Alpn.new(@settings[:alpn].reject(&:empty?)) \
         | 
| 524 | 
            +
                    if !@settings[:alpn].nil? && !@settings[:alpn].empty?
         | 
| 525 | 
            +
             | 
| 510 526 | 
             
                  [Message::Extensions.new(exs), priv_keys]
         | 
| 511 527 | 
             
                end
         | 
| 528 | 
            +
                # rubocop: enable Metrics/AbcSize
         | 
| 529 | 
            +
                # rubocop: enable Metrics/CyclomaticComplexity
         | 
| 512 530 |  | 
| 513 531 | 
             
                # @param extensions [TTTLS13::Message::Extensions]
         | 
| 514 532 | 
             
                # @param binder_key [String, nil]
         | 
    
        data/lib/tttls1.3/server.rb
    CHANGED
    
    | @@ -50,6 +50,7 @@ module TTTLS13 | |
| 50 50 | 
             
                cipher_suites: DEFAULT_SP_CIPHER_SUITES,
         | 
| 51 51 | 
             
                signature_algorithms: DEFAULT_SP_SIGNATURE_ALGORITHMS,
         | 
| 52 52 | 
             
                supported_groups: DEFAULT_SP_NAMED_GROUP_LIST,
         | 
| 53 | 
            +
                alpn: nil,
         | 
| 53 54 | 
             
                loglevel: Logger::WARN
         | 
| 54 55 | 
             
              }.freeze
         | 
| 55 56 | 
             
              private_constant :DEFAULT_SERVER_SETTINGS
         | 
| @@ -151,6 +152,16 @@ module TTTLS13 | |
| 151 152 | 
             
                      terminate(:illegal_parameter) unless ch.valid_key_share?
         | 
| 152 153 | 
             
                      terminate(:unrecognized_name) unless recognized_server_name?(ch, @crt)
         | 
| 153 154 |  | 
| 155 | 
            +
                      # alpn
         | 
| 156 | 
            +
                      if !@settings[:alpn].nil? && !@settings[:alpn].empty?
         | 
| 157 | 
            +
                        pnl = ch.extensions[
         | 
| 158 | 
            +
                          Message::ExtensionType::APPLICATION_LAYER_PROTOCOL_NEGOTIATION
         | 
| 159 | 
            +
                        ]&.protocol_name_list || []
         | 
| 160 | 
            +
                        @alpn = pnl.find { |p| @settings[:alpn].include?(p) }
         | 
| 161 | 
            +
             | 
| 162 | 
            +
                        terminate(:no_application_protocol) if @alpn.nil?
         | 
| 163 | 
            +
                      end
         | 
| 164 | 
            +
             | 
| 154 165 | 
             
                      @state = ServerState::RECVD_CH
         | 
| 155 166 | 
             
                    when ServerState::RECVD_CH
         | 
| 156 167 | 
             
                      logger.debug('ServerState::RECVD_CH')
         | 
| @@ -209,7 +220,7 @@ module TTTLS13 | |
| 209 220 | 
             
                      logger.debug('ServerState::WAIT_FLIGHT2')
         | 
| 210 221 |  | 
| 211 222 | 
             
                      ch = transcript[CH]
         | 
| 212 | 
            -
                      ee = transcript[EE] = gen_encrypted_extensions(ch)
         | 
| 223 | 
            +
                      ee = transcript[EE] = gen_encrypted_extensions(ch, @alpn)
         | 
| 213 224 | 
             
                      # TODO: [Send CertificateRequest]
         | 
| 214 225 | 
             
                      ct = transcript[CT] = gen_certificate(@crt)
         | 
| 215 226 | 
             
                      digest = CipherSuite.digest(@cipher_suite)
         | 
| @@ -335,9 +346,9 @@ module TTTLS13 | |
| 335 346 | 
             
                  ksg = sp_groups.find do |g|
         | 
| 336 347 | 
             
                    !ks_groups.include?(g) && @settings[:supported_groups].include?(g)
         | 
| 337 348 | 
             
                  end
         | 
| 349 | 
            +
                  exs << Message::Extension::KeyShare.gen_hrr_key_share(ksg)
         | 
| 338 350 |  | 
| 339 351 | 
             
                  # TODO: cookie
         | 
| 340 | 
            -
                  exs << Message::Extension::KeyShare.gen_hrr_key_share(ksg)
         | 
| 341 352 |  | 
| 342 353 | 
             
                  sh = Message::ServerHello.new(
         | 
| 343 354 | 
             
                    random: Message::HRR_RANDOM,
         | 
| @@ -363,10 +374,11 @@ module TTTLS13 | |
| 363 374 | 
             
                end
         | 
| 364 375 |  | 
| 365 376 | 
             
                # @param ch [TTTLS13::Message::ClientHello]
         | 
| 377 | 
            +
                # @param alpn [String]
         | 
| 366 378 | 
             
                #
         | 
| 367 379 | 
             
                # @return [TTTLS13::Message::EncryptedExtensions]
         | 
| 368 | 
            -
                def gen_encrypted_extensions(ch)
         | 
| 369 | 
            -
                  Message::EncryptedExtensions.new(gen_ee_extensions(ch))
         | 
| 380 | 
            +
                def gen_encrypted_extensions(ch, alpn = nil)
         | 
| 381 | 
            +
                  Message::EncryptedExtensions.new(gen_ee_extensions(ch, alpn))
         | 
| 370 382 | 
             
                end
         | 
| 371 383 |  | 
| 372 384 | 
             
                # @param crt [OpenSSL::X509::Certificate]
         | 
| @@ -424,9 +436,10 @@ module TTTLS13 | |
| 424 436 | 
             
                end
         | 
| 425 437 |  | 
| 426 438 | 
             
                # @param ch [TTTLS13::Message::ClientHello]
         | 
| 439 | 
            +
                # @param alpn [String]
         | 
| 427 440 | 
             
                #
         | 
| 428 441 | 
             
                # @return [TTTLS13::Message::Extensions]
         | 
| 429 | 
            -
                def gen_ee_extensions(ch)
         | 
| 442 | 
            +
                def gen_ee_extensions(ch, alpn)
         | 
| 430 443 | 
             
                  exs = []
         | 
| 431 444 |  | 
| 432 445 | 
             
                  # server_name
         | 
| @@ -437,6 +450,9 @@ module TTTLS13 | |
| 437 450 | 
             
                  exs \
         | 
| 438 451 | 
             
                  << Message::Extension::SupportedGroups.new(@settings[:supported_groups])
         | 
| 439 452 |  | 
| 453 | 
            +
                  # alpn
         | 
| 454 | 
            +
                  exs << Message::Extension::Alpn.new([alpn]) unless alpn.nil?
         | 
| 455 | 
            +
             | 
| 440 456 | 
             
                  Message::Extensions.new(exs)
         | 
| 441 457 | 
             
                end
         | 
| 442 458 |  | 
    
        data/lib/tttls1.3/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: tttls1.3
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.2. | 
| 4 | 
            +
              version: 0.2.3
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - thekuwayama
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2019- | 
| 11 | 
            +
            date: 2019-06-11 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: bundler
         |