Merge "Add Unix_time and STORAGE_ENCRYPTION_BINDING_SEED" into sc-dev
diff --git a/car-lib/api/current.txt b/car-lib/api/current.txt
index 8f32e14..8d812f8 100644
--- a/car-lib/api/current.txt
+++ b/car-lib/api/current.txt
@@ -349,10 +349,12 @@
     field @RequiresPermission("android.car.permission.CONTROL_CAR_SEATS") public static final int SEAT_OCCUPANCY = 356518832; // 0x15400bb0
     field @RequiresPermission("android.car.permission.CONTROL_CAR_SEATS") public static final int SEAT_TILT_MOVE = 356518800; // 0x15400b90
     field @RequiresPermission("android.car.permission.CONTROL_CAR_SEATS") public static final int SEAT_TILT_POS = 356518799; // 0x15400b8f
+    field @RequiresPermission("android.car.permission.STORAGE_ENCRYPTION_BINDING_SEED") public static final int STORAGE_ENCRYPTION_BINDING_SEED = 292554247; // 0x11700607
     field @RequiresPermission("android.car.permission.CAR_TIRES") public static final int TIRE_PRESSURE = 392168201; // 0x17600309
     field @RequiresPermission.Read(@androidx.annotation.RequiresPermission(android.car.Car.PERMISSION_READ_DISPLAY_UNITS)) @RequiresPermission.Write(@androidx.annotation.RequiresPermission(allOf={android.car.Car.PERMISSION_CONTROL_DISPLAY_UNITS, "android.car.permission.CAR_VENDOR_EXTENSION"})) public static final int TIRE_PRESSURE_DISPLAY_UNITS = 289408514; // 0x11400602
     field @RequiresPermission("android.car.permission.CAR_DYNAMICS_STATE") public static final int TRACTION_CONTROL_ACTIVE = 287310859; // 0x1120040b
     field @RequiresPermission("android.car.permission.CAR_EXTERIOR_LIGHTS") public static final int TURN_SIGNAL_STATE = 289408008; // 0x11400408
+    field @RequiresPermission("android.car.permission.CAR_UNIX_TIME") public static final int UNIX_TIME = 290457094; // 0x11500606
     field @RequiresPermission(anyOf={"android.car.permission.VMS_PUBLISHER", "android.car.permission.VMS_SUBSCRIBER"}) public static final int VEHICLE_MAP_SERVICE = 299895808; // 0x11e00c00
     field @RequiresPermission(android.car.Car.PERMISSION_SPEED) public static final int WHEEL_TICK = 290521862; // 0x11510306
     field @RequiresPermission("android.car.permission.CONTROL_CAR_WINDOWS") public static final int WINDOW_LOCK = 320867268; // 0x13200bc4
diff --git a/car-lib/api/system-current.txt b/car-lib/api/system-current.txt
index 38926ca..6096688 100644
--- a/car-lib/api/system-current.txt
+++ b/car-lib/api/system-current.txt
@@ -45,6 +45,7 @@
     field public static final String PERMISSION_CAR_PROJECTION = "android.car.permission.CAR_PROJECTION";
     field public static final String PERMISSION_CAR_PROJECTION_STATUS = "android.car.permission.ACCESS_CAR_PROJECTION_STATUS";
     field public static final String PERMISSION_CAR_TEST_SERVICE = "android.car.permission.CAR_TEST_SERVICE";
+    field public static final String PERMISSION_CAR_UNIX_TIME = "android.car.permission.CAR_UNIX_TIME";
     field public static final String PERMISSION_COLLECT_CAR_WATCHDOG_METRICS = "android.car.permission.COLLECT_CAR_WATCHDOG_METRICS";
     field public static final String PERMISSION_CONTROL_APP_BLOCKING = "android.car.permission.CONTROL_APP_BLOCKING";
     field public static final String PERMISSION_CONTROL_CAR_CLIMATE = "android.car.permission.CONTROL_CAR_CLIMATE";
@@ -65,6 +66,7 @@
     field public static final String PERMISSION_READ_CAR_OCCUPANT_AWARENESS_STATE = "android.car.permission.READ_CAR_OCCUPANT_AWARENESS_STATE";
     field public static final String PERMISSION_READ_CAR_VENDOR_PERMISSION_INFO = "android.car.permission.READ_CAR_VENDOR_PERMISSION_INFO";
     field public static final String PERMISSION_RECEIVE_CAR_AUDIO_DUCKING_EVENTS = "android.car.permission.RECEIVE_CAR_AUDIO_DUCKING_EVENTS";
+    field public static final String PERMISSION_STORAGE_ENCRYPTION_BINDING_SEED = "android.car.permission.STORAGE_ENCRYPTION_BINDING_SEED";
     field public static final String PERMISSION_STORAGE_MONITORING = "android.car.permission.STORAGE_MONITORING";
     field public static final String PERMISSION_TEMPLATE_RENDERER = "android.car.permission.TEMPLATE_RENDERER";
     field public static final String PERMISSION_TIRES = "android.car.permission.CAR_TIRES";
diff --git a/car-lib/src/android/car/Car.java b/car-lib/src/android/car/Car.java
index 8aa8bf9..5ee38ce 100644
--- a/car-lib/src/android/car/Car.java
+++ b/car-lib/src/android/car/Car.java
@@ -527,6 +527,22 @@
     public static final String PERMISSION_TIRES = "android.car.permission.CAR_TIRES";
 
     /**
+     * Permission necessary to access car's property {@link VehiclePropertyIds#UNIX_TIME}.
+     * @hide
+     */
+    @SystemApi
+    public static final String PERMISSION_CAR_UNIX_TIME = "android.car.permission.CAR_UNIX_TIME";
+
+    /**
+     * Permission necessary to access car's property
+     * {@link VehiclePropertyIds#STORAGE_ENCRYPTION_BINDING_SEED}.
+     * @hide
+     */
+    @SystemApi
+    public static final String PERMISSION_STORAGE_ENCRYPTION_BINDING_SEED =
+            "android.car.permission.STORAGE_ENCRYPTION_BINDING_SEED";
+
+    /**
      * Permission necessary to access car's steering angle information.
      */
     public static final String PERMISSION_READ_STEERING_STATE =
diff --git a/car-lib/src/android/car/VehiclePropertyIds.java b/car-lib/src/android/car/VehiclePropertyIds.java
index 4961662..0d2d3f0 100644
--- a/car-lib/src/android/car/VehiclePropertyIds.java
+++ b/car-lib/src/android/car/VehiclePropertyIds.java
@@ -1170,6 +1170,25 @@
     public static final int CLUSTER_NAVIGATION_STATE_LEGACY = 292556600;
 
     /**
+     * Current date and time, encoded as Unix time.
+     *
+     * <p>This value denotes the number of milliseconds that have elapsed since 1/1/1970 UTC.
+     */
+    @RequiresPermission(Car.PERMISSION_CAR_UNIX_TIME)
+    public static final int UNIX_TIME = 290457094;
+
+    /**
+     * External encryption binding seed.
+     *
+     * <p>This value is mixed with the local storage encryption seed. This property holds 16 bytes,
+     * and is expected to be persisted on an ECU separate from the IVI. The property is initially
+     * set by AAOS, who generates it using a CSRNG. AAOS will then read the property on subsequent
+     * boots.
+     */
+    @RequiresPermission(Car.PERMISSION_STORAGE_ENCRYPTION_BINDING_SEED)
+    public static final int STORAGE_ENCRYPTION_BINDING_SEED = 292554247;
+
+    /**
      * Gets a user-friendly representation of a property.
      */
     public static String toString(int property) {
@@ -1470,6 +1489,10 @@
                 return "CLUSTER_REQUEST_DISPLAY";
             case CLUSTER_NAVIGATION_STATE_LEGACY:
                 return "CLUSTER_NAVIGATION_STATE_LEGACY";
+            case UNIX_TIME:
+                return "UNIX_TIME";
+            case STORAGE_ENCRYPTION_BINDING_SEED:
+                return "STORAGE_ENCRYPTION_BINDING_SEED";
             default:
                 return "0x" + Integer.toHexString(property);
         }
diff --git a/service/AndroidManifest.xml b/service/AndroidManifest.xml
index bb462ca..43423ae 100644
--- a/service/AndroidManifest.xml
+++ b/service/AndroidManifest.xml
@@ -246,6 +246,22 @@
          android:label="@string/car_permission_label_car_exterior_environment"
          android:description="@string/car_permission_desc_car_exterior_environment"/>
 
+    <!-- Allows an application to read and write car's unix time.
+         <p>Protection level: signature|privileged
+    -->
+    <permission android:name="android.car.permission.CAR_UNIX_TIME"
+                android:protectionLevel="signature|privileged"
+                android:label="@string/car_permission_label_car_unix_time"
+                android:description="@string/car_permission_desc_car_unix_time"/>
+
+    <!-- Allows an application to read and write car's storage encryption binding seed.
+         <p>Protection level: signature|privileged
+    -->
+    <permission android:name="android.car.permission.STORAGE_ENCRYPTION_BINDING_SEED"
+                android:protectionLevel="signature|privileged"
+                android:label="@string/car_permission_label_encryption_binding_seed"
+                android:description="@string/car_permission_desc_encryption_binding_seed"/>
+
     <!-- Allows an application to read the vehicle exterior lights state.
          <p>Protection level: signature|privileged
     -->
diff --git a/service/res/values/strings.xml b/service/res/values/strings.xml
index 5c43400..e5b9292 100644
--- a/service/res/values/strings.xml
+++ b/service/res/values/strings.xml
@@ -240,6 +240,16 @@
     <!-- Permission text: apps access car's exterior lights state [CHAR LIMIT=NONE] -->
     <string name="car_permission_desc_car_exterior_lights">Access car\u2019s exterior lights state.</string>
 
+    <!-- Permission text: apps access car's UNIX time [CHAR LIMIT=NONE] -->
+    <string name="car_permission_label_car_unix_time">access car\u2019s UNIX time</string>
+    <!-- Permission text: apps access car's UNIX time [CHAR LIMIT=NONE] -->
+    <string name="car_permission_desc_car_unix_time">Access car\u2019s UNIX time.</string>
+
+    <!-- Permission text: apps access car's encryption binding seed [CHAR LIMIT=NONE] -->
+    <string name="car_permission_label_encryption_binding_seed">access car\u2019s encryption binding seed </string>
+    <!-- Permission text: apps access car's encryption binding seed [CHAR LIMIT=NONE] -->
+    <string name="car_permission_desc_encryption_binding_seed">Access car\u2019s encryption binding seed.</string>
+
     <!-- Permission text: apps control car's exterior lights [CHAR LIMIT=NONE] -->
     <string name="car_permission_label_control_car_exterior_lights">read car\u2019s exterior lights</string>
     <!-- Permission text: apps control car's exterior lights [CHAR LIMIT=NONE] -->
diff --git a/service/src/com/android/car/hal/PropertyHalServiceIds.java b/service/src/com/android/car/hal/PropertyHalServiceIds.java
index 2c61640..51cfe12 100644
--- a/service/src/com/android/car/hal/PropertyHalServiceIds.java
+++ b/service/src/com/android/car/hal/PropertyHalServiceIds.java
@@ -509,6 +509,12 @@
         mProps.put(VehicleProperty.CABIN_LIGHTS_SWITCH, new Pair<>(
                 Car.PERMISSION_CONTROL_INTERIOR_LIGHTS,
                 Car.PERMISSION_CONTROL_INTERIOR_LIGHTS));
+        mProps.put(VehicleProperty.UNIX_TIME, new Pair<>(
+                Car.PERMISSION_CAR_UNIX_TIME,
+                Car.PERMISSION_CAR_UNIX_TIME));
+        mProps.put(VehicleProperty.STORAGE_ENCRYPTION_BINDING_SEED, new Pair<>(
+                Car.PERMISSION_STORAGE_ENCRYPTION_BINDING_SEED,
+                Car.PERMISSION_STORAGE_ENCRYPTION_BINDING_SEED));
         // Display_Units
         mProps.put(VehicleProperty.DISTANCE_DISPLAY_UNITS, new Pair<>(
                 Car.PERMISSION_READ_DISPLAY_UNITS,
diff --git a/tests/CarSecurityPermissionTest/src/com/android/car/CarPropertyManagerPublicPermissionTest.java b/tests/CarSecurityPermissionTest/src/com/android/car/CarPropertyManagerPublicPermissionTest.java
index 699301f..ecf7c25 100644
--- a/tests/CarSecurityPermissionTest/src/com/android/car/CarPropertyManagerPublicPermissionTest.java
+++ b/tests/CarSecurityPermissionTest/src/com/android/car/CarPropertyManagerPublicPermissionTest.java
@@ -196,6 +196,9 @@
         mProps.add(VehiclePropertyIds.EV_BATTERY_DISPLAY_UNITS);
         mProps.add(VehiclePropertyIds.FUEL_CONSUMPTION_UNITS_DISTANCE_OVER_VOLUME);
         mProps.add(VehiclePropertyIds.VEHICLE_SPEED_DISPLAY_UNITS);
+        // Properties in S
+        mProps.add(VehiclePropertyIds.UNIX_TIME);
+        mProps.add(VehiclePropertyIds.STORAGE_ENCRYPTION_BINDING_SEED);
     }
 
     @After
diff --git a/tests/android_car_api_test/src/android/car/apitest/VehiclePropertyIdsTest.java b/tests/android_car_api_test/src/android/car/apitest/VehiclePropertyIdsTest.java
index 52477b3..0681985 100644
--- a/tests/android_car_api_test/src/android/car/apitest/VehiclePropertyIdsTest.java
+++ b/tests/android_car_api_test/src/android/car/apitest/VehiclePropertyIdsTest.java
@@ -334,6 +334,10 @@
         assertEquals("USER_IDENTIFICATION_ASSOCIATION",
                 VehiclePropertyIds.toString(VehiclePropertyIds.USER_IDENTIFICATION_ASSOCIATION));
         assertEquals("0x3", VehiclePropertyIds.toString(3));
+        // Properties in S
+        assertEquals("UNIX_TIME", VehiclePropertyIds.toString(VehiclePropertyIds.UNIX_TIME));
+        assertEquals("STORAGE_ENCRYPTION_BINDING_SEED",
+                VehiclePropertyIds.toString(VehiclePropertyIds.STORAGE_ENCRYPTION_BINDING_SEED));
     }
 
     private static List<Integer> getListOfConstantValues(Class clazz) {