(X509Certificate[] chain, String server, int port)
| 370 | } |
| 371 | |
| 372 | static void verifyDane(X509Certificate[] chain, String server, int port) throws CertificateException { |
| 373 | if (!hasDnsSec()) |
| 374 | return; |
| 375 | |
| 376 | List<String> log = new ArrayList<>(); |
| 377 | |
| 378 | Handler handler = new Handler() { |
| 379 | @Override |
| 380 | public void publish(LogRecord record) { |
| 381 | log.add(record.getMessage()); |
| 382 | Log.w("DANE " + record.getMessage()); |
| 383 | } |
| 384 | |
| 385 | @Override |
| 386 | public void flush() { |
| 387 | } |
| 388 | |
| 389 | @Override |
| 390 | public void close() throws SecurityException { |
| 391 | } |
| 392 | }; |
| 393 | |
| 394 | String clazz = DaneVerifier.class.getName(); |
| 395 | try { |
| 396 | Logger.getLogger(clazz).addHandler(handler); |
| 397 | Log.w("DANE verify " + server + ":" + port); |
| 398 | |
| 399 | DnssecClient client = DnssecResolverApi.INSTANCE.getDnssecClient(); |
| 400 | |
| 401 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) |
| 402 | client.setDataSource(new AndroidDataSource()); |
| 403 | |
| 404 | client.getDataSource().setTimeout(LOOKUP_TIMEOUT * 1000); |
| 405 | |
| 406 | client.setUseHardcodedDnsServers(false); |
| 407 | |
| 408 | boolean verified = new DaneVerifier(client).verifyCertificateChain(chain, server, port); |
| 409 | Log.w("DANE verified=" + verified + " " + server + ":" + port); |
| 410 | if (!verified) |
| 411 | throw new CertificateException("DANE missing or invalid", |
| 412 | new CertificateException(TextUtils.join("\n", log))); |
| 413 | } catch (CertificateException ex) { |
| 414 | throw ex; |
| 415 | } catch (Throwable ex) { |
| 416 | throw new CertificateException("DANE error", ex); |
| 417 | } finally { |
| 418 | Logger.getLogger(clazz).removeHandler(handler); |
| 419 | } |
| 420 | } |
| 421 | |
| 422 | static List<String> getDnsServers(Context context) { |
| 423 | SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); |
no test coverage detected