mirror of
https://github.com/vlang/v.git
synced 2025-08-04 02:07:28 -04:00
85 lines
3.2 KiB
V
85 lines
3.2 KiB
V
// vtest build: present_openssl? && !(sanitize-memory-clang? || docker-ubuntu-musl?)
|
|
import rand
|
|
import crypto.ecdsa
|
|
import encoding.hex
|
|
// The test file placed on its own directory. Its for workaround for
|
|
// module lookup problem, because there are two rand module availables,
|
|
// between `crypto.rand` and `rand` module.
|
|
// See [the talk](https://discord.com/channels/592103645835821068/592294828432424960/1328198034806407311) on discord.
|
|
|
|
fn test_new_key_from_seed_with_random_size_and_data() ! {
|
|
num_iters := 100
|
|
// default prime256v1 curve key size was 32 bytes.
|
|
max_key_size := i32(48)
|
|
for i := 0; i <= num_iters; i++ {
|
|
m := rand.i32n(max_key_size)!
|
|
random_bytes := rand.bytes(m)!
|
|
pvkey := ecdsa.new_key_from_seed(random_bytes) or {
|
|
// With default size, would error on m > 32 or m == 0
|
|
// dump(m)
|
|
if m == 0 {
|
|
assert err == error('Seed with null-length was not allowed')
|
|
} else if m > 32 {
|
|
assert err == error('Seed length exceeds key size')
|
|
} else {
|
|
assert err == error('EC_KEY_check_key failed')
|
|
}
|
|
continue
|
|
}
|
|
ret_seed := pvkey.bytes()!
|
|
assert random_bytes == ret_seed
|
|
pvkey.free()
|
|
}
|
|
}
|
|
|
|
fn test_private_and_public_key_from_string() ! {
|
|
// See [this](https://github.com/vlang/v/blob/master/vlib/crypto/ecdsa/util_test.v) for detail
|
|
// of material used as a sample.
|
|
privkey_sample := '-----BEGIN PRIVATE KEY-----
|
|
MIG2AgEAMBAGByqGSM49AgEGBSuBBAAiBIGeMIGbAgEBBDAwzj2iiJZaxgk/C6mp
|
|
oVskdr6j7akl4bPB8JRnT1J5XNbLPK/iNd/BW+xUJEj/pxWhZANiAAT4/euEWRPV
|
|
9cdhtjcKlwF2HrFMLvgxAXFx+01UPfMQ9XOj/85qUhVq1jXraSyDy5FYF28UW4dn
|
|
04xVeRuPBbCFxc/uqYj2s5ItHcAZSV3L5sGlXadPfTqoIjCBQAx44k8=
|
|
-----END PRIVATE KEY-----'
|
|
|
|
pubkey_sample := '-----BEGIN PUBLIC KEY-----
|
|
MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE+P3rhFkT1fXHYbY3CpcBdh6xTC74MQFx
|
|
cftNVD3zEPVzo//OalIVatY162ksg8uRWBdvFFuHZ9OMVXkbjwWwhcXP7qmI9rOS
|
|
LR3AGUldy+bBpV2nT306qCIwgUAMeOJP
|
|
-----END PUBLIC KEY-----'
|
|
|
|
// Message tobe signed and verified
|
|
message_tobe_signed := 'Example of ECDSA with P-384'.bytes()
|
|
// Message signature generated with SHA384 digest with associated key previously.
|
|
signature := hex.decode('3066023100b08f6ec77bb319fdb7bce55a2714d7e79cc645d834ee539d8903cfcc88c6fa90df1558856cb840b2dd82e82cd89d7046023100d9d482ca8a6545a3b081fbdd4bb9643a2b4eda4e21fd624833216596032471faae646891f8d2f0bbb86b796c36d3c390')!
|
|
|
|
// loads a Privatekey and PublicKey from above sample
|
|
privkey := ecdsa.privkey_from_string(privkey_sample)!
|
|
pubkey := ecdsa.pubkey_from_string(pubkey_sample)!
|
|
// get a public key from private key
|
|
pbkey_from_privkey := privkey.public_key()!
|
|
|
|
// two public key should be equal, its comes from the same source.
|
|
assert pubkey.equal(pbkey_from_privkey)
|
|
|
|
// lets create the signature
|
|
created_signature := privkey.sign(message_tobe_signed)!
|
|
|
|
verified1 := pubkey.verify(message_tobe_signed, signature)!
|
|
verified2 := pubkey.verify(message_tobe_signed, created_signature)!
|
|
|
|
assert verified1 == true
|
|
assert verified2 == true
|
|
|
|
// Its also should be verified with pbkey_from_privkey opaque
|
|
verified3 := pbkey_from_privkey.verify(message_tobe_signed, signature)!
|
|
verified4 := pbkey_from_privkey.verify(message_tobe_signed, created_signature)!
|
|
assert verified3 == true
|
|
assert verified4 == true
|
|
|
|
// release the key
|
|
privkey.free()
|
|
pubkey.free()
|
|
pbkey_from_privkey.free()
|
|
}
|