2014-12-19 61 views
0

我想獲得一個XML字符串的數字簽名使用RSA私鑰使用Swift作爲命令行腳本(稍後從FileMaker調用)。SecSignVerifyTransform崩潰與斯威夫特與CSSM錯誤代碼= -2147415790

編譯器不斷崩潰,出現「分段錯誤11」,然後是「Illegal Instruction:4」,我一直鑽孔直到我發現問題,但它完全超出了我的意思,請大家幫忙! ;):)

正如標題所說,當調用SecTransformExecute我SecSignTransform,用我的字符串作爲輸入屬性的二進制版本,我得到了以下錯誤消息:

錯誤域=內部CSSM錯誤代碼= -2147415790「操作 無法完成(內部CSSM錯誤錯誤-2147415790 - 內部錯誤#80010912在__SignTransform_block_invoke_2 /SourceCache/Security/Security-57031.1.35/Security/libsecurity_transform/lib/SecSignVerifyTransform。 c:279)「UserInfo = 0x7fc620e23aa0 {NSDescription =內部錯誤#80010912在 __SignTransform_block_invoke_2/S ourceCache /安全性/安全性,57031.1.35 /安全/ libsecurity_transform/lib中/ SecSignVerifyTransform.c:279, 原產變換= CoreFoundationObject}

這裏是我的代碼的相關部分:

import Foundation 
import CoreFoundation 
import Security 

var signer: SecTransformRef 
var signedData, digestData: NSData 
var error: Unmanaged<CFErrorRef>? 
var status: OSStatus 
var key: SecKey 
var anyItem: Unmanaged<AnyObject>? 
var keySearchDict: [String : AnyObject] 
let keyMatch = "[*place search tag here*]" as String 


// turns a string into a binary to sign 
let str = "Hello World" 
let uintData = [UInt8](str.utf8) 
let sourceData = CFDataCreate(kCFAllocatorDefault, uintData, countElements(uintData)) 

// sets up keySearchDict to query Keychain 
keySearchDict = [(kSecClass as String): (kSecClassKey as String), (kSecMatchSubjectContains as String): keyMatch, (kSecReturnRef as String): kCFBooleanTrue] 

// gets private key using keySearchDict 
status = SecItemCopyMatching(keySearchDict, &anyItem) 
key = (anyItem!.takeRetainedValue() as SecKey) 

if status != 0 { println("status is: \(SecCopyErrorMessageString(status, &error).takeRetainedValue())") } 


// creates SecTransform object using key 
signer = SecSignTransformCreate(key, &error).takeRetainedValue() 

if error == nil { println("signer transform creation error == nil") } else { println(error) } 

// signer to get data from sourceData 
SecTransformSetAttribute(signer, kSecTransformInputAttributeName, sourceData!, &error) 
if error == nil { println("signer attribute setting error == nil") } else { println(error) } 


// execute the transform 
//signedData = (SecTransformExecute(signer, &error) as NSData) 
let anything = SecTransformExecute(signer, &error) 
if error == nil { println("signer execute error == nil") } else { println("erro: \(error!.takeRetainedValue())"); println(CFErrorGetCode(error!.takeRetainedValue())) } 

println("anything = \(anything)") 
//println(signedData) 

我對objc並不是很熟悉,實際上也不是一個合適的編碼器,所以請原諒我可憐的編碼風格;)另外,如果我發佈的內容太多,我感到抱歉,但是我認爲它比以前更好......

也許我在將字符串轉換爲bin時做錯了什麼是否簽署?我試圖使用CFData和NSData(爲了使這個自我包含,我使用「Hello World」作爲我的字符串,但在我的代碼中,我實際上使用NSData(contentsOfFile :)從文件加載UTF8編碼的XML,但都生成同樣的錯誤...)

非常感謝你的幫助!這是一個很好的學習體驗,但我已經在全職工作了一週以上,所以我真的可以休息一下! ;):D

回答

0

我找到了解決方案。代碼不再崩潰,並且我在它之後成功連接到Web服務,並且XMLDSIG簽名被它接受(如果對XMLDSIG的規範化和xml引用感興趣,請參閱XMLDSIG上的相關問題)。

我所用,關鍵是不兼容的簽名(不知道爲什麼,甚至那些關鍵的是,居然......),但以一個X509證書的服務器

我一直在尋找到反認證(對當我遇到SecIdentity類時,需要與證書一起創建SecCredential並與服務器進行身份驗證。

我看到身份嵌入一個私鑰,並認爲如果可以爲我工作。它做到了!

下面是我所做的更改:改變了kSecClass到kSecClassIdentity使用SecItemCopyMatching

  • 檢索SecIdentity搜索字典
  • 因此澆鑄後使用SecIdentityCopyPrivateKey檢索私鑰到

    1. ,一個SecKeyRef
    2. 在SecSignTransform中使用此密鑰,並voilà!有效!

    這裏是工作代碼:

    // ... 
    // get the SecIdentity (substitutes KeySearchDict etc) 
    idSearchDict = [(kSecClass as String): (kSecClassIdentity as String), (kSecMatchSubjectContains as String): keyMatch, (kSecReturnRef as String): 
    status = SecItemCopyMatching(idSearchDict, &anyItem) 
    id = (anyItem!.takeRetainedValue() as SecIdentity) 
    
    // Retrieve the private key from SecIdentity 
    var KeyRef: Unmanaged<SecKeyRef>? 
    SecIdentityCopyPrivateKey(id, &KeyRef) 
    priKey = (KeyRef!.takeRetainedValue() as SecKey) 
    
    // Create SecSign using the private key 
    signer = SecSignTransformCreate(priKey, &error).takeRetainedValue() 
    if error != nil { print("signer transform creation error: ") ; println(error) } 
    
    /signer to get data from sourceData 
    // ... 
    

    我會後與我面臨XMLDSIG困難的另一個問題,並將其添加到的意見,如果有人有興趣。我已經解決了這個問題,如果你需要的話,答案就在那裏。

    感謝大家試圖幫助,並希望這將節省一個人很多時間和頭痛在未來!

    PS:愛雨燕,否則

  • +0

    這裏是我的[XMLDSIG問題(http://stackoverflow.com/questions/29042452/what-exactly-to-digest-and-sign-on-xmldsig-and -how-or-osx-native-client-misma) – TarqTeles

    +0

    完成編碼,連接到Web服務並且簽名工作!我會重寫上面的答案,使其絕對正面。這是解決方案! – TarqTeles