BoZhenka
Right way to use :crypto.verify(...)
I have some problems with :crypto.verify.
message = 'whatever'
sign = 'zFuf7bRH4RHwyktaqHQwmX5rn3LfSb4dKo'
public_key = 'MIGJAoGBAM1fmNUvezts3yglTdhXuqG7OhHxQtDFA'
:crypto.verify(:rsa, :sha256, message, sign, public_key)
This is give me an ArgumentError, like:
(crypto) :crypto.pkey_verify_nif(:rsa, :sha256, 'whatever', 'zFuf7bRH4RHwyktaqHQwmX5rn3LfSb4dKo', ["M", "I", "G", "J", "A", "o", "G", "B", "A", "M", "1", "f", "m", "N", "U", "v", "e", "z", "t", "s", "3", "y", "g", "l", "T", "d", "h", "X", "u", "q", "G", "7", "O", "h", "H", "x", "Q", "t", "D", "F", "A"], [])
(crypto) crypto.erl:874: :crypto.verify/6
Method :crypto.verify/5 exist, but some reason it’s gave me error about …verify/6
I don’t get it. What should I do for correct working of this?..
Most Liked
voltone
The public_key variable appears to contains a truncated Base64 fragment of a 1024-bit RSA public key. Assuming you actually have the full value you can convert it to an rsa_public() type like this:
public_key_base64 = "MIGJAoGBAM1fmNUvezts3yglTdhXuqG7OhHxQtDFA..." # truncated
public_key = :public_key.der_decode(:RSAPublicKey, Base.decode64!(public_key_base64))
The signature also appears to be truncated. Given the full Base64 encoded signature you can verify the signature with :crypto.verify:
message = "whatever"
signature_base64 = "zFuf7bRH4RHwyktaqHQwmX5rn3LfSb4dKo..." # truncated
signature = Base.decode64!(signature_base64)
:crypto.verify(:rsa, :sha256, message, signature, public_key)
Note the use of binary strings as opposed to chartists (single quotes), as others have pointed out.
idi527

According to http://erlang.org/doc/man/crypto.html#verify-5, the message needs to be a binary, not a charlist. As well as signature and it shouldn’t be encoded either. And public key needs to be in the format erlang understands.
victorolinasc
The function signature of :crypto.verify/5 does not match with your params.
verify(Algorithm, DigestType, Msg, Signature, Key) -> Result
verify(Algorithm, DigestType, Msg, Signature, Key, Options) ->
Result
Types
Algorithm = pk_sign_verify_algs()
DigestType =
rsa_digest_type() | dss_digest_type() | ecdsa_digest_type()
Msg = binary() | {digest, binary()}
Signature = binary()
Key =
rsa_public() |
dss_public() |
[ecdsa_public() | ecdsa_params()] |
[eddsa_public() | eddsa_params()] |
engine_key_ref()
Options = pk_sign_verify_opts()
Result = boolean()
First 2 parameters seem to match but your message seems not to be “cleartext” so you’d need to pass it wrapped in a tuple. Your public key also does not match the typespec.
Here is a StackOverflow example: https://stackoverflow.com/a/20509599/1397594
Also note your parameters are passing charlists and not binaries.
voltone
I’m not sure why the API for EdDSA behaves differently, but:
nilis not a thing in Erlang; according to the type spec you can set the second param to:none, though ECDSA requires that you pass in a valid digest type; so set this to:sha256- The value in the
:digesttuple should be the binary digest, not Hex encoded
So this will work: :crypto.verify(:ecdsa, :sha256, {:digest, hash}, sig, [public, :secp256k1]) to verify the original signature using a SHA256 rather than the original message. And to generate a signature: :crypto.sign(:ecdsa, :sha256, {:digest, hash}, [secret, :secp256k1])







