Mini Secret Key

In most cases, like in the Substrate, you would create a mnemonic, get its seed, and use its first 32 bytes to get Secret Key instance:

val seedBytes: ByteArray // should be exactly 32 bytes, otherwise error will be thrown
val miniSecretKey: MiniSecretKey = MiniSecretKey.fromByteArray(seedBytes)
val backToSeed: ByteArray = miniSecretKey.toByteArray()

Or you can generate it skipping seed provision part using Kotlin's SecureRandom from krypt library or by providing your custom CPSRNG:

val generatedMiniSecretKey: MiniSecretKey = MiniSecretKey.generate()

val yourSecureRandom: kotlin.random.Random
val generatedMiniSecretKeyWithCPSRNG: MiniSecretKey = MiniSecretKey.generateWith(yourSecureRandom)

Signing messages

Same as in Secret Key:

val yourContextLabel: String
val messageToSign: ByteArray

val signingContext: SigningContext = SigningContext
    .fromContext(yourContextLabel.toByteArray())
val signingTranscript: SigningTranscript = signingContext.bytes(messageToSign)
    
val yourMiniSecretKey: MiniSecretKey
val signedMessage: Signature = yourMiniSecretKey.sign(signingTranscript)

Double check signature:

val signingTranscript: SigningTranscript
val yourMiniSecretKey: MiniSecretKey

val signedMessage: Signature = yourMiniSecretKey.signDoubleCheck(signingTranscript)

Simple signing:

val yourContextLabel: String
val messageToSign: ByteArray

// Still, we need to set the context
val signingContext: SigningContext = SigningContext
    .fromContext(yourContextLabel.toByteArray())
    
val yourMiniSecretKey: MiniSecretKey
val signedMessage: Signature = yourMiniSecretKey.signSimple(signingContext, messageToSign)
val doubleCheckedSignedMessage: Signature = yourMiniSecretKey.signSimpleDoubleCheck(signingContext, messageToSign)

Uniform

You can convert Mini Secret Key to Uniform Secret Key:

val miniSecretKey: MiniSecretKey
val secretKeyUniform: SecretKey = miniSecretKey.expandUniform()
// or
val secretKeyUniform: SecretKey = miniSecretKey.expand(ExpansionMode.UNIFORM)

ed25519

Also, you're able to do the same with ed25519 representation

val miniSecretKey: MiniSecretKey
val secretKeyEd25519: SecretKey = miniSecretKey.expandEd25519()
// or
val secretKeyEd25519: SecretKey = miniSecretKey.expand(ExpansionMode.ED25519)

Public Key

To avoid extra step of conversion to Secret Key and then to Public Key, use this:

val miniSecretKey: MiniSecretKey
val expansionMode: ExpansionMode // ExpansionMode.UNIFORM or ExpansionMode.ED25519
val publicKey: PublicKey = miniSecretKey.expandToKeyPair(expansionMode)

Key Pair

And finally, to get the Key Pair right from Mini Secret Key, try this:

val miniSecretKey: MiniSecretKey
val expansionMode: ExpansionMode // ExpansionMode.UNIFORM or ExpansionMode.ED25519
val keyPair: KeyPair = miniSecretKey.expandToKeypair(expansionMode)

Last updated