Issue with ExPublicKey Expublic.load()

Hello guys i am stuck at an issue please help me :pray: :pray: :pray:

for the biometric authentication in my app, from front-end i am getting public key, signature.

for generating key pair, front end using this library β†’ [react-native-biometrics - npm]
and this algorithms β†’ Algorithmic used by above library

example
like i am getting following public key and signature form front end
public_key : MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsdBu6w2Var6TJHT8TQ1WdDpMu4VzSrDRP8DjY0WI9ddZvQSvjTdUQ9qm3fyZufZpmhPXfjkmg+f/cbJh+m+Zzhf093bcqVVnmEl+an/FTPMaOy2jfYNbxwZDuYCUxJzewGDa74vXCYB2sPgqZikf3UlhI0ZPO8tbdhleGoiQXOcXloAELQ+ebQ6MDBr+QDqNedPW+hLultTClH56v88Tp85PT6HWnPjVQUAWR7QeL+U8mFZOQALBruQvqfB3BwromhTkTB5XtCy1WCGBtzs21CTok4+pWp5QM/E3IUv1B8dtZDqjMIyGhUnM7pFmgL58UYV1unhyMH/cM+ffzlJWIQIDAQAB

Signature : it is encryption of text = "1675256878678"

DQ6vLV4cRAMcCkpT0MTMHPUc8IoMvcckhjY9Fyirq/zX1Ej851g+IojotyPMqSFKbRqrpE3F2OTI717fcAxFRMCFYlcuf1mYjniCJtGTkxTE6m6GNy+ApX5ssUSb3pZajXcLw/YnKvnbiYtsnL0mFgZ27krrp8ZxEf9iDFBJRZW7JVxjaeGqe5jIN64+NODgR+OvMvHPLpNjKIrZleXwQwbOpWE1q9EIhWmApc2bDdUFeaa5RtGOLI9WNkitkhW/Dsk5FNiZOW7oo85IE65cMJ09XTKHCUmYQnhwtdKibKK84koKXELvBat9/aWe+GBdQJQa6mNFfEPnvcmpXDu3tQ==

in the backend i am using elixir ExPublicKey
so the issue that, the public key i am getting from the front end is not getting load as
the public key object type, something like that

{:ok, public_key} = ExPublicKey.loads(public_key)
iex(64)> ExPublicKey.loads(public_key)
{:error, "invalid argument"}

the desired results should be like this

iex(67)> {:ok, public_key} = ExPublicKey.loads(public_key)
{:ok, #ExPublicKey.RSAPublicKey<
   fingerprint_sha256=                                                                                                   bc                                                                                                         
     31
     a4
     6b
     51
     67
     68
     b2
     63
     60
     66
     73
     39
     ad
     c8
     66
     1e
     07
     9d
     0c
     02
     e6
     31
     23
     16
     9d
     a3
     78
     4a
     04
     ef
     e8>}

{ok, "1675256878678"} = ExPublicKey.decrypt_public(params.signature, public_key, [])

Help me out here. or any alternative solution in elixir for the above encryption/decryption

If the public_key is not formatted as a PEM you may need to use ExPublicKey.pem_encode first before you use ExPublicKey.loads

iex(79)> public_key = 
...(79)> "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsdBu6w2Var6TJHT8TQ1WdDpMu4VzSrDRP8DjY0WI9ddZvQSvjTdUQ9qm3fyZufZpmhPXfjkmg+f/cbJh+m+Zzhf093bcqVVnmEl+an/FTPMaOy2jfYNbxwZDuYCUxJzewGDa74vXCYB2sPgqZikf3UlhI0ZPO8tbdhleGoiQXOcXloAELQ+ebQ6MDBr+QDqNedPW+hLultTClH56v88Tp85PT6HWnPjVQUAWR7QeL+U8mFZOQALBruQvqfB3BwromhTkTB5XtCy1WCGBtzs21CTok4+pWp5QM/E3IUv1B8dtZDqjMIyGhUnM7pFmgL58UYV1unhyMH/cM+ffzlJWIQIDAQAB"
"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsdBu6w2Var6TJHT8TQ1WdDpMu4VzSrDRP8DjY0WI9ddZvQSvjTdUQ9qm3fyZufZpmhPXfjkmg+f/cbJh+m+Zzhf093bcqVVnmEl+an/FTPMaOy2jfYNbxwZDuYCUxJzewGDa74vXCYB2sPgqZikf3UlhI0ZPO8tbdhleGoiQXOcXloAELQ+ebQ6MDBr+QDqNedPW+hLultTClH56v88Tp85PT6HWnPjVQUAWR7QeL+U8mFZOQALBruQvqfB3BwromhTkTB5XtCy1WCGBtzs21CTok4+pWp5QM/E3IUv1B8dtZDqjMIyGhUnM7pFmgL58UYV1unhyMH/cM+ffzlJWIQIDAQAB"


iex(80)> ExPublicKey.pem_encode(public_key)


** (FunctionClauseError) no function clause matching in ExPublicKey.pem_encode/1    
    
    The following arguments were given to ExPublicKey.pem_encode/1:
    
        # 1
        "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsdBu6w2Var6TJHT8TQ1WdDpMu4VzSrDRP8DjY0WI9ddZvQSvjTdUQ9qm3fyZufZpmhPXfjkmg+f/cbJh+m+Zzhf093bcqVVnmEl+an/FTPMaOy2jfYNbxwZDuYCUxJzewGDa74vXCYB2sPgqZikf3UlhI0ZPO8tbdhleGoiQXOcXloAELQ+ebQ6MDBr+QDqNedPW+hLultTClH56v88Tp85PT6HWnPjVQUAWR7QeL+U8mFZOQALBruQvqfB3BwromhTkTB5XtCy1WCGBtzs21CTok4+pWp5QM/E3IUv1B8dtZDqjMIyGhUnM7pFmgL58UYV1unhyMH/cM+ffzlJWIQIDAQAB"
    
    Attempted function clauses (showing 2 out of 2):
    
        def pem_encode(key = %ExPublicKey.RSAPrivateKey{})
        def pem_encode(key = %ExPublicKey.RSAPublicKey{})
    
    (ex_crypto 0.10.0) lib/ex_public_key.ex:316: ExPublicKey.pem_encode/1

That looks like a helpful error message at least, look at the ExPublicKey.RSAPublicKey module, perhaps decode_der?. Also, you’ll probably want to Base.decode64 the key you have, because these functions likely want it in a raw binary format.

Also might be a useful function here: Erlang -- public_key

Keep trying and search for examples that do work that you can get a hint from.

I was able to parse that string into an RSAPublicKey with:

iex(7)> {:ok, public_key} = pk_in |> Base.decode64!() |> ExPublicKey.RSAPublicKey.decode_der()
{:ok, #ExPublicKey.RSAPublicKey<
   fingerprint_sha256=
     39
     9f
     25
     36
     c0
     04
     e8
     10
     d7
     fa
     a8
     bb
     c2
     90
     49
     34
     c5
     c9
     32
     9c
     74
     b1
     1b
     62
     11
     d9
     29
     a3
     12
     2b
     98
     f4>}

which produces a plausible public key (the exponent is 65537) but with a different fingerprint…

It does validate the supplied signature, though:

pk_in = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsdBu6w2Var6TJHT8TQ1WdDpMu4VzSrDRP8DjY0WI9ddZvQSvjTdUQ9qm3fyZufZpmhPXfjkmg+f/cbJh+m+Zzhf093bcqVVnmEl+an/FTPMaOy2jfYNbxwZDuYCUxJzewGDa74vXCYB2sPgqZikf3UlhI0ZPO8tbdhleGoiQXOcXloAELQ+ebQ6MDBr+QDqNedPW+hLultTClH56v88Tp85PT6HWnPjVQUAWR7QeL+U8mFZOQALBruQvqfB3BwromhTkTB5XtCy1WCGBtzs21CTok4+pWp5QM/E3IUv1B8dtZDqjMIyGhUnM7pFmgL58UYV1unhyMH/cM+ffzlJWIQIDAQAB"
text = "1675256878678"
signature = "DQ6vLV4cRAMcCkpT0MTMHPUc8IoMvcckhjY9Fyirq/zX1Ej851g+IojotyPMqSFKbRqrpE3F2OTI717fcAxFRMCFYlcuf1mYjniCJtGTkxTE6m6GNy+ApX5ssUSb3pZajXcLw/YnKvnbiYtsnL0mFgZ27krrp8ZxEf9iDFBJRZW7JVxjaeGqe5jIN64+NODgR+OvMvHPLpNjKIrZleXwQwbOpWE1q9EIhWmApc2bDdUFeaa5RtGOLI9WNkitkhW/Dsk5FNiZOW7oo85IE65cMJ09XTKHCUmYQnhwtdKibKK84koKXELvBat9/aWe+GBdQJQa6mNFfEPnvcmpXDu3tQ=="

{:ok, public_key} = pk_in |> Base.decode64!() |> ExPublicKey.RSAPublicKey.decode_der()

{:ok, valid?} = ExPublicKey.verify(text, Base64.decode64!(signature), public_key)
1 Like

ok working but one typo here, Thanks

Base.decode64!(signature)