Make AuthorizationSet interoperate with keymaster_key_param_set_t

Cherry-picked from internal.

Change-Id: Ib9c8cd82323a424749d2d11569e0d1ce5484ca15
diff --git a/authorization_set.cpp b/authorization_set.cpp
index 694d782..c7c8d6c 100644
--- a/authorization_set.cpp
+++ b/authorization_set.cpp
@@ -32,11 +32,6 @@
 
 const size_t STARTING_ELEMS_CAPACITY = 8;
 
-AuthorizationSet::AuthorizationSet(const AuthorizationSet& set)
-    : Serializable(), elems_(NULL), indirect_data_(NULL) {
-    Reinitialize(set.elems_, set.elems_size_);
-}
-
 AuthorizationSet::AuthorizationSet(AuthorizationSetBuilder& builder) {
     elems_ = builder.set.elems_;
     builder.set.elems_ = NULL;
diff --git a/include/keymaster/authorization_set.h b/include/keymaster/authorization_set.h
index 54baf99..c0c0686 100644
--- a/include/keymaster/authorization_set.h
+++ b/include/keymaster/authorization_set.h
@@ -28,10 +28,10 @@
 class AuthorizationSetBuilder;
 
 /**
- * A container that manages a set of keymaster_key_param_t objects, providing serialization,
- * de-serialization and accessors.
+ * An extension of the keymaster_key_param_set_t struct, which provides serialization memory
+ * management and methods for easy manipulation and construction.
  */
-class AuthorizationSet : public Serializable {
+class AuthorizationSet : public Serializable, public keymaster_key_param_set_t {
   public:
     /**
      * Construct an empty, dynamically-allocated, growable AuthorizationSet.  Does not actually
@@ -40,8 +40,11 @@
      * buffers, with \p Reinitialize.
      */
     AuthorizationSet()
-        : elems_(NULL), elems_size_(0), elems_capacity_(0), indirect_data_(NULL),
-          indirect_data_size_(0), indirect_data_capacity_(0), error_(OK) {}
+        : elems_capacity_(0), indirect_data_(NULL), indirect_data_size_(0),
+          indirect_data_capacity_(0), error_(OK) {
+        elems_ = nullptr;
+        elems_size_ = 0;
+    }
 
     /**
      * Construct an AuthorizationSet from the provided array.  The AuthorizationSet copies the data
@@ -50,17 +53,19 @@
      * return ALLOCATION_FAILURE. It is the responsibility of the caller to check before using the
      * set, if allocations might fail.
      */
-    AuthorizationSet(const keymaster_key_param_t* elems, size_t count)
-        : elems_(NULL), indirect_data_(NULL) {
+    AuthorizationSet(const keymaster_key_param_t* elems, size_t count) : indirect_data_(nullptr) {
+        elems_ = nullptr;
         Reinitialize(elems, count);
     }
 
-    AuthorizationSet(const keymaster_key_param_set_t& set) : elems_(NULL), indirect_data_(NULL) {
+    explicit AuthorizationSet(const keymaster_key_param_set_t& set) : indirect_data_(nullptr) {
+        elems_ = nullptr;
         Reinitialize(set.params, set.length);
     }
 
-    AuthorizationSet(const uint8_t* serialized_set, size_t serialized_size)
-        : elems_(NULL), indirect_data_(NULL) {
+    explicit AuthorizationSet(const uint8_t* serialized_set, size_t serialized_size)
+        : indirect_data_(nullptr) {
+        elems_ = nullptr;
         Deserialize(&serialized_set, serialized_set + serialized_size);
     }
 
@@ -68,10 +73,13 @@
      * Construct an AuthorizationSet from the provided builder.  This extracts the data from the
      * builder, rather than copying it, so after this call the builder is empty.
      */
-    AuthorizationSet(/* NOT const */ AuthorizationSetBuilder& builder);
+    explicit AuthorizationSet(/* NOT const */ AuthorizationSetBuilder& builder);
 
     // Copy constructor.
-    AuthorizationSet(const AuthorizationSet&);
+    AuthorizationSet(const AuthorizationSet& set) : Serializable(), indirect_data_(nullptr) {
+        elems_ = nullptr;
+        Reinitialize(set.elems_, set.elems_size_);
+    }
 
     /**
      * Clear existing authorization set data
@@ -90,6 +98,10 @@
         return Reinitialize(set.elems_, set.elems_size_);
     }
 
+    bool Reinitialize(const keymaster_key_param_set_t& set) {
+        return Reinitialize(set.params, set.length);
+    }
+
     ~AuthorizationSet();
 
     enum Error {
@@ -384,8 +396,11 @@
 
     bool ContainsEnumValue(keymaster_tag_t tag, uint32_t val) const;
 
-    keymaster_key_param_t* elems_;
-    size_t elems_size_;
+    // Define elems_ and elems_size_ as aliases to params and length, respectivley.  This is to
+    // avoid using the variables without the trailing underscore in the implementation.
+    keymaster_key_param_t*& elems_ = keymaster_key_param_set_t::params;
+    size_t& elems_size_ = keymaster_key_param_set_t::length;
+
     size_t elems_capacity_;
     uint8_t* indirect_data_;
     size_t indirect_data_size_;