#1 decoder not working on ARM

open
nobody
None
5
2011-06-08
2011-06-08
Anonymous
No

Due to (my guess) char being unsigned by default on ARM platforms (Symbian - Nokia E72 in my case) the decoder does not work as expected. I replaced 'char' with 'signed char' as argument to 'base64_decode_value' and 'fragment', which made it work for me.

Discussion


  • Anonymous
    2011-06-16

    Some more information about the signed vs unsigned issue http://www.network-theory.co.uk/docs/gccintro/gccintro_71.html

     
  • Confirming bug and workaround. I am using CodeSourcery compiler for Arm Cortex M3. Decoded strings seemed to get 0x0F 0xBE appended to the tail end. Changing "char" to "signed char" works and doesn't seem to break the x86 code. Below is a diff of the changes:

    diff --git a/cdecode.c b/cdecode.c
    index 3f0d62d..7b2aad0 100755
    --- a/cdecode.c
    +++ b/cdecode.c
    @@ -7,7 +7,7 @@ For details, see http://sourceforge.net/projects/libb64

    #include <cdecode.h>

    -int base64_decode_value(signed char value_in)
    +int base64_decode_value(char value_in)
    {
    static const char decoding[] = {62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-2,-1,-1,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51};
    static const char decoding_size = sizeof(decoding);
    @@ -26,7 +26,7 @@ int base64_decode_block(const char* code_in, const int length_in, char* plaintex
    {
    const char* codechar = code_in;
    char* plainchar = plaintext_out;
    - signed char fragment;
    + char fragment;

    *plainchar = state_in->plainchar;

    diff --git a/cdecode.h b/cdecode.h
    index 2f65f8c..d0d7f48 100755
    --- a/cdecode.h
    +++ b/cdecode.h
    @@ -21,7 +21,7 @@ typedef struct

    void base64_init_decodestate(base64_decodestate* state_in);

    -int base64_decode_value(signed char value_in);
    +int base64_decode_value(char value_in);

    int base64_decode_block(const char* code_in, const int length_in, char* plaintext_out, base64_decodestate* state_in);