[erlang-questions] A pointless problem?

43 views
Skip to first unread message

Steve Davis

unread,
Nov 17, 2012, 12:02:22 PM11/17/12
to Erlang Questions
I am intrigued by what is arguably a pointless problem.

Looking at the tiny encryption algorithm aka XXTEA it seemed easy enough to implement in Erlang. I have an implementation (attached with source and all references inside the module) which encodes and decodes successfully... BUT the cipher text doesn't match the test vectors...

What makes this pointless is that I should "just make it a NIF" etc. But it's likely that I am misunderstanding some aspect of either Erlang or C, however I am confounded as to what that problem is... why does the attached implementation not generate the same ciphertext as in the test vectors from the C implementation? Can anyone spot my error?

Thanks,
/s

xxtea.erl.txt

Dmitry Kolesnikov

unread,
Nov 17, 2012, 12:28:42 PM11/17/12
to Steve Davis, Erlang Questions
Hello,

This looks as endianness problem. You have to keep in-mind that binaries is big-endian by default, which contrasts with C memory. You have to be very careful of C algorithms mapping.

I've made a small fixes to int32list_xxx routines (see bold text):

int32list_from_binary(Bin) ->
int32list_from_binary(Bin, []).
int32list_from_binary(<<X:32/little, Bin/binary>>, Acc) ->
int32list_from_binary(Bin, [X|Acc]);
int32list_from_binary(<<>>, Acc) ->
lists:reverse(Acc).

int32list_to_binary(List) ->
list_to_binary([<<X:32/little>> || X <- List]).

Some of tests got passed. Unfortunately, some of tests are failed I hope you can easily validate rest of you code agains endian.  

{test,true,true,{<<"ab043705808c5d57">>,<<"ab043705808c5d57">>}}
{test,false,true,{<<"26e3868b9d66a048">>,<<"d1e78be2c746728a">>}}
{test,false,true,{<<"2a70e36b99941f2d">>,<<"67ed0ea8e8973fc5">>}}
{test,false,true,{<<"a30d3870c0873c23">>,<<"8c3707c01c7fccc4">>}}
{test,true,true,
      {<<"b2601cefb078b772abccba6a">>,<<"b2601cefb078b772abccba6a">>}}
{test,false,true,
      {<<"ddbcb4b88b2c5a268081a8b4">>,<<"579016d143ed6247ac6710dd">>}}
{test,true,true,
      {<<"c0a19f06ebb0d63925aa27f74cc6b2d0">>,
       <<"c0a19f06ebb0d63925aa27f74cc6b2d0">>}}
{test,false,true,
      {<<"bd28749d4fc20b73a79d59a25d55ab27">>,
       <<"01b815fd2e4894d13555da434c9d868a">>}}

Best Regards,
Dmitry


<xxtea.erl.txt>_______________________________________________
erlang-questions mailing list
erlang-q...@erlang.org
http://erlang.org/mailman/listinfo/erlang-questions

Joe Armstrong

unread,
Nov 17, 2012, 12:33:22 PM11/17/12
to Steve Davis, Erlang Questions
On Sat, Nov 17, 2012 at 6:02 PM, Steve Davis <steven.cha...@gmail.com> wrote:
I am intrigued by what is arguably a pointless problem.

Not really
 

Looking at the tiny encryption algorithm aka XXTEA it seemed easy enough to implement in Erlang. I have an implementation (attached with source and all references inside the module) which encodes and decodes successfully... BUT the cipher text doesn't match the test vectors...

I had exactly the same problem with tea a few years ago ...

I'd really like to see:

a) an algebraic spec
b) reference implementations in more than one language that I can reproduce

I'm more interested in inter-operability than performance - (think client in Javascript
backend in C / Erlang) - so compliance with the spec is more important than performance.
(which is why I like RSA implemented in erlang bignums - no chance of backdoors in the code)

  

What makes this pointless is that I should "just make it a NIF" etc. But it's likely that I am misunderstanding some aspect of either Erlang or C, however I am confounded as to what that problem is... why does the attached implementation not generate the same ciphertext as in the test vectors from the C implementation? Can anyone spot my error?


Before you ask this you might ask "can the test vectors be reproduced in any other
language/implementation than the reference implementation?"

Cheers

/Joe



 
Thanks,
/s

Steve Davis

unread,
Nov 17, 2012, 12:39:45 PM11/17/12
to Dmitry Kolesnikov, Erlang Questions
Ah - insight. Endianness did occur to me as a problem but I think I maybe went "too far" in compensating for it previously.

From the tests now I can see that it's the Key endianness that is the remaining issue...

Thank you so much!

Regards,
/s

Slava Yurin

unread,
Nov 17, 2012, 12:40:59 PM11/17/12
to Steve Davis, Erlang Questions
I confirm this.
О©╫
18.11.2012, 00:28, "Dmitry Kolesnikov" <dmkole...@gmail.com>:
Hello,
This looks as endianness problem. You have to keep in-mind that binaries is big-endianО©╫by default, which contrasts with C memory. You have to be very careful of C algorithms mapping.
О©╫
s/:32/:32\/little/g make test work.
My 5 cents:
О©╫ You can write list_to_binary([<<X:32/little>> || X <- List]) as << <<X:32/little>> || X <- List >>.

Steve Davis

unread,
Nov 17, 2012, 12:45:12 PM11/17/12
to Dmitry Kolesnikov, Erlang Questions
once I made an additional small mod to the key decoding 

i.e.
encode(Key, Plaintext) ->
K = list_to_tuple(int32list_from_binary(Key)),

I got success:

73> ice_crypto_btea:test().
{test,true,true,{<<"ab043705808c5d57">>,<<"ab043705808c5d57">>}}
{test,true,true,{<<"d1e78be2c746728a">>,<<"d1e78be2c746728a">>}}
{test,true,true,{<<"67ed0ea8e8973fc5">>,<<"67ed0ea8e8973fc5">>}}
{test,true,true,{<<"8c3707c01c7fccc4">>,<<"8c3707c01c7fccc4">>}}
{test,true,true,
      {<<"b2601cefb078b772abccba6a">>,<<"b2601cefb078b772abccba6a">>}}
{test,true,true,
      {<<"579016d143ed6247ac6710dd">>,<<"579016d143ed6247ac6710dd">>}}
{test,true,true,
      {<<"c0a19f06ebb0d63925aa27f74cc6b2d0">>,
       <<"c0a19f06ebb0d63925aa27f74cc6b2d0">>}}
{test,true,true,
      {<<"01b815fd2e4894d13555da434c9d868a">>,
       <<"01b815fd2e4894d13555da434c9d868a">>}}

My thanks to you for saving my sanity!

Best regards,
/s

On Nov 17, 2012, at 11:28 AM, Dmitry Kolesnikov <dmkole...@gmail.com> wrote:

Reply all
Reply to author
Forward
0 new messages