Merge "Radio Interface changes to pass the encryption object, including the key,to the modem." into oc-dr1-dev
diff --git a/telephony/java/android/telephony/ImsiEncryptionInfo.java b/telephony/java/android/telephony/ImsiEncryptionInfo.java
index ecb9d25..d2680ad 100644
--- a/telephony/java/android/telephony/ImsiEncryptionInfo.java
+++ b/telephony/java/android/telephony/ImsiEncryptionInfo.java
@@ -17,6 +17,7 @@
 
 import android.os.Parcel;
 import android.os.Parcelable;
+import java.util.Date;
 import android.util.Log;
 
 import java.security.KeyFactory;
@@ -34,7 +35,6 @@
 public final class ImsiEncryptionInfo implements Parcelable {
 
     private static final String LOG_TAG = "ImsiEncryptionInfo";
-    private static final boolean DBG = false;
 
 
     private final String mcc;
@@ -42,14 +42,25 @@
     private final PublicKey publicKey;
     private final String keyIdentifier;
     private final int keyType;
+    //Date-Time in UTC when the key will expire.
+    private final Date expirationTime;
 
     public ImsiEncryptionInfo(String mcc, String mnc, int keyType, String keyIdentifier,
-                              PublicKey publicKey) {
+                              byte[] key, Date expirationTime) {
+        this(mcc, mnc, keyType, keyIdentifier, makeKeyObject(key), expirationTime);
+    }
+
+    public ImsiEncryptionInfo(String mcc, String mnc, int keyType, String keyIdentifier,
+                              PublicKey publicKey, Date expirationTime) {
+        // todo need to validate that ImsiEncryptionInfo is being created with the correct params.
+        //      Including validating that the public key is in "X.509" format. This will be done in
+        //      a subsequent CL.
         this.mcc = mcc;
         this.mnc = mnc;
         this.keyType = keyType;
         this.publicKey = publicKey;
         this.keyIdentifier = keyIdentifier;
+        this.expirationTime = expirationTime;
     }
 
     public ImsiEncryptionInfo(Parcel in) {
@@ -61,7 +72,7 @@
         mnc = in.readString();
         keyIdentifier = in.readString();
         keyType = in.readInt();
-
+        expirationTime = new Date(in.readLong());
     }
 
     public String getMnc() {
@@ -84,6 +95,10 @@
         return this.publicKey;
     }
 
+    public Date getExpirationTime() {
+        return this.expirationTime;
+    }
+
     private static PublicKey makeKeyObject(byte[] publicKeyBytes) {
         try {
             X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(publicKeyBytes);
@@ -91,7 +106,7 @@
         } catch (InvalidKeySpecException | NoSuchAlgorithmException ex) {
             Log.e(LOG_TAG, "Error makeKeyObject: unable to convert into PublicKey", ex);
         }
-     return null;
+        throw new IllegalArgumentException();
     }
 
     /** Implement the Parcelable interface */
@@ -122,6 +137,7 @@
         dest.writeString(mnc);
         dest.writeString(keyIdentifier);
         dest.writeInt(keyType);
+        dest.writeLong(expirationTime.getTime());
     }
 
     @Override
@@ -132,6 +148,7 @@
                 + "publicKey=" + publicKey
                 + ", keyIdentifier=" + keyIdentifier
                 + ", keyType=" + keyType
+                + ", expirationTime=" + expirationTime
                 + "]";
     }
 }