I want to parse and verify an OpenPGP detached signature using Bouncycastle. The signature would be something like this:
-----BEGIN PGP SIGNATURE-----
Version: fast-openpgp
wsBcBAABCAAQBQJfRm9jCRDzeoZuOgUYnQAAVkoIAEReZ6Pp3SimYKbH+JHzwW8q
LiWeQIPNatFwDQHgD4ipT9aXMaObnXXl83KUQ5lPx8Bw77BxParpUbtCRNTrWoU5
XZ1ikfqzmeVEJrk4YsNKDiBpvjbyF86F8KSkXhwdLWSm1e6yemnXKcTHg2L13AiS
6TIqXXbcRmFF7RTO4DQrjira2YYlW8eHPIcCmOq0YjR4Qpz+R/+3BlfV2TAcL/sd
SeKAczgvdP6CS6be1rPA0nlgw9T853BpgqplQVM30pUhVlni7ga1YRzENm6Qic5A
uEbmPyunim2WHytPuLQq+BQvAq+Wrr2kiM7DhyvYFihDNdFWW67Y+fSlgPxOi/8=
=QKpc
-----END PGP SIGNATURE-----
And here is how I try to create CMSSignedData in Kotlin:
fun verifyDetached(signatureString: String, dataString: String): Boolean {
val dataBytes = dataString.toByteArray()
val signatureBytes = signatureString.toByteArray()
val processableDataBytes = CMSProcessableByteArray(dataBytes)
val ci = ContentInfo.getInstance(ASN1Sequence.fromByteArray(signatureBytes))
val cms = CMSSignedData(processableDataBytes, ci)
...
}
When I pass the whole signature block into the function (including -----BEGIN PGP SIGNATURE-----) I get java.io.IOException: unknown tag 13 encountered
.
When I remove signature wrappers and just pass in the signature content into the function I get java.io.IOException: Extra data detected in stream at org.bouncycastle.asn1.ASN1Primitive.fromByteArray
.
When I directly pass signatureBytes
to CMSSignedData constructor I get java.lang.IllegalArgumentException: unknown object in getInstance: org.bouncycastle.asn1.DLApplicationSpecific
.
How should I verify this kind of signature using Bouncycastle?