diff --git a/symmetric_key.cpp b/symmetric_key.cpp
index 68fa6f1..e1ce39f 100644
--- a/symmetric_key.cpp
+++ b/symmetric_key.cpp
@@ -22,73 +22,53 @@
 #include <openssl/rand.h>
 
 #include <keymaster/logger.h>
-#include <keymaster/keymaster_context.h>
 
 #include "aes_key.h"
 #include "hmac_key.h"
 #include "openssl_err.h"
+#include "unencrypted_key_blob.h"
 
 namespace keymaster {
 
-keymaster_error_t SymmetricKeyFactory::GenerateKey(const AuthorizationSet& key_description,
-                                                   KeymasterKeyBlob* key_blob,
-                                                   AuthorizationSet* hw_enforced,
-                                                   AuthorizationSet* sw_enforced) {
-    if (!key_blob || !hw_enforced || !sw_enforced)
-        return KM_ERROR_OUTPUT_PARAMETER_NULL;
+Key* SymmetricKeyFactory::GenerateKey(const AuthorizationSet& key_description,
+                                      keymaster_error_t* error) {
+    UniquePtr<SymmetricKey> key(CreateKeyAndValidateSize(key_description, error));
+    if (!key.get())
+        return NULL;
 
-    uint32_t key_size_bits;
-    if (!key_description.GetTagValue(TAG_KEY_SIZE, &key_size_bits) ||
-        !key_size_supported(key_size_bits))
-        return KM_ERROR_UNSUPPORTED_KEY_SIZE;
-
-    size_t key_data_size = key_size_bits / 8;
-    KeymasterKeyBlob key_material(key_data_size);
-    if (!key_material.key_material)
-        return KM_ERROR_MEMORY_ALLOCATION_FAILED;
-
-    keymaster_error_t error = context_->GenerateRandom(key_material.writable_data(), key_data_size);
-    if (error != KM_ERROR_OK) {
-        LOG_E("Error generating %d bit symmetric key", key_size_bits);
-        return error;
+    if (RAND_bytes(key->key_data_.get(), key->key_data_size_) != 1) {
+        LOG_E("Error %ul generating %d bit AES key", ERR_get_error(), key->key_data_size_ * 8);
+        *error = TranslateLastOpenSslError();
+        return NULL;
     }
 
-    return context_->CreateKeyBlob(key_description, KM_ORIGIN_GENERATED, key_material, key_blob,
-                                   hw_enforced, sw_enforced);
+    if (*error != KM_ERROR_OK)
+        return NULL;
+    return key.release();
 }
 
-keymaster_error_t SymmetricKeyFactory::ImportKey(const AuthorizationSet& key_description,
-                                                 keymaster_key_format_t input_key_material_format,
-                                                 const KeymasterKeyBlob& input_key_material,
-                                                 KeymasterKeyBlob* output_key_blob,
-                                                 AuthorizationSet* hw_enforced,
-                                                 AuthorizationSet* sw_enforced) {
-    if (!output_key_blob || !hw_enforced || !sw_enforced)
-        return KM_ERROR_OUTPUT_PARAMETER_NULL;
+Key* SymmetricKeyFactory::ImportKey(const AuthorizationSet& key_description,
+                                    keymaster_key_format_t format, const uint8_t* key_material,
+                                    size_t key_material_length, keymaster_error_t* error) {
+    UniquePtr<SymmetricKey> key(CreateKeyAndValidateSize(key_description, error));
+    if (!key.get())
+        return NULL;
 
-    AuthorizationSet authorizations(key_description);
-
-    uint32_t key_size_bits;
-    if (!authorizations.GetTagValue(TAG_KEY_SIZE, &key_size_bits)) {
-        // Default key size if not specified.
-        key_size_bits = input_key_material.key_material_size * 8;
-        authorizations.push_back(TAG_KEY_SIZE, key_size_bits);
+    if (format != KM_KEY_FORMAT_RAW) {
+        *error = KM_ERROR_UNSUPPORTED_KEY_FORMAT;
+        return NULL;
     }
 
-    if (!key_size_supported(key_size_bits))
-        return KM_ERROR_UNSUPPORTED_KEY_SIZE;
-
-    if (input_key_material_format != KM_KEY_FORMAT_RAW)
-        return KM_ERROR_UNSUPPORTED_KEY_FORMAT;
-
-    if (key_size_bits != input_key_material.key_material_size * 8) {
-        LOG_E("Expected %d-bit key data but got %d bits", key_size_bits,
-              input_key_material.key_material_size * 8);
-        return KM_ERROR_INVALID_KEY_BLOB;
+    if (key->key_data_size_ != key_material_length) {
+        LOG_E("Expected %d byte key data but got %d bytes", key->key_data_size_,
+              key_material_length);
+        *error = KM_ERROR_INVALID_KEY_BLOB;
+        return NULL;
     }
 
-    return context_->CreateKeyBlob(authorizations, KM_ORIGIN_IMPORTED, input_key_material,
-                                   output_key_blob, hw_enforced, sw_enforced);
+    key->key_data_size_ = key_material_length;
+    memcpy(key->key_data_.get(), key_material, key_material_length);
+    return key.release();
 }
 
 static const keymaster_key_format_t supported_import_formats[] = {KM_KEY_FORMAT_RAW};
@@ -97,21 +77,40 @@
     return supported_import_formats;
 }
 
-SymmetricKey::SymmetricKey(const KeymasterKeyBlob& key_material,
-                           const AuthorizationSet& hw_enforced, const AuthorizationSet& sw_enforced,
-                           keymaster_error_t* error)
-    : Key(hw_enforced, sw_enforced, error) {
-    if (*error != KM_ERROR_OK)
-        return;
+SymmetricKey* SymmetricKeyFactory::CreateKeyAndValidateSize(const AuthorizationSet& key_description,
+                                                            keymaster_error_t* error) {
+    if (!error)
+        return NULL;
+    *error = KM_ERROR_OK;
 
-    uint8_t* tmp = dup_buffer(key_material.key_material, key_material.key_material_size);
-    if (tmp) {
-        key_data_.reset(tmp);
-        key_data_size_ = key_material.key_material_size;
-        *error = KM_ERROR_OK;
-    } else {
-        *error = KM_ERROR_MEMORY_ALLOCATION_FAILED;
+    UniquePtr<SymmetricKey> key(CreateKey(key_description));
+
+    uint32_t key_size_bits;
+    if (!key_description.GetTagValue(TAG_KEY_SIZE, &key_size_bits) || key_size_bits % 8 != 0) {
+        *error = KM_ERROR_UNSUPPORTED_KEY_SIZE;
+        return NULL;
     }
+
+    *error = key->set_size(key_size_bits / 8);
+    if (*error != KM_ERROR_OK)
+        return NULL;
+
+    return key.release();
+}
+
+SymmetricKey::SymmetricKey(const UnencryptedKeyBlob& blob, keymaster_error_t* error)
+    : Key(blob), key_data_size_(blob.unencrypted_key_material_length()) {
+    key_data_.reset(new uint8_t[key_data_size_]);
+    if (!key_data_.get()) {
+        if (error)
+            *error = KM_ERROR_MEMORY_ALLOCATION_FAILED;
+        key_data_size_ = 0;
+        return;
+    }
+
+    memcpy(key_data_.get(), blob.unencrypted_key_material(), key_data_size_);
+    if (error)
+        *error = KM_ERROR_OK;
 }
 
 SymmetricKey::~SymmetricKey() {
@@ -128,4 +127,16 @@
     return KM_ERROR_OK;
 }
 
+keymaster_error_t SymmetricKey::set_size(size_t key_size) {
+    if (!size_supported(key_size))
+        return KM_ERROR_UNSUPPORTED_KEY_SIZE;
+
+    key_data_.reset(new uint8_t[key_size]);
+    if (!key_data_.get())
+        return KM_ERROR_MEMORY_ALLOCATION_FAILED;
+    key_data_size_ = key_size;
+
+    return KM_ERROR_OK;
+}
+
 }  // namespace keymaster
