[erlang-questions] How to use crypto:hmac_init() and friends?

Sverker Eriksson sverker.eriksson@REDACTED
Thu Nov 19 15:18:42 CET 2015


On 11/19/2015 02:37 PM, Frans Schneider wrote:
> Dear list,
>
> I have to create the HMAC of a message by including data at several 
> points in my code as shown below:
>
> ...
> Mac_ctxt_init = crypto:hmac_init(sha256, Mac_key),
> Mac_ctxt = case Version of
>                3 ->
>                    Mac_ctxt1 = crypto:hmac_update(Mac_ctxt_init, 
> Dhi_pub),
>                    crypto:hmac_update(Mac_ctxt1, Dhir_pub);
>                2 ->
>                    Mac_ctxt_init
>            end,
> ...
> ...
> ...
> LMac_ctxt = crypto:hmac_update(Mac_ctxt, <<Version/binary, 
> Serialized/binary>>),
> LMac = crypto:hmac_final_n(LMac_ctxt, 8),
> ...
>
> This will always return <<>>! It already starts with the hmac_init() 
> which returns <<>>.
>
> Erlang/OTP 18 [erts-7.1] [source] [64-bit] [smp:2:2] 
> [async-threads:10] [hipe] [kernel-poll:false]
>
> Eshell V7.1  (abort with ^G)
> 1> K = 
> <<9,138,157,154,221,37,75,104,28,207,127,232,193,207,68,39,22,88,62,219,15,114,22,236,68,226,141,39,69,212,143,123>>.
> <<9,138,157,154,221,37,75,104,28,207,127,232,193,207,68,
>   39,22,88,62,219,15,114,22,236,68,226,141,39,69,...>>
> 2> crypto:hmac_init(sha256, K).
> <<>>
> 3>
>
> Using crypto:hmac(sha256, K, Data, 8) works fine, but is not usable.
>
> Any idea what goes wrong or what I am doing wrong?
>
Nothing is wrong (ugly maybe, but not wrong).

That empty binary is not really empty. It's a magic binary!
It's referring some internal emulator state (the hmac context in this case).

Just pass it along to hmac_update and hmac_final and you will get a nice 
regular binary in the end.

The magic binary looks and behaves like an empty binary. It will even 
lose its magic powers
and turn into a regular binary if serialized with term_to_binary.


/Sverker, Erlang/OTP









More information about the erlang-questions mailing list