     ///
     public convenience init?(publicTag: String, var publicKeyData: NSData? = nil) {
         if let existingData = Heimdall.obtainKeyData(publicTag) {
-            var keySize = existingData.length * 8
-            
             // Compare agains the new data (optional)
             if let newData = publicKeyData?.dataByStrippingX509Header() where !existingData.isEqualToData(newData) {
-                Heimdall.updateKey(publicTag, keySize: nil, data: newData)
-                keySize = newData.length * 8
-            }
-            
-            self.init(scope: ScopeOptions.PublicKey, publicTag: publicTag, privateTag: nil, keySize: keySize)
+                Heimdall.updateKey(publicTag, data: newData)
+            }
+            
+            self.init(scope: ScopeOptions.PublicKey, publicTag: publicTag, privateTag: nil)
         } else if let data = publicKeyData?.dataByStrippingX509Header(), key = Heimdall.insertPublicKey(publicTag, data: data) {
             // Successfully created the new key
-            self.init(scope: ScopeOptions.PublicKey, publicTag: publicTag, privateTag: nil, keySize: data.length * 8)
+            self.init(scope: ScopeOptions.PublicKey, publicTag: publicTag, privateTag: nil)
         } else {
             // Call the init, although returning nil
-            self.init(scope: ScopeOptions.PublicKey, publicTag: publicTag, privateTag: nil, keySize: 0)
+            self.init(scope: ScopeOptions.PublicKey, publicTag: publicTag, privateTag: nil)
             return nil
         }
+    }
+    
+    ///
+    /// Create an instance with the modulus and exponent of the public key
+    /// the resulting key is added to the keychain (call .destroy() to remove)
+    ///
+    /// :params: publicTag          Tag of the public key, see data based initialiser for details
+    /// :params: publicKeyModulus   Modulus of the public key
+    /// :params: publicKeyExponent  Exponent of the public key
+    ///
+    /// :returns: Heimdall instance that can handle only public key operations
+    ///
+    public convenience init?(publicTag: String, publicKeyModulus: NSData, publicKeyExponent: NSData) {
+        // Combine the data into one that we can use for initialisation
+        let combinedData = NSData(modulus: publicKeyModulus, exponent: publicKeyExponent)
+        self.init(publicTag: publicTag, publicKeyData: combinedData)
     }
     
     ///

        publicAttributes[String(kSecClass)] = kSecClassKey as CFStringRef
        publicAttributes[String(kSecAttrApplicationTag)] = publicTag as CFStringRef
        publicAttributes[String(kSecValueData)] = data as CFDataRef
        publicAttributes[String(kSecAttrKeyClass)] = kSecAttrKeyClassPublic as CFStringRef
        publicAttributes[String(kSecReturnPersistentRef)] = true as CFBooleanRef
        
        var persistentRef = Unmanaged<AnyObject>?()

    //  MARK: Private class functions
    //
    
    private class func obtainKey(tag: String) -> SecKeyRef? {
        var keyRef: Unmanaged<AnyObject>?
        var query: Dictionary<String, AnyObject> = [
            String(kSecAttrKeyType): kSecAttrKeyTypeRSA,
