| Index: android_webview/java/src/org/chromium/android_webview/AwTokenBindingManager.java | 
| diff --git a/android_webview/java/src/org/chromium/android_webview/AwTokenBindingManager.java b/android_webview/java/src/org/chromium/android_webview/AwTokenBindingManager.java | 
| index 3f2f6955739da68c98305628391f7a7ebb82c823..a622781171ed4283d393306a354cf779e65753f2 100644 | 
| --- a/android_webview/java/src/org/chromium/android_webview/AwTokenBindingManager.java | 
| +++ b/android_webview/java/src/org/chromium/android_webview/AwTokenBindingManager.java | 
| @@ -7,11 +7,27 @@ package org.chromium.android_webview; | 
| import android.net.Uri; | 
| import android.webkit.ValueCallback; | 
|  | 
| +import org.chromium.base.Log; | 
| import org.chromium.base.annotations.CalledByNative; | 
| import org.chromium.base.annotations.JNINamespace; | 
|  | 
| +import java.io.IOException; | 
| +import java.security.InvalidAlgorithmParameterException; | 
| +import java.security.InvalidKeyException; | 
| +import java.security.Key; | 
| +import java.security.KeyFactory; | 
| import java.security.KeyPair; | 
| -import java.security.spec.AlgorithmParameterSpec; | 
| +import java.security.NoSuchAlgorithmException; | 
| +import java.security.PrivateKey; | 
| +import java.security.PublicKey; | 
| +import java.security.spec.InvalidKeySpecException; | 
| +import java.security.spec.X509EncodedKeySpec; | 
| + | 
| +import javax.crypto.Cipher; | 
| +import javax.crypto.EncryptedPrivateKeyInfo; | 
| +import javax.crypto.NoSuchPaddingException; | 
| +import javax.crypto.SecretKeyFactory; | 
| +import javax.crypto.spec.PBEKeySpec; | 
|  | 
| /** | 
| * AwTokenBindingManager manages the token binding protocol. | 
| @@ -25,11 +41,16 @@ import java.security.spec.AlgorithmParameterSpec; | 
| */ | 
| @JNINamespace("android_webview") | 
| public final class AwTokenBindingManager { | 
| +    private static final String TAG = "TokenBindingManager"; | 
| +    private static final String PASSWORD = ""; | 
| +    private static final String ALGORITHM = "PBEWITHSHAAND3-KEYTRIPLEDES-CBC"; | 
| +    private static final String ELLIPTIC_CURVE = "EC"; | 
| + | 
| public void enableTokenBinding() { | 
| nativeEnableTokenBinding(); | 
| } | 
|  | 
| -    public void getKey(Uri origin, AlgorithmParameterSpec[] spec, ValueCallback<KeyPair> callback) { | 
| +    public void getKey(Uri origin, String[] spec, ValueCallback<KeyPair> callback) { | 
| if (callback == null) { | 
| throw new IllegalArgumentException("callback can't be null"); | 
| } | 
| @@ -50,8 +71,30 @@ public final class AwTokenBindingManager { | 
| } | 
|  | 
| @CalledByNative | 
| -    private static void onKeyReady(ValueCallback<KeyPair> callback) { | 
| -        callback.onReceiveValue(null); | 
| +    private static void onKeyReady( | 
| +            ValueCallback<KeyPair> callback, byte[] privateKeyBytes, byte[] publicKeyBytes) { | 
| +        if (privateKeyBytes == null || publicKeyBytes == null) { | 
| +            callback.onReceiveValue(null); | 
| +            return; | 
| +        } | 
| +        KeyPair keyPair = null; | 
| +        try { | 
| +            EncryptedPrivateKeyInfo epkInfo = new EncryptedPrivateKeyInfo(privateKeyBytes); | 
| +            SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(ALGORITHM); | 
| +            Key key = secretKeyFactory.generateSecret(new PBEKeySpec(PASSWORD.toCharArray())); | 
| +            Cipher cipher = Cipher.getInstance(ALGORITHM); | 
| +            cipher.init(Cipher.DECRYPT_MODE, key, epkInfo.getAlgParameters()); | 
| +            KeyFactory factory = KeyFactory.getInstance(ELLIPTIC_CURVE); | 
| +            PrivateKey privateKey = factory.generatePrivate(epkInfo.getKeySpec(cipher)); | 
| +            PublicKey publicKey = | 
| +                    factory.generatePublic(new X509EncodedKeySpec(publicKeyBytes)); | 
| +            keyPair = new KeyPair(publicKey, privateKey); | 
| +        } catch (NoSuchAlgorithmException | InvalidKeySpecException | IOException | 
| +                | NoSuchPaddingException | InvalidKeyException | 
| +                | InvalidAlgorithmParameterException ex) { | 
| +            Log.e(TAG, "Failed converting key ", ex); | 
| +        } | 
| +        callback.onReceiveValue(keyPair); | 
| } | 
|  | 
| @CalledByNative | 
|  |