1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 package org.chromium.android_webview; 6 7 import org.chromium.net.AndroidPrivateKey; 8 9 import java.util.Arrays; 10 import java.util.HashMap; 11 import java.util.HashSet; 12 import java.util.Map; 13 import java.util.Set; 14 15 /** 16 * Store user's client certificate decision for a host and port pair. Not 17 * thread-safe. All accesses are done on UI thread. 18 */ 19 public class ClientCertLookupTable { 20 21 /** 22 * A container for the certificate data. 23 */ 24 public static class Cert { 25 AndroidPrivateKey mPrivateKey; 26 byte[][] mCertChain; 27 public Cert(AndroidPrivateKey privateKey, byte[][] certChain) { 28 this.mPrivateKey = privateKey; 29 byte[][] newChain = new byte[certChain.length][]; 30 for (int i = 0; i < certChain.length; i++) { 31 newChain[i] = Arrays.copyOf(certChain[i], certChain[i].length); 32 } 33 this.mCertChain = newChain; 34 } 35 } 36 37 private final Map<String, Cert> mCerts; 38 private final Set<String> mDenieds; 39 40 // Clear client certificate preferences 41 public void clear() { 42 mCerts.clear(); 43 mDenieds.clear(); 44 } 45 46 public ClientCertLookupTable() { 47 mCerts = new HashMap<String, Cert>(); 48 mDenieds = new HashSet<String>(); 49 } 50 51 public void allow(String host, int port, AndroidPrivateKey privateKey, byte[][] chain) { 52 String host_and_port = hostAndPort(host, port); 53 mCerts.put(host_and_port, new Cert(privateKey, chain)); 54 mDenieds.remove(host_and_port); 55 } 56 57 public void deny(String host, int port) { 58 String host_and_port = hostAndPort(host, port); 59 mCerts.remove(host_and_port); 60 mDenieds.add(host_and_port); 61 } 62 63 public Cert getCertData(String host, int port) { 64 return mCerts.get(hostAndPort(host, port)); 65 } 66 67 public boolean isDenied(String host, int port) { 68 return mDenieds.contains(hostAndPort(host, port)); 69 } 70 71 // TODO(sgurun) add a test for this. Not separating host and pair properly will be 72 // a security issue. 73 private static String hostAndPort(String host, int port) { 74 return host + ":" + port; 75 } 76 } 77