<div dir="ltr"><div>Hello Ludovic,</div><div><br></div><div><span class="gmail-pl-en">I was debugging the execution of your example code, from "crypto.erl" until the OpenSSL API, but at some point I lost track - particularly because the interfacing seems to have changed significantly between OTP 21.3 and OTP 23.<br><br></span></div><div><span class="gmail-pl-en">At any rate, along the way I encountered the ASN.1 concept of an "octet string"[1] - binary data whose length is a multiple of eight. It seems to fit the output of the code you've shown (the value of that extra byte, 4, when multiplied by 8, yields 32, and so it does look like a length prefix for the public key.)</span> It also seems to be the return format of some of the OpenSSL functions invoked by the code in question back in OTP 21.3, like `EC_POINT_point2oct`[1].</div><div><br></div><div>But this is mostly guessing and intuition - I'm very possibly talking out of my backside. Hopefully someone who knows what they're talking about will answer your question.<br></div><div><br></div><div>[1]: <a href="https://www.obj-sys.com/asn1tutorial/node10.html">https://www.obj-sys.com/asn1tutorial/node10.html</a><br>[2]: <a href="https://www.openssl.org/docs/man1.0.2/man3/EC_POINT_point2oct.html">https://www.openssl.org/docs/man1.0.2/man3/EC_POINT_point2oct.html</a></div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, 10 Jul 2020 at 15:38, <a href="mailto:ludovic@demblans.com">ludovic@demblans.com</a> <<a href="mailto:ludovic@demblans.com">ludovic@demblans.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hello,<br>
<br>
I am trying some crypto code, mostly for fun. I want to generate an Ethereum public key from a know private key.<br>
<br>
This is a sample private key : <<22,99,59,58,153,154,229,99,217,142,170,105,82,105,204,11,55,249,101,152,109,41,109,195,18,134,228,189,83,139,28,92>><br>
<br>
I run this code:<br>
<br>
    -module(t).<br>
    -export([run/0]).<br>
<br>
    run() -> <br>
        PrivateKey = <<22,99,59,58,153,154,229,99,217,142,170,105,82,105,204,11,55,249,101,152,109,41,109,195,18,134,228,189,83,139,28,92>>,<br>
        {PublicKey, NewPrivateKey} = crypto:generate_key(ecdh, secp256k1, PrivateKey),<br>
        dump_hex("Private key", PrivateKey),<br>
        dump_hex("Public key", PublicKey).<br>
<br>
    dump_hex(Label, Bin) -> <br>
        io:format("~s: ~s~n", [Label, [io_lib:format("~2.16.0B",[X]) || <<X:8>> <= Bin]]).<br>
<br>
And I get this result:<br>
<br>
    Private key: 16633B3A999AE563D98EAA695269CC0B37F965986D296DC31286E4BD538B1C5C<br>
    Public key: 047D5ED8E5B1843FF0EF0F443419E3DC589D900F3C683D2D7268AC1D9FE47F7E7350A1...(cut)<br>
 <br>
But I am expected to find this: 7D5ED8E5B1843FF0EF0F443419E3DC589D900F3C683D2D7268AC1D9FE47F7E7350A...(cut)<br>
<br>
At first I was quite discouraged because crypto is hard to learn, but after giving a closer look I found that I have the correct key actually. I just have an extra leading byte. The expected length is 512 bits and I have 520.<br>
<br>
Expected   7D5ED8E5B1843FF0EF0F443419E3DC589D900F3C683D...(cut)<br>
Mine     047D5ED8E5B1843FF0EF0F443419E3DC589D900F3C683D...(cut)<br>
<br>
Do you know why the crypto library behaves like this ? Can I just cut the extra leading byte ? <br>
<br>
Thank you<br>
<br>
- lud<br>
<br>
</blockquote></div><br clear="all"><br>-- <br><div dir="ltr" class="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr">Guilherme<br></div></div></div></div></div></div>