我想獲得一個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
這裏是我的[XMLDSIG問題(http://stackoverflow.com/questions/29042452/what-exactly-to-digest-and-sign-on-xmldsig-and -how-or-osx-native-client-misma) – TarqTeles
完成編碼,連接到Web服務並且簽名工作!我會重寫上面的答案,使其絕對正面。這是解決方案! – TarqTeles