net.corda.v5.crypto
The corda-crypto
module is one of several modules of the Corda Crypto API
. The module defines low-level services that can be used to extend functionality of the Corda Crypto Library by implementing them in a CPK.
The Corda Crypto Library implements a wide variety of digest algorithms out of the box. However, you can use a digest algorithm that is not supported by the library by simply implementing some interfaces and adding the code into the CPK with the CorDapp code. Corda picks up any custom algorithms at runtime. We recommend adding custom digest code in a separate Java module.
- Digest algorithms must be cryptographically strong. For example, MD5 is not a strong algorithm and so is not supported by the library.
- Custom algorithms cannot be used as an implicit part of the digital signing. For example, you cannot specify a signature specification such as ‘SHA-256-TRIPLEwithRSA’. You must calculate the digest first and then sign/verify the produced hash using built-in signature specs.
Double SHA-256 is supported by the platform but let us assume that you want to support Triple SHA-256 where the first pass calculates the message digest and subsequent passes calculate the digest of the previous pass result. In Kotlin, the code may look as follows:
package com.example.crypto
import net.corda.v5.crypto.DigestAlgorithmName
import net.corda.v5.crypto.extensions.DigestAlgorithm
import net.corda.v5.crypto.sha256Bytes
import java.io.InputStream
import java.security.MessageDigest
class TripleSha256Digest : DigestAlgorithm {
companion object {
const val ALGORITHM = "SHA-256-TRIPLE"
const val STREAM_BUFFER_SIZE = DEFAULT_BUFFER_SIZE
}
override val algorithm = ALGORITHM
override val digestLength = 32
override fun digest(bytes: ByteArray): ByteArray = bytes.sha256Bytes().sha256Bytes().sha256Bytes()
override fun digest(inputStream: InputStream): ByteArray {
val messageDigest = MessageDigest.getInstance(DigestAlgorithmName.SHA2_256.name)
val buffer = ByteArray(STREAM_BUFFER_SIZE)
while (true) {
val read = inputStream.read(buffer)
if (read <= 0) break
messageDigest.update(buffer, 0, read)
}
return messageDigest.digest().sha256Bytes().sha256Bytes()
}
}
package com.example.crypto
import net.corda.v5.crypto.extensions.DigestAlgorithm
import net.corda.v5.crypto.extensions.DigestAlgorithmFactory
class TripleSha256 : DigestAlgorithmFactory {
override val algorithm: String = TripleSha256Digest.ALGORITHM
override fun getInstance(): DigestAlgorithm = TripleSha256Digest()
}
plugins {
id 'org.jetbrains.kotlin.jvm'
id 'net.corda.plugins.cordapp-cpk'
}
description 'Corda Crypto Custom Digest One'
group 'com.example.crypto'
cordapp {
targetPlatformVersion 999 as Integer
workflow {
name 'Custom Crypto Digest One CPK'
versionId 1
vendor 'R3'
}
}
dependencies {
cordaProvided platform("net.corda:corda-api:$cordaApiVersion")
cordaProvided "net.corda.kotlin:kotlin-stdlib-jdk8-osgi"
cordaProvided 'net.corda:corda-cipher-suite'
cordaProvided 'net.corda:corda-crypto'
cordaProvided 'net.corda:corda-crypto-extensions'
cordaProvided 'org.slf4j:slf4j-api'
}
net.corda:corda-crypto-extensions
.For information about packaging a CorDapp, see the development tutorial.
Was this page helpful?
Thanks for your feedback!
Chat with us
Chat with us on our #docs channel on slack. You can also join a lot of other slack channels there and have access to 1-on-1 communication with members of the R3 team and the online community.
Propose documentation improvements directly
Help us to improve the docs by contributing directly. It's simple - just fork this repository and raise a PR of your own - R3's Technical Writers will review it and apply the relevant suggestions.
We're sorry this page wasn't helpful. Let us know how we can make it better!
Chat with us
Chat with us on our #docs channel on slack. You can also join a lot of other slack channels there and have access to 1-on-1 communication with members of the R3 team and the online community.
Create an issue
Create a new GitHub issue in this repository - submit technical feedback, draw attention to a potential documentation bug, or share ideas for improvement and general feedback.
Propose documentation improvements directly
Help us to improve the docs by contributing directly. It's simple - just fork this repository and raise a PR of your own - R3's Technical Writers will review it and apply the relevant suggestions.