Swift
Swift
DSA R,S Signature Values
See more DSA Examples
Creates a DSA signature. Gets r,s values from the signature. Re-creates the DSA signature ASN.1 from the r,s values. Then verifies the signature using the re-created ASN.1 DSA signature.Chilkat Swift Downloads
func chilkatTest() {
var success: Bool = false
// This example requires the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.
let crypt = CkoCrypt2()!
crypt.encodingMode = "hex"
crypt.hashAlgorithm = "sha-1"
var hashStr: String? = crypt.hashFileENC(path: "qa_data/hamlet.xml")
print("hash to sign: \(hashStr!)")
let dsa = CkoDsa()!
var pemPrivateKey: String?
pemPrivateKey = dsa.loadText(path: "qa_data/dsa/dsaPrivKey2.pem")
success = dsa.fromPem(pemData: pemPrivateKey)
if success == false {
print("\(dsa.lastErrorText!)")
return
}
// Load the hash to be signed into the DSA object:
success = dsa.setEncodedHash(encoding: "hex", encodedHash: hashStr)
if success == false {
print("\(dsa.lastErrorText!)")
return
}
// Sign the hash.
success = dsa.signHash()
if success == false {
print("\(dsa.lastErrorText!)")
return
}
// Get the ASN.1 signature.
var asnSig: String? = dsa.getEncodedSignature(encoding: "base64")
print("Signature: \(asnSig!)")
// Examine the details of the ASN.1 signature.
// We want to get the r,s values as hex strings..
let asn = CkoAsn()!
success = asn.loadEncoded(asnContent: asnSig, encoding: "base64")
if success == false {
print("\(asn.lastErrorText!)")
return
}
// Get the ASN.1 as XML.
let xml = CkoXml()!
success = xml.load(xmlData: asn.asnToXml())
print("Signature as XML: ")
print("\(xml.getXml()!)")
// Sample XML shown here.
// The r and s values are the two hex strings in the XML.
// <?xml version="1.0" encoding="utf-8"?>
// <sequence>
// <int>2C187F3AB6E47A66497B86CE97BB39E2133810F5</int>
// <int>588E53D3F7B69636B48FD7175E99A3961BD7D775</int>
// </sequence>
// Pretend we're starting with r,s
var r: String? = "2C187F3AB6E47A66497B86CE97BB39E2133810F5"
var s: String? = "588E53D3F7B69636B48FD7175E99A3961BD7D775"
// Build the XML that will be converted to ASN.1
xml.clear()
xml.tag = "sequence"
xml.newChild2(tagPath: "int", content: r)
xml.newChild2(tagPath: "int", content: s)
// Convert the XML to ASN.1
success = asn.loadXml(xmlStr: xml.getXml())
// Emit the signature as DER encoded ASN.1 (base64)
asnSig = asn.getEncodedDer(encoding: "base64")
// --------------------------------------------------------------------
// Verify the signature using the asnSig we built from the r,s values
// --------------------------------------------------------------------
let dsa2 = CkoDsa()!
// Load the DSA public key to be used for verification:
var pemPublicKey: String?
pemPublicKey = dsa2.loadText(path: "qa_data/dsa/dsaPubKey2.pem")
success = dsa2.fromPublicPem(pemData: pemPublicKey)
if success == false {
print("\(dsa2.lastErrorText!)")
return
}
// Load the hash to be verified.
success = dsa2.setEncodedHash(encoding: "hex", encodedHash: hashStr)
if success == false {
print("\(dsa2.lastErrorText!)")
return
}
// Load the ASN.1 signature:
success = dsa2.setEncodedSignature(encoding: "base64", encodedSig: asnSig)
if success == false {
print("\(dsa2.lastErrorText!)")
return
}
// Verify:
success = dsa2.verify()
if success == false {
print("\(dsa2.lastErrorText!)")
}
else {
print("DSA Signature Verified!")
}
}