Added signing
This commit is contained in:
parent
d4955dc7cd
commit
7f703aa6b9
1502
multiplatform-crypto-libsodium-bindings/hs_err_pid2945029.log
Normal file
1502
multiplatform-crypto-libsodium-bindings/hs_err_pid2945029.log
Normal file
File diff suppressed because it is too large
Load Diff
1501
multiplatform-crypto-libsodium-bindings/hs_err_pid2945645.log
Normal file
1501
multiplatform-crypto-libsodium-bindings/hs_err_pid2945645.log
Normal file
File diff suppressed because it is too large
Load Diff
1529
multiplatform-crypto-libsodium-bindings/hs_err_pid2945854.log
Normal file
1529
multiplatform-crypto-libsodium-bindings/hs_err_pid2945854.log
Normal file
File diff suppressed because it is too large
Load Diff
@ -42,6 +42,16 @@ class Blake2bState : Structure() {
|
||||
val opaque = ByteArray(384)
|
||||
}
|
||||
|
||||
//typedef struct crypto_sign_ed25519ph_state {
|
||||
// crypto_hash_sha512_state hs;
|
||||
//} crypto_sign_ed25519ph_state;
|
||||
class Ed25519SignatureState : Structure() {
|
||||
override fun getFieldOrder() = listOf("hs")
|
||||
|
||||
@JvmField
|
||||
var hs: Hash512State = Hash512State()
|
||||
}
|
||||
|
||||
|
||||
// typedef struct crypto_secretstream_xchacha20poly1305_state {
|
||||
// unsigned char k[crypto_stream_chacha20_ietf_KEYBYTES];
|
||||
@ -785,7 +795,7 @@ interface JnaLibsodiumInterface : Library {
|
||||
publicKey: ByteArray,
|
||||
secretKey: ByteArray,
|
||||
seed: ByteArray
|
||||
) : Int
|
||||
): Int
|
||||
|
||||
// int crypto_box_easy(unsigned char *c, const unsigned char *m,
|
||||
// unsigned long long mlen, const unsigned char *n,
|
||||
@ -797,7 +807,7 @@ interface JnaLibsodiumInterface : Library {
|
||||
nonce: ByteArray,
|
||||
recipientPublicKey: ByteArray,
|
||||
senderSecretKey: ByteArray
|
||||
) : Int
|
||||
): Int
|
||||
|
||||
// int crypto_box_open_easy(unsigned char *m, const unsigned char *c,
|
||||
// unsigned long long clen, const unsigned char *n,
|
||||
@ -809,7 +819,7 @@ interface JnaLibsodiumInterface : Library {
|
||||
nonce: ByteArray,
|
||||
senderPublickKey: ByteArray,
|
||||
recipientSecretKey: ByteArray
|
||||
) : Int
|
||||
): Int
|
||||
|
||||
// int crypto_box_detached(unsigned char *c, unsigned char *mac,
|
||||
// const unsigned char *m, unsigned long long mlen,
|
||||
@ -823,7 +833,7 @@ interface JnaLibsodiumInterface : Library {
|
||||
nonce: ByteArray,
|
||||
recipientPublicKey: ByteArray,
|
||||
senderSecretKey: ByteArray
|
||||
) : Int
|
||||
): Int
|
||||
|
||||
// int crypto_box_open_detached(
|
||||
// unsigned char *m, const unsigned char *c,
|
||||
@ -840,7 +850,7 @@ interface JnaLibsodiumInterface : Library {
|
||||
nonce: ByteArray,
|
||||
senderPublickKey: ByteArray,
|
||||
recipientSecretKey: ByteArray
|
||||
) : Int
|
||||
): Int
|
||||
|
||||
// int crypto_box_beforenm(unsigned char *k, const unsigned char *pk,
|
||||
// const unsigned char *sk)
|
||||
@ -848,7 +858,8 @@ interface JnaLibsodiumInterface : Library {
|
||||
sessionKey: ByteArray,
|
||||
publicKey: ByteArray,
|
||||
secretKey: ByteArray
|
||||
) : Int
|
||||
): Int
|
||||
|
||||
// int crypto_box_easy_afternm(unsigned char *c, const unsigned char *m,
|
||||
// unsigned long long mlen, const unsigned char *n,
|
||||
// const unsigned char *k)
|
||||
@ -858,7 +869,7 @@ interface JnaLibsodiumInterface : Library {
|
||||
messageLength: Long,
|
||||
nonce: ByteArray,
|
||||
sessionKey: ByteArray
|
||||
) : Int
|
||||
): Int
|
||||
|
||||
// int crypto_box_open_easy_afternm(unsigned char *m, const unsigned char *c,
|
||||
// unsigned long long clen, const unsigned char *n,
|
||||
@ -869,7 +880,8 @@ interface JnaLibsodiumInterface : Library {
|
||||
ciphertextLength: Long,
|
||||
nonce: ByteArray,
|
||||
sessionKey: ByteArray
|
||||
) : Int
|
||||
): Int
|
||||
|
||||
// int crypto_box_seal(unsigned char *c, const unsigned char *m,
|
||||
// unsigned long long mlen, const unsigned char *pk)
|
||||
fun crypto_box_seal(
|
||||
@ -877,7 +889,7 @@ interface JnaLibsodiumInterface : Library {
|
||||
message: ByteArray,
|
||||
messageLength: Long,
|
||||
recipientPublicKey: ByteArray
|
||||
) : Int
|
||||
): Int
|
||||
|
||||
|
||||
// int crypto_box_seal_open(unsigned char *m, const unsigned char *c,
|
||||
@ -889,25 +901,124 @@ interface JnaLibsodiumInterface : Library {
|
||||
ciphertextLength: Long,
|
||||
senderPublickKey: ByteArray,
|
||||
recipientSecretKey: ByteArray
|
||||
) : Int
|
||||
): Int
|
||||
//
|
||||
// // ---- Box end ----
|
||||
//
|
||||
// // ---- Sign start ----
|
||||
// fun crypto_sign(message: Uint8Array, secretKey: Uint8Array) : Uint8Array
|
||||
// fun crypto_sign_detached(message: Uint8Array, secretKey: Uint8Array) : Uint8Array
|
||||
// fun crypto_sign_ed25519_pk_to_curve25519(ed25519PublicKey: Uint8Array) : Uint8Array
|
||||
// fun crypto_sign_ed25519_sk_to_curve25519(ed25519SecretKey: Uint8Array) : Uint8Array
|
||||
// fun crypto_sign_ed25519_sk_to_pk(ed25519SecretKey: Uint8Array) : Uint8Array
|
||||
// fun crypto_sign_ed25519_sk_to_seed(ed25519SecretKey: Uint8Array) : Uint8Array
|
||||
// fun crypto_sign_final_create(state: dynamic, secretKey: Uint8Array) : Uint8Array
|
||||
// fun crypto_sign_final_verify(state: dynamic, signature: Uint8Array, publicKey: Uint8Array) : Boolean
|
||||
// fun crypto_sign_init() : dynamic
|
||||
// fun crypto_sign_keypair() : dynamic
|
||||
// fun crypto_sign_open(signedMessage: Uint8Array, publicKey: Uint8Array) : Uint8Array
|
||||
// fun crypto_sign_seed_keypair(seed: Uint8Array) : dynamic
|
||||
// fun crypto_sign_update(state: dynamic, message: Uint8Array)
|
||||
// fun crypto_sign_verify_detached(signature: Uint8Array, message: Uint8Array, publicKey: Uint8Array) : Boolean
|
||||
|
||||
// int crypto_sign(
|
||||
// unsigned char *sm, unsigned long long *smlen_p,
|
||||
// const unsigned char *m, unsigned long long mlen,
|
||||
// const unsigned char *sk)
|
||||
fun crypto_sign(
|
||||
signedMessage: ByteArray,
|
||||
signedMessageLength: LongArray?,
|
||||
message: ByteArray,
|
||||
messageLength: Long,
|
||||
secretKey: ByteArray
|
||||
) : Int
|
||||
// int crypto_sign_open(
|
||||
// unsigned char *m, unsigned long long *mlen_p,
|
||||
// const unsigned char *sm, unsigned long long smlen,
|
||||
// const unsigned char *pk)
|
||||
fun crypto_sign_open(
|
||||
message: ByteArray,
|
||||
messageLength: LongArray?,
|
||||
signedMessage: ByteArray,
|
||||
signedMessageLength: Long,
|
||||
publicKey: ByteArray
|
||||
) : Int
|
||||
// int crypto_sign_detached(
|
||||
// unsigned char *sig, unsigned long long *siglen_p,
|
||||
// const unsigned char *m, unsigned long long mlen,
|
||||
// const unsigned char *sk)
|
||||
fun crypto_sign_detached(
|
||||
signature: ByteArray,
|
||||
signatureLength: LongArray?,
|
||||
message: ByteArray,
|
||||
messageLength: Long,
|
||||
secretKey: ByteArray
|
||||
) : Int
|
||||
// int crypto_sign_verify_detached(
|
||||
// const unsigned char *sig,
|
||||
// const unsigned char *m,
|
||||
// unsigned long long mlen,
|
||||
// const unsigned char *pk)
|
||||
fun crypto_sign_verify_detached(
|
||||
signature: ByteArray,
|
||||
message: ByteArray,
|
||||
messageLength: Long,
|
||||
publicKey: ByteArray
|
||||
) : Int
|
||||
// int crypto_sign_ed25519_pk_to_curve25519(
|
||||
// unsigned char *curve25519_pk,
|
||||
// const unsigned char *ed25519_pk)
|
||||
fun crypto_sign_ed25519_pk_to_curve25519(
|
||||
curve25519PublicKey: ByteArray,
|
||||
ed25519PublicKey: ByteArray
|
||||
) : Int
|
||||
|
||||
// int crypto_sign_ed25519_sk_to_curve25519(unsigned char *curve25519_sk,
|
||||
// const unsigned char *ed25519_sk)
|
||||
fun crypto_sign_ed25519_sk_to_curve25519(
|
||||
curve25519SecretKey: ByteArray,
|
||||
ed25519SecretKey: ByteArray
|
||||
) : Int
|
||||
|
||||
// int crypto_sign_ed25519_sk_to_pk(unsigned char *pk, const unsigned char *sk)
|
||||
fun crypto_sign_ed25519_sk_to_pk(
|
||||
ed25519PublicKey: ByteArray,
|
||||
ed25519SecretKey: ByteArray
|
||||
) : Int
|
||||
// int crypto_sign_ed25519_sk_to_seed(unsigned char *seed,
|
||||
// const unsigned char *sk)
|
||||
fun crypto_sign_ed25519_sk_to_seed(
|
||||
seed: ByteArray,
|
||||
ed25519SecretKey: ByteArray
|
||||
) : Int
|
||||
// int crypto_sign_init(crypto_sign_state *state);
|
||||
fun crypto_sign_init(state: Ed25519SignatureState)
|
||||
|
||||
// int crypto_sign_update(crypto_sign_state *state,
|
||||
// const unsigned char *m, unsigned long long mlen)
|
||||
fun crypto_sign_update(
|
||||
state: Ed25519SignatureState,
|
||||
message: ByteArray,
|
||||
messageLength: Long
|
||||
) : Int
|
||||
// int crypto_sign_final_create(crypto_sign_state *state, unsigned char *sig,
|
||||
// unsigned long long *siglen_p,
|
||||
// const unsigned char *sk)
|
||||
fun crypto_sign_final_create(
|
||||
state: Ed25519SignatureState,
|
||||
signature: ByteArray,
|
||||
signatureLength: LongArray?,
|
||||
secretKey: ByteArray
|
||||
) : Int
|
||||
// int crypto_sign_final_verify(crypto_sign_state *state, const unsigned char *sig,
|
||||
// const unsigned char *pk)
|
||||
fun crypto_sign_final_verify(
|
||||
state: Ed25519SignatureState,
|
||||
signature: ByteArray,
|
||||
publicKey: ByteArray
|
||||
) : Int
|
||||
// int crypto_sign_keypair(unsigned char *pk, unsigned char *sk)
|
||||
fun crypto_sign_keypair(
|
||||
publicKey: ByteArray, secretKey: ByteArray
|
||||
)
|
||||
// int crypto_sign_seed_keypair(unsigned char *pk, unsigned char *sk,
|
||||
// const unsigned char *seed)
|
||||
fun crypto_sign_seed_keypair(
|
||||
publicKey: ByteArray,
|
||||
secretKey: ByteArray,
|
||||
seed: ByteArray
|
||||
) : Int
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//
|
||||
//
|
||||
// // ---- Sign end ----
|
||||
@ -930,18 +1041,7 @@ interface JnaLibsodiumInterface : Library {
|
||||
//
|
||||
// // ---- Password hashing end ----
|
||||
//
|
||||
// // ---- Utils ----
|
||||
//
|
||||
// fun memcmp(first: Uint8Array, second: Uint8Array) : Boolean
|
||||
// fun memzero(data: Uint8Array)
|
||||
// fun pad(data : Uint8Array, blocksize: Int) : Uint8Array
|
||||
// fun unpad(data: Uint8Array, blocksize: Int) : Uint8Array
|
||||
// fun to_base64(data: Uint8Array, variant: Int) : String
|
||||
// fun to_hex(data: Uint8Array) : String
|
||||
// fun to_string(data: Uint8Array) : String
|
||||
// fun from_base64(data: String, variant: Int): Uint8Array
|
||||
// fun from_hex(data : String): Uint8Array
|
||||
// fun from_string(data : String): Uint8Array
|
||||
|
||||
//
|
||||
// // ---- > ---- Random ---- < -----
|
||||
//
|
||||
|
@ -1,9 +1,9 @@
|
||||
package com.ionspin.kotlin.crypto.signature
|
||||
|
||||
import com.goterl.lazycode.lazysodium.interfaces.Sign
|
||||
import com.ionspin.kotlin.crypto.LibsodiumInitializer.sodium
|
||||
import com.ionspin.kotlin.crypto.Ed25519SignatureState
|
||||
import com.ionspin.kotlin.crypto.LibsodiumInitializer.sodiumJna
|
||||
|
||||
actual typealias SignatureState = Sign.StateCryptoSign
|
||||
actual typealias SignatureState = Ed25519SignatureState
|
||||
|
||||
actual object Signature {
|
||||
actual fun init(): SignatureState {
|
||||
@ -11,7 +11,7 @@ actual object Signature {
|
||||
}
|
||||
|
||||
actual fun update(state: SignatureState, data: UByteArray) {
|
||||
sodium.crypto_sign_update(state, data.asByteArray(), data.size.toLong())
|
||||
sodiumJna.crypto_sign_update(state, data.asByteArray(), data.size.toLong())
|
||||
}
|
||||
|
||||
actual fun finalCreate(
|
||||
@ -19,7 +19,7 @@ actual object Signature {
|
||||
secretKey: UByteArray
|
||||
): UByteArray {
|
||||
val signature = UByteArray(crypto_sign_BYTES)
|
||||
sodium.crypto_sign_final_create(
|
||||
sodiumJna.crypto_sign_final_create(
|
||||
state,
|
||||
signature.asByteArray(),
|
||||
null,
|
||||
@ -33,7 +33,7 @@ actual object Signature {
|
||||
signature: UByteArray,
|
||||
publicKey: UByteArray
|
||||
) {
|
||||
val verificationResult = sodium.crypto_sign_final_verify(
|
||||
val verificationResult = sodiumJna.crypto_sign_final_verify(
|
||||
state,
|
||||
signature.asByteArray(),
|
||||
publicKey.asByteArray()
|
||||
@ -50,7 +50,7 @@ actual object Signature {
|
||||
actual fun keypair(): SignatureKeyPair {
|
||||
val publicKey = UByteArray(crypto_sign_PUBLICKEYBYTES)
|
||||
val secretKey = UByteArray(crypto_sign_SECRETKEYBYTES)
|
||||
sodium.crypto_sign_keypair(
|
||||
sodiumJna.crypto_sign_keypair(
|
||||
publicKey.asByteArray(),
|
||||
secretKey.asByteArray(),
|
||||
)
|
||||
@ -65,9 +65,9 @@ actual object Signature {
|
||||
actual fun seedKeypair(seed: UByteArray): SignatureKeyPair {
|
||||
val publicKey = UByteArray(crypto_sign_PUBLICKEYBYTES)
|
||||
val secretKey = UByteArray(crypto_sign_SECRETKEYBYTES)
|
||||
|
||||
|
||||
sodium.crypto_sign_seed_keypair(
|
||||
|
||||
|
||||
sodiumJna.crypto_sign_seed_keypair(
|
||||
publicKey.asByteArray(),
|
||||
secretKey.asByteArray(),
|
||||
seed.asByteArray()
|
||||
@ -76,13 +76,13 @@ actual object Signature {
|
||||
}
|
||||
|
||||
/**
|
||||
* The sodium.crypto_sign() function prepends a signature to a message m whose length is mlen bytes, using the secret key sk.
|
||||
* The signed message, which includes the signature + a plain copy of the message, is put into sm, and is sodium.crypto_sign_BYTES + mlen bytes long.
|
||||
* The sodiumJna.crypto_sign() function prepends a signature to a message m whose length is mlen bytes, using the secret key sk.
|
||||
* The signed message, which includes the signature + a plain copy of the message, is put into sm, and is sodiumJna.crypto_sign_BYTES + mlen bytes long.
|
||||
*/
|
||||
actual fun sign(message: UByteArray, secretKey: UByteArray): UByteArray {
|
||||
val signedMessage = UByteArray(message.size + crypto_sign_BYTES)
|
||||
|
||||
sodium.crypto_sign(
|
||||
|
||||
sodiumJna.crypto_sign(
|
||||
signedMessage.asByteArray(),
|
||||
null,
|
||||
message.asByteArray(),
|
||||
@ -94,13 +94,13 @@ actual object Signature {
|
||||
}
|
||||
|
||||
/**
|
||||
* The sodium.crypto_sign_open() function checks that the signed message sm whose length is smlen bytes has a valid signature for the public key pk.
|
||||
* The sodiumJna.crypto_sign_open() function checks that the signed message sm whose length is smlen bytes has a valid signature for the public key pk.
|
||||
* If the signature is doesn't appear to be valid, the function throws an exception
|
||||
*/
|
||||
actual fun open(signedMessage: UByteArray, publicKey: UByteArray): UByteArray {
|
||||
val message = UByteArray(signedMessage.size - crypto_sign_BYTES)
|
||||
|
||||
val verificationResult = sodium.crypto_sign_open(
|
||||
val verificationResult = sodiumJna.crypto_sign_open(
|
||||
message.asByteArray(),
|
||||
null,
|
||||
signedMessage.asByteArray(),
|
||||
@ -115,13 +115,13 @@ actual object Signature {
|
||||
|
||||
/**
|
||||
* In detached mode, the signature is stored without attaching a copy of the original message to it.
|
||||
* The sodium.crypto_sign_detached() function signs the message m whose length is mlen bytes, using the secret key sk,
|
||||
* and puts the signature into sig, which can be up to sodium.crypto_sign_BYTES bytes long.
|
||||
* The sodiumJna.crypto_sign_detached() function signs the message m whose length is mlen bytes, using the secret key sk,
|
||||
* and puts the signature into sig, which can be up to sodiumJna.crypto_sign_BYTES bytes long.
|
||||
*/
|
||||
actual fun detached(message: UByteArray, secretKey: UByteArray): UByteArray {
|
||||
val signature = UByteArray(crypto_sign_BYTES)
|
||||
|
||||
sodium.crypto_sign_detached(
|
||||
sodiumJna.crypto_sign_detached(
|
||||
signature.asByteArray(),
|
||||
null,
|
||||
message.asByteArray(),
|
||||
@ -133,7 +133,7 @@ actual object Signature {
|
||||
}
|
||||
|
||||
/**
|
||||
* The sodium.crypto_sign_verify_detached() function verifies that sig is a valid signature for the message m whose length
|
||||
* The sodiumJna.crypto_sign_verify_detached() function verifies that sig is a valid signature for the message m whose length
|
||||
* is mlen bytes, using the signer's public key pk.
|
||||
*/
|
||||
actual fun verifyDetached(
|
||||
@ -142,7 +142,7 @@ actual object Signature {
|
||||
publicKey: UByteArray
|
||||
) {
|
||||
|
||||
val verificationResult = sodium.crypto_sign_verify_detached(
|
||||
val verificationResult = sodiumJna.crypto_sign_verify_detached(
|
||||
signature.asByteArray(),
|
||||
message.asByteArray(),
|
||||
message.size.toLong(),
|
||||
@ -155,11 +155,11 @@ actual object Signature {
|
||||
}
|
||||
|
||||
/**
|
||||
* The sodium.crypto_sign_ed25519_pk_to_curve25519() function converts an Ed25519 public key ed25519_pk to an X25519 public key and stores it into x25519_pk.
|
||||
* The sodiumJna.crypto_sign_ed25519_pk_to_curve25519() function converts an Ed25519 public key ed25519_pk to an X25519 public key and stores it into x25519_pk.
|
||||
*/
|
||||
actual fun ed25519PkToCurve25519(ed25519PublicKey: UByteArray) : UByteArray {
|
||||
val x25519PublicKey = UByteArray(crypto_scalarmult_curve25519_BYTES)
|
||||
sodium.crypto_sign_ed25519_sk_to_curve25519(
|
||||
sodiumJna.crypto_sign_ed25519_sk_to_curve25519(
|
||||
x25519PublicKey.asByteArray(),
|
||||
ed25519PublicKey.asByteArray()
|
||||
)
|
||||
@ -168,7 +168,7 @@ actual object Signature {
|
||||
|
||||
actual fun ed25519SkToCurve25519(ed25519SecretKey: UByteArray) : UByteArray {
|
||||
val x25519SecretKey = UByteArray(crypto_scalarmult_curve25519_BYTES)
|
||||
sodium.crypto_sign_ed25519_sk_to_curve25519(
|
||||
sodiumJna.crypto_sign_ed25519_sk_to_curve25519(
|
||||
x25519SecretKey.asByteArray(),
|
||||
ed25519SecretKey.asByteArray()
|
||||
)
|
||||
@ -176,13 +176,13 @@ actual object Signature {
|
||||
}
|
||||
|
||||
/**
|
||||
* The secret key actually includes the seed (either a random seed or the one given to sodium.crypto_sign_seed_keypair()) as well as the public key.
|
||||
* The secret key actually includes the seed (either a random seed or the one given to sodiumJna.crypto_sign_seed_keypair()) as well as the public key.
|
||||
* While the public key can always be derived from the seed, the precomputation saves a significant amount of CPU cycles when signing.
|
||||
*/
|
||||
actual fun ed25519SkToSeed(secretKey: UByteArray): UByteArray {
|
||||
val seed = UByteArray(crypto_sign_SEEDBYTES)
|
||||
|
||||
sodium.crypto_sign_ed25519_sk_to_seed(
|
||||
sodiumJna.crypto_sign_ed25519_sk_to_seed(
|
||||
seed.asByteArray(),
|
||||
secretKey.asByteArray()
|
||||
)
|
||||
@ -192,13 +192,13 @@ actual object Signature {
|
||||
}
|
||||
|
||||
/**
|
||||
* The secret key actually includes the seed (either a random seed or the one given to sodium.crypto_sign_seed_keypair()) as well as the public key.
|
||||
* The secret key actually includes the seed (either a random seed or the one given to sodiumJna.crypto_sign_seed_keypair()) as well as the public key.
|
||||
* While the public key can always be derived from the seed, the precomputation saves a significant amount of CPU cycles when signing.
|
||||
*/
|
||||
actual fun ed25519SkToPk(secretKey: UByteArray): UByteArray {
|
||||
val publicKey = UByteArray(crypto_sign_PUBLICKEYBYTES)
|
||||
|
||||
sodium.crypto_sign_ed25519_sk_to_pk(
|
||||
sodiumJna.crypto_sign_ed25519_sk_to_pk(
|
||||
publicKey.asByteArray(),
|
||||
secretKey.asByteArray()
|
||||
)
|
||||
@ -206,4 +206,4 @@ actual object Signature {
|
||||
return publicKey
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user