HMAC on Android and embedded zeroes

I started noticing difference of behaviour between the simulator and my Android phone when dealing with HMAC SHA256. While investigating the source of the difference, I was able to reproduce a similar problem by manually embedding a zero in the key. I strongly doubt that this has anything to do with my original problem, even though I have at some point generated a key with an embedded zero (still, this doesn’t explain why I would systematically use that key with Android, and only with Android).

However, I think it may be interesting to share with you the following results; in short, the comparison between TEST 2 and TEST 3 on Android suggests that when using a key with an embedded 0, Corona on Android assumes that zero as a terminator; comparison between TEST 2 and TEST 6 across the two platforms shows the difference in behaviour. All other tests (1, 3, 4, 5, 7) behave the same on Corona Simulator and Android.

Source code

local crypto = require("crypto") print("TEST 1: ", crypto.hmac(crypto.sha256, "qwerty", "asdfgh")) print("TEST 2: ", crypto.hmac(crypto.sha256, "qwerty", "asd\0fgh")) print("TEST 3: ", crypto.hmac(crypto.sha256, "qwerty", "asd")) print("TEST 4: ", crypto.hmac(crypto.sha256, "qwe\0rty", "asdfgh")) print("TEST 5: ", crypto.hmac(crypto.sha256, "qwe", "asdfgh")) print("TEST 6: ", crypto.hmac(crypto.sha256, "qwe\0rty", "asd\0fgh")) print("TEST 7: ", crypto.hmac(crypto.sha256, "qwe", "asd"))

LogCat from Android 4.3

TEST 1:      b1b6b424f27d38cec01207f365eda7375d1aac989a7741193fa05758adef2687 TEST 2:      8abc5b865798501dbed66d97f698b2e1a3ffce4bc04992dc164d12df7804ff8b TEST 3:      8abc5b865798501dbed66d97f698b2e1a3ffce4bc04992dc164d12df7804ff8b TEST 4:      2c72d38f63990bf658358ed674a18fcd6b0ddc8e3741c97297f2716b7b958338 TEST 5:      8db7f015bc82926019ed365adc0a22baba88fc5c6adf90bc071a0b8bc778b715 TEST 6:      2ade900e2bdad4796844faee82ba274c0c3ac47787d82fb0146ddfbe1ef351bd TEST 7:      461379486794f3b5752e1ffcf597a274ac31c3afb00987a1e31b6b78a087f552

Output from Corona Simulator 2014.2511 (2014.11.18)

TEST 1:         b1b6b424f27d38cec01207f365eda7375d1aac989a7741193fa05758adef2687 TEST 2:         508b515e0b78733a7786c1526c487ffd35e9e226f9ea5bc506879fa31d53f42f TEST 3:         8abc5b865798501dbed66d97f698b2e1a3ffce4bc04992dc164d12df7804ff8b TEST 4:         2c72d38f63990bf658358ed674a18fcd6b0ddc8e3741c97297f2716b7b958338 TEST 5:         8db7f015bc82926019ed365adc0a22baba88fc5c6adf90bc071a0b8bc778b715 TEST 6:         30a3eac2ab460680c142610deeda870dfc87413b1db1dbbaea0a5ca804756b67 TEST 7:         461379486794f3b5752e1ffcf597a274ac31c3afb00987a1e31b6b78a087f552

This issue was fixed in daily build #2528 last December.

   https://developer.coronalabs.com/release/2014/2528/

According to the test results, the issue was that Android assumed the key was a null terminated string.  We fixed it in that daily build to accept it as a binary array as-is, including embedded null characters.

Awesome! I knew, I should have updated first :frowning:

Thank you for your prompt response!

Happy to help!  You’re one of the (lucky?) few to have noticed this issue.

The one thing you might want to re-test though is the last argument containing embedded nulls.  According to the test results that I saw for that build, that was working correctly.  One of our tests was to feed it the bytes of a file that did contain zero value bytes.  It was only an issue with the key field containing embedded nulls.

Since at the time of posting the latest release referenced from the home page is still 2014.2511, I think I’ll add some details. As I mentioned in the original post, I had strong doubts that my woes were caused by a zero in the key; it happened so frequently and so consistently that Android and simulator HMACs differed that there must have been some other explanation.

So, my conclusion is that the HMAC function, as implemented in Android, fails to provide the wrong results if the key contains:

  1. A zero, as already noted above.
  2. A value greater than 127; this is probably a sign issue.

The latest daily build (2015.2627) is immune to both problems. Probably also 2014.2528, mentioned by Joshua as fixing 1, also fixes 2, but there isn’t much point in checking that out now.

Also, I can confirm that 0s or >127 in the data parameter have never been an issue; only the key parameter appeared to be sensitive to it, in version 2014.2511. Again, the latest daily build (2015.2627, at the time of writing) fixes everything. At the end of this post you can find the main.lua that I used to verify the behavior. The multi-line comment at the end of the file shows the output of the program on Android and simulator, for versions 2014.2511 and 2015.2627.

Thank you for the amazing work you are doing!

local crypto = require("crypto") local function pad(val)     local b = tostring(val)          if #b == 1 then return "  " .. b     elseif #b == 2 then return " " .. b     else return b     end end local function showinput(tag, bytes)     local s = ""          for i = 1, #bytes do         s = s .. " " .. pad(string.byte(bytes, i))     end          print(tag, s) end local function showhash(tag, bytes)     local s = ""          for i = 1, 7 do         s = s .. " " .. pad(string.byte(bytes, i))     end          s = s .. " ..."          for i = #bytes - 7, #bytes do         s = s .. " " .. pad(string.byte(bytes, i))     end          print(tag, s) end local function testmac(key, msg, testNumber)     print("------------------------------- Test " .. pad(testNumber) .. " -------------------------------")          showinput("KEY", key)     showinput("MSG", msg)     showhash("DIG", crypto.hmac(crypto.sha256, msg, key, true))          print("") end local ch126 = string.char(126) local ch127 = string.char(127) local ch128 = string.char(128) local ch129 = string.char(129) testmac("d.3-\*#(I" .. ch126 .. "J$()@~i", "~02eQ\*()@89h" .. ch126 .. "3fj", 1) testmac("d.3-\*#(I" .. ch126 .. "J$()@~i", "~02eQ\*()@89h" .. ch127 .. "3fj", 2) testmac("d.3-\*#(I" .. ch126 .. "J$()@~i", "~02eQ\*()@89h" .. ch128 .. "3fj", 3) testmac("d.3-\*#(I" .. ch126 .. "J$()@~i", "~02eQ\*()@89h" .. ch129 .. "3fj", 4) testmac("d.3-\*#(I" .. ch127 .. "J$()@~i", "~02eQ\*()@89h" .. ch126 .. "3fj", 5) testmac("d.3-\*#(I" .. ch127 .. "J$()@~i", "~02eQ\*()@89h" .. ch127 .. "3fj", 6) testmac("d.3-\*#(I" .. ch127 .. "J$()@~i", "~02eQ\*()@89h" .. ch128 .. "3fj", 7) testmac("d.3-\*#(I" .. ch127 .. "J$()@~i", "~02eQ\*()@89h" .. ch129 .. "3fj", 8) testmac("d.3-\*#(I" .. ch128 .. "J$()@~i", "~02eQ\*()@89h" .. ch126 .. "3fj", 9) testmac("d.3-\*#(I" .. ch128 .. "J$()@~i", "~02eQ\*()@89h" .. ch127 .. "3fj", 10) testmac("d.3-\*#(I" .. ch128 .. "J$()@~i", "~02eQ\*()@89h" .. ch128 .. "3fj", 11) testmac("d.3-\*#(I" .. ch128 .. "J$()@~i", "~02eQ\*()@89h" .. ch129 .. "3fj", 12) testmac("d.3-\*#(I" .. ch129 .. "J$()@~i", "~02eQ\*()@89h" .. ch126 .. "3fj", 13) testmac("d.3-\*#(I" .. ch129 .. "J$()@~i", "~02eQ\*()@89h" .. ch127 .. "3fj", 14) testmac("d.3-\*#(I" .. ch129 .. "J$()@~i", "~02eQ\*()@89h" .. ch128 .. "3fj", 15) testmac("d.3-\*#(I" .. ch129 .. "J$()@~i", "~02eQ\*()@89h" .. ch129 .. "3fj", 16) --[[2014.2511 (2014.11.18) - CORONA SIMULATOR ------------------------------- Test   1 ------------------------------- KEY      100  46  51  45  42  35  40  73 126  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 126  51 102 106 DIG       60 214  10 219 181 189 220 ... 168  37 211  94 196 144 176 198 ------------------------------- Test   2 ------------------------------- KEY      100  46  51  45  42  35  40  73 126  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 127  51 102 106 DIG      208 202 141 172  22  56 240 ...  23 184  39 232  46   6 192 186 ------------------------------- Test   3 ------------------------------- KEY      100  46  51  45  42  35  40  73 126  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 128  51 102 106 DIG       25 153  82  88 184 224  90 ...  45  36 167 215 102 233 175 172 ------------------------------- Test   4 ------------------------------- KEY      100  46  51  45  42  35  40  73 126  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 129  51 102 106 DIG       77  99 169 228 205 167  44 ... 247 190 112 192  27 192 144 114 ------------------------------- Test   5 ------------------------------- KEY      100  46  51  45  42  35  40  73 127  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 126  51 102 106 DIG      216  98 215  31 211  42  70 ...  31  34  90 105 127 205 197 255 ------------------------------- Test   6 ------------------------------- KEY      100  46  51  45  42  35  40  73 127  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 127  51 102 106 DIG      253 141 237 149   7 124  40 ...  39  63  98  42  42 146 100 166 ------------------------------- Test   7 ------------------------------- KEY      100  46  51  45  42  35  40  73 127  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 128  51 102 106 DIG      156  89 231 104   9 206 244 ...  45 232  30 177  77  64 162 245 ------------------------------- Test   8 ------------------------------- KEY      100  46  51  45  42  35  40  73 127  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 129  51 102 106 DIG      243 242  46 129  80  66 213 ... 171  91 129 252  59   5   4 237 ------------------------------- Test   9 ------------------------------- KEY      100  46  51  45  42  35  40  73 128  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 126  51 102 106 DIG      196 158 110 203  26   6 181 ... 142 166  82  22  43 199 109  40 ------------------------------- Test  10 ------------------------------- KEY      100  46  51  45  42  35  40  73 128  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 127  51 102 106 DIG       61 143 254 207  91 139 229 ... 248 239 151 174  79 199  13 229 ------------------------------- Test  11 ------------------------------- KEY      100  46  51  45  42  35  40  73 128  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 128  51 102 106 DIG       63  99 128 207 220  87 165 ...  61  91 255 195  20 144 240  81 ------------------------------- Test  12 ------------------------------- KEY      100  46  51  45  42  35  40  73 128  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 129  51 102 106 DIG      159 169 242  93  12  59 170 ... 238 188 201  99  99  73  45 207 ------------------------------- Test  13 ------------------------------- KEY      100  46  51  45  42  35  40  73 129  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 126  51 102 106 DIG       70   3 125 214 243  50 219 ... 131 121  57  69 175 197 247  66 ------------------------------- Test  14 ------------------------------- KEY      100  46  51  45  42  35  40  73 129  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 127  51 102 106 DIG       15  84   6 219 209  58 108 ...  88  99  19  55 111  35  74 160 ------------------------------- Test  15 ------------------------------- KEY      100  46  51  45  42  35  40  73 129  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 128  51 102 106 DIG       28  61  17 187 209  63  80 ... 133  21  74 161 123  70  82 109 ------------------------------- Test  16 ------------------------------- KEY      100  46  51  45  42  35  40  73 129  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 129  51 102 106 DIG      253 196  70  39 105 202 213 ...   0  22  98  39  11 237 238 222 2014.2511 (2014.11.18) - ANDROID 4.3 I/Corona  (26838): ------------------------------- Test   1 ------------------------------- I/Corona  (26838): KEY   100  46  51  45  42  35  40  73 126  74  36  40  41  64 126 105 I/Corona  (26838): MSG   126  48  50 101  81  42  40  41  64  56  57 104 126  51 102 106 I/Corona  (26838): DIG    60 214  10 219 181 189 220 ... 168  37 211  94 196 144 176 198 I/Corona  (26838): ------------------------------- Test   2 ------------------------------- I/Corona  (26838): KEY   100  46  51  45  42  35  40  73 126  74  36  40  41  64 126 105 I/Corona  (26838): MSG   126  48  50 101  81  42  40  41  64  56  57 104 127  51 102 106 I/Corona  (26838): DIG   208 202 141 172  22  56 240 ...  23 184  39 232  46   6 192 186 I/Corona  (26838): ------------------------------- Test   3 ------------------------------- I/Corona  (26838): KEY   100  46  51  45  42  35  40  73 126  74  36  40  41  64 126 105 I/Corona  (26838): MSG   126  48  50 101  81  42  40  41  64  56  57 104 128  51 102 106 I/Corona  (26838): DIG    25 153  82  88 184 224  90 ...  45  36 167 215 102 233 175 172 I/Corona  (26838): ------------------------------- Test   4 ------------------------------- I/Corona  (26838): KEY   100  46  51  45  42  35  40  73 126  74  36  40  41  64 126 105 I/Corona  (26838): MSG   126  48  50 101  81  42  40  41  64  56  57 104 129  51 102 106 I/Corona  (26838): DIG    77  99 169 228 205 167  44 ... 247 190 112 192  27 192 144 114 I/Corona  (26838): ------------------------------- Test   5 ------------------------------- I/Corona  (26838): KEY   100  46  51  45  42  35  40  73 127  74  36  40  41  64 126 105 I/Corona  (26838): MSG   126  48  50 101  81  42  40  41  64  56  57 104 126  51 102 106 I/Corona  (26838): DIG   216  98 215  31 211  42  70 ...  31  34  90 105 127 205 197 255 I/Corona  (26838): ------------------------------- Test   6 ------------------------------- I/Corona  (26838): KEY   100  46  51  45  42  35  40  73 127  74  36  40  41  64 126 105 I/Corona  (26838): MSG   126  48  50 101  81  42  40  41  64  56  57 104 127  51 102 106 I/Corona  (26838): DIG   253 141 237 149   7 124  40 ...  39  63  98  42  42 146 100 166 I/Corona  (26838): ------------------------------- Test   7 ------------------------------- I/Corona  (26838): KEY   100  46  51  45  42  35  40  73 127  74  36  40  41  64 126 105 I/Corona  (26838): MSG   126  48  50 101  81  42  40  41  64  56  57 104 128  51 102 106 I/Corona  (26838): DIG   156  89 231 104   9 206 244 ...  45 232  30 177  77  64 162 245 I/Corona  (26838): ------------------------------- Test   8 ------------------------------- I/Corona  (26838): KEY   100  46  51  45  42  35  40  73 127  74  36  40  41  64 126 105 I/Corona  (26838): MSG   126  48  50 101  81  42  40  41  64  56  57 104 129  51 102 106 I/Corona  (26838): DIG   243 242  46 129  80  66 213 ... 171  91 129 252  59   5   4 237 I/Corona  (26838): ------------------------------- Test   9 ------------------------------- I/Corona  (26838): KEY   100  46  51  45  42  35  40  73 128  74  36  40  41  64 126 105 I/Corona  (26838): MSG   126  48  50 101  81  42  40  41  64  56  57 104 126  51 102 106 I/Corona  (26838): DIG   137 251 178 134   1 200  33 ... 209  71 132 231 175 127  65 175 I/Corona  (26838): ------------------------------- Test  10 ------------------------------- I/Corona  (26838): KEY   100  46  51  45  42  35  40  73 128  74  36  40  41  64 126 105 I/Corona  (26838): MSG   126  48  50 101  81  42  40  41  64  56  57 104 127  51 102 106 I/Corona  (26838): DIG    43 195 153 215 223 217 155 ...  12  11  80 114 230 168 168  67 I/Corona  (26838): ------------------------------- Test  11 ------------------------------- I/Corona  (26838): KEY   100  46  51  45  42  35  40  73 128  74  36  40  41  64 126 105 I/Corona  (26838): MSG   126  48  50 101  81  42  40  41  64  56  57 104 128  51 102 106 I/Corona  (26838): DIG   174 179 171 239   4 235  68 ...  58 142   0 187 139 253  33  67 I/Corona  (26838): ------------------------------- Test  12 ------------------------------- I/Corona  (26838): KEY   100  46  51  45  42  35  40  73 128  74  36  40  41  64 126 105 I/Corona  (26838): MSG   126  48  50 101  81  42  40  41  64  56  57 104 129  51 102 106 I/Corona  (26838): DIG   122 189  34 107  70 249 129 ...  87 189 183 150  96 135 213 145 I/Corona  (26838): ------------------------------- Test  13 ------------------------------- I/Corona  (26838): KEY   100  46  51  45  42  35  40  73 129  74  36  40  41  64 126 105 I/Corona  (26838): MSG   126  48  50 101  81  42  40  41  64  56  57 104 126  51 102 106 I/Corona  (26838): DIG     8   2 221  26 228 180  14 ...  77  51 122 137  22 183 230 164 I/Corona  (26838): ------------------------------- Test  14 ------------------------------- I/Corona  (26838): KEY   100  46  51  45  42  35  40  73 129  74  36  40  41  64 126 105 I/Corona  (26838): MSG   126  48  50 101  81  42  40  41  64  56  57 104 127  51 102 106 I/Corona  (26838): DIG   214  63 196 238 193  22 103 ... 173 199 223 140 141  86 119  30 I/Corona  (26838): ------------------------------- Test  15 ------------------------------- I/Corona  (26838): KEY   100  46  51  45  42  35  40  73 129  74  36  40  41  64 126 105 I/Corona  (26838): MSG   126  48  50 101  81  42  40  41  64  56  57 104 128  51 102 106 I/Corona  (26838): DIG   218  39 162  67 160 252  79 ... 166 237 131  40  21 231 162  94 I/Corona  (26838): ------------------------------- Test  16 ------------------------------- I/Corona  (26838): KEY   100  46  51  45  42  35  40  73 129  74  36  40  41  64 126 105 I/Corona  (26838): MSG   126  48  50 101  81  42  40  41  64  56  57 104 129  51 102 106 I/Corona  (26838): DIG   171  42  50 138  81  50  59 ... 226 177  62  86 211  25 253 103 2015.2627 (2015.5.2) - CORONA SIMULATOR ------------------------------- Test   1 ------------------------------- KEY      100  46  51  45  42  35  40  73 126  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 126  51 102 106 DIG       60 214  10 219 181 189 220 ... 168  37 211  94 196 144 176 198 ------------------------------- Test   2 ------------------------------- KEY      100  46  51  45  42  35  40  73 126  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 127  51 102 106 DIG      208 202 141 172  22  56 240 ...  23 184  39 232  46   6 192 186 ------------------------------- Test   3 ------------------------------- KEY      100  46  51  45  42  35  40  73 126  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 128  51 102 106 DIG       25 153  82  88 184 224  90 ...  45  36 167 215 102 233 175 172 ------------------------------- Test   4 ------------------------------- KEY      100  46  51  45  42  35  40  73 126  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 129  51 102 106 DIG       77  99 169 228 205 167  44 ... 247 190 112 192  27 192 144 114 ------------------------------- Test   5 ------------------------------- KEY      100  46  51  45  42  35  40  73 127  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 126  51 102 106 DIG      216  98 215  31 211  42  70 ...  31  34  90 105 127 205 197 255 ------------------------------- Test   6 ------------------------------- KEY      100  46  51  45  42  35  40  73 127  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 127  51 102 106 DIG      253 141 237 149   7 124  40 ...  39  63  98  42  42 146 100 166 ------------------------------- Test   7 ------------------------------- KEY      100  46  51  45  42  35  40  73 127  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 128  51 102 106 DIG      156  89 231 104   9 206 244 ...  45 232  30 177  77  64 162 245 ------------------------------- Test   8 ------------------------------- KEY      100  46  51  45  42  35  40  73 127  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 129  51 102 106 DIG      243 242  46 129  80  66 213 ... 171  91 129 252  59   5   4 237 ------------------------------- Test   9 ------------------------------- KEY      100  46  51  45  42  35  40  73 128  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 126  51 102 106 DIG      196 158 110 203  26   6 181 ... 142 166  82  22  43 199 109  40 ------------------------------- Test  10 ------------------------------- KEY      100  46  51  45  42  35  40  73 128  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 127  51 102 106 DIG       61 143 254 207  91 139 229 ... 248 239 151 174  79 199  13 229 ------------------------------- Test  11 ------------------------------- KEY      100  46  51  45  42  35  40  73 128  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 128  51 102 106 DIG       63  99 128 207 220  87 165 ...  61  91 255 195  20 144 240  81 ------------------------------- Test  12 ------------------------------- KEY      100  46  51  45  42  35  40  73 128  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 129  51 102 106 DIG      159 169 242  93  12  59 170 ... 238 188 201  99  99  73  45 207 ------------------------------- Test  13 ------------------------------- KEY      100  46  51  45  42  35  40  73 129  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 126  51 102 106 DIG       70   3 125 214 243  50 219 ... 131 121  57  69 175 197 247  66 ------------------------------- Test  14 ------------------------------- KEY      100  46  51  45  42  35  40  73 129  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 127  51 102 106 DIG       15  84   6 219 209  58 108 ...  88  99  19  55 111  35  74 160 ------------------------------- Test  15 ------------------------------- KEY      100  46  51  45  42  35  40  73 129  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 128  51 102 106 DIG       28  61  17 187 209  63  80 ... 133  21  74 161 123  70  82 109 ------------------------------- Test  16 ------------------------------- KEY      100  46  51  45  42  35  40  73 129  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 129  51 102 106 DIG      253 196  70  39 105 202 213 ...   0  22  98  39  11 237 238 222 2015.2627 (2015.5.2) - ANDROID 4.3 I/Corona  (27447): ------------------------------- Test   1 ------------------------------- I/Corona  (27447): KEY   100  46  51  45  42  35  40  73 126  74  36  40  41  64 126 105 I/Corona  (27447): MSG   126  48  50 101  81  42  40  41  64  56  57 104 126  51 102 106 I/Corona  (27447): DIG    60 214  10 219 181 189 220 ... 168  37 211  94 196 144 176 198 I/Corona  (27447): ------------------------------- Test   2 ------------------------------- I/Corona  (27447): KEY   100  46  51  45  42  35  40  73 126  74  36  40  41  64 126 105 I/Corona  (27447): MSG   126  48  50 101  81  42  40  41  64  56  57 104 127  51 102 106 I/Corona  (27447): DIG   208 202 141 172  22  56 240 ...  23 184  39 232  46   6 192 186 I/Corona  (27447): ------------------------------- Test   3 ------------------------------- I/Corona  (27447): KEY   100  46  51  45  42  35  40  73 126  74  36  40  41  64 126 105 I/Corona  (27447): MSG   126  48  50 101  81  42  40  41  64  56  57 104 128  51 102 106 I/Corona  (27447): DIG    25 153  82  88 184 224  90 ...  45  36 167 215 102 233 175 172 I/Corona  (27447): ------------------------------- Test   4 ------------------------------- I/Corona  (27447): KEY   100  46  51  45  42  35  40  73 126  74  36  40  41  64 126 105 I/Corona  (27447): MSG   126  48  50 101  81  42  40  41  64  56  57 104 129  51 102 106 I/Corona  (27447): DIG    77  99 169 228 205 167  44 ... 247 190 112 192  27 192 144 114 I/Corona  (27447): ------------------------------- Test   5 ------------------------------- I/Corona  (27447): KEY   100  46  51  45  42  35  40  73 127  74  36  40  41  64 126 105 I/Corona  (27447): MSG   126  48  50 101  81  42  40  41  64  56  57 104 126  51 102 106 I/Corona  (27447): DIG   216  98 215  31 211  42  70 ...  31  34  90 105 127 205 197 255 I/Corona  (27447): ------------------------------- Test   6 ------------------------------- I/Corona  (27447): KEY   100  46  51  45  42  35  40  73 127  74  36  40  41  64 126 105 I/Corona  (27447): MSG   126  48  50 101  81  42  40  41  64  56  57 104 127  51 102 106 I/Corona  (27447): DIG   253 141 237 149   7 124  40 ...  39  63  98  42  42 146 100 166 I/Corona  (27447): ------------------------------- Test   7 ------------------------------- I/Corona  (27447): KEY   100  46  51  45  42  35  40  73 127  74  36  40  41  64 126 105 I/Corona  (27447): MSG   126  48  50 101  81  42  40  41  64  56  57 104 128  51 102 106 I/Corona  (27447): DIG   156  89 231 104   9 206 244 ...  45 232  30 177  77  64 162 245 I/Corona  (27447): ------------------------------- Test   8 ------------------------------- I/Corona  (27447): KEY   100  46  51  45  42  35  40  73 127  74  36  40  41  64 126 105 I/Corona  (27447): MSG   126  48  50 101  81  42  40  41  64  56  57 104 129  51 102 106 I/Corona  (27447): DIG   243 242  46 129  80  66 213 ... 171  91 129 252  59   5   4 237 I/Corona  (27447): ------------------------------- Test   9 ------------------------------- I/Corona  (27447): KEY   100  46  51  45  42  35  40  73 128  74  36  40  41  64 126 105 I/Corona  (27447): MSG   126  48  50 101  81  42  40  41  64  56  57 104 126  51 102 106 I/Corona  (27447): DIG   196 158 110 203  26   6 181 ... 142 166  82  22  43 199 109  40 I/Corona  (27447): ------------------------------- Test  10 ------------------------------- I/Corona  (27447): KEY   100  46  51  45  42  35  40  73 128  74  36  40  41  64 126 105 I/Corona  (27447): MSG   126  48  50 101  81  42  40  41  64  56  57 104 127  51 102 106 I/Corona  (27447): DIG    61 143 254 207  91 139 229 ... 248 239 151 174  79 199  13 229 I/Corona  (27447): ------------------------------- Test  11 ------------------------------- I/Corona  (27447): KEY   100  46  51  45  42  35  40  73 128  74  36  40  41  64 126 105 I/Corona  (27447): MSG   126  48  50 101  81  42  40  41  64  56  57 104 128  51 102 106 I/Corona  (27447): DIG    63  99 128 207 220  87 165 ...  61  91 255 195  20 144 240  81 I/Corona  (27447): ------------------------------- Test  12 ------------------------------- I/Corona  (27447): KEY   100  46  51  45  42  35  40  73 128  74  36  40  41  64 126 105 I/Corona  (27447): MSG   126  48  50 101  81  42  40  41  64  56  57 104 129  51 102 106 I/Corona  (27447): DIG   159 169 242  93  12  59 170 ... 238 188 201  99  99  73  45 207 I/Corona  (27447): ------------------------------- Test  13 ------------------------------- I/Corona  (27447): KEY   100  46  51  45  42  35  40  73 129  74  36  40  41  64 126 105 I/Corona  (27447): MSG   126  48  50 101  81  42  40  41  64  56  57 104 126  51 102 106 I/Corona  (27447): DIG    70   3 125 214 243  50 219 ... 131 121  57  69 175 197 247  66 I/Corona  (27447): ------------------------------- Test  14 ------------------------------- I/Corona  (27447): KEY   100  46  51  45  42  35  40  73 129  74  36  40  41  64 126 105 I/Corona  (27447): MSG   126  48  50 101  81  42  40  41  64  56  57 104 127  51 102 106 I/Corona  (27447): DIG    15  84   6 219 209  58 108 ...  88  99  19  55 111  35  74 160 I/Corona  (27447): ------------------------------- Test  15 ------------------------------- I/Corona  (27447): KEY   100  46  51  45  42  35  40  73 129  74  36  40  41  64 126 105 I/Corona  (27447): MSG   126  48  50 101  81  42  40  41  64  56  57 104 128  51 102 106 I/Corona  (27447): DIG    28  61  17 187 209  63  80 ... 133  21  74 161 123  70  82 109 I/Corona  (27447): ------------------------------- Test  16 ------------------------------- I/Corona  (27447): KEY   100  46  51  45  42  35  40  73 129  74  36  40  41  64 126 105 I/Corona  (27447): MSG   126  48  50 101  81  42  40  41  64  56  57 104 129  51 102 106 I/Corona  (27447): DIG   253 196  70  39 105 202 213 ...   0  22  98  39  11 237 238 222]]--

>> A value greater than 127; this is probably a sign issue.

Oh right.  Yeah, the code used to convert the key to a UTF-16 string, which was wrong of course and explains why it would fail with byte values greater than 127 because the 8th bit in a UTF-8 string flags that it is a Unicode character which causes the following 2-5 bytes to be converted to a 2 byte UTF-16 Unicode character.  Build #2528 definitely fixes that issue too now that the key is always processed as a binary array.  Thanks for taking the time to post your findings.

This issue was fixed in daily build #2528 last December.

   https://developer.coronalabs.com/release/2014/2528/

According to the test results, the issue was that Android assumed the key was a null terminated string.  We fixed it in that daily build to accept it as a binary array as-is, including embedded null characters.

Awesome! I knew, I should have updated first :frowning:

Thank you for your prompt response!

Happy to help!  You’re one of the (lucky?) few to have noticed this issue.

The one thing you might want to re-test though is the last argument containing embedded nulls.  According to the test results that I saw for that build, that was working correctly.  One of our tests was to feed it the bytes of a file that did contain zero value bytes.  It was only an issue with the key field containing embedded nulls.

Since at the time of posting the latest release referenced from the home page is still 2014.2511, I think I’ll add some details. As I mentioned in the original post, I had strong doubts that my woes were caused by a zero in the key; it happened so frequently and so consistently that Android and simulator HMACs differed that there must have been some other explanation.

So, my conclusion is that the HMAC function, as implemented in Android, fails to provide the wrong results if the key contains:

  1. A zero, as already noted above.
  2. A value greater than 127; this is probably a sign issue.

The latest daily build (2015.2627) is immune to both problems. Probably also 2014.2528, mentioned by Joshua as fixing 1, also fixes 2, but there isn’t much point in checking that out now.

Also, I can confirm that 0s or >127 in the data parameter have never been an issue; only the key parameter appeared to be sensitive to it, in version 2014.2511. Again, the latest daily build (2015.2627, at the time of writing) fixes everything. At the end of this post you can find the main.lua that I used to verify the behavior. The multi-line comment at the end of the file shows the output of the program on Android and simulator, for versions 2014.2511 and 2015.2627.

Thank you for the amazing work you are doing!

local crypto = require("crypto") local function pad(val)     local b = tostring(val)          if #b == 1 then return "  " .. b     elseif #b == 2 then return " " .. b     else return b     end end local function showinput(tag, bytes)     local s = ""          for i = 1, #bytes do         s = s .. " " .. pad(string.byte(bytes, i))     end          print(tag, s) end local function showhash(tag, bytes)     local s = ""          for i = 1, 7 do         s = s .. " " .. pad(string.byte(bytes, i))     end          s = s .. " ..."          for i = #bytes - 7, #bytes do         s = s .. " " .. pad(string.byte(bytes, i))     end          print(tag, s) end local function testmac(key, msg, testNumber)     print("------------------------------- Test " .. pad(testNumber) .. " -------------------------------")          showinput("KEY", key)     showinput("MSG", msg)     showhash("DIG", crypto.hmac(crypto.sha256, msg, key, true))          print("") end local ch126 = string.char(126) local ch127 = string.char(127) local ch128 = string.char(128) local ch129 = string.char(129) testmac("d.3-\*#(I" .. ch126 .. "J$()@~i", "~02eQ\*()@89h" .. ch126 .. "3fj", 1) testmac("d.3-\*#(I" .. ch126 .. "J$()@~i", "~02eQ\*()@89h" .. ch127 .. "3fj", 2) testmac("d.3-\*#(I" .. ch126 .. "J$()@~i", "~02eQ\*()@89h" .. ch128 .. "3fj", 3) testmac("d.3-\*#(I" .. ch126 .. "J$()@~i", "~02eQ\*()@89h" .. ch129 .. "3fj", 4) testmac("d.3-\*#(I" .. ch127 .. "J$()@~i", "~02eQ\*()@89h" .. ch126 .. "3fj", 5) testmac("d.3-\*#(I" .. ch127 .. "J$()@~i", "~02eQ\*()@89h" .. ch127 .. "3fj", 6) testmac("d.3-\*#(I" .. ch127 .. "J$()@~i", "~02eQ\*()@89h" .. ch128 .. "3fj", 7) testmac("d.3-\*#(I" .. ch127 .. "J$()@~i", "~02eQ\*()@89h" .. ch129 .. "3fj", 8) testmac("d.3-\*#(I" .. ch128 .. "J$()@~i", "~02eQ\*()@89h" .. ch126 .. "3fj", 9) testmac("d.3-\*#(I" .. ch128 .. "J$()@~i", "~02eQ\*()@89h" .. ch127 .. "3fj", 10) testmac("d.3-\*#(I" .. ch128 .. "J$()@~i", "~02eQ\*()@89h" .. ch128 .. "3fj", 11) testmac("d.3-\*#(I" .. ch128 .. "J$()@~i", "~02eQ\*()@89h" .. ch129 .. "3fj", 12) testmac("d.3-\*#(I" .. ch129 .. "J$()@~i", "~02eQ\*()@89h" .. ch126 .. "3fj", 13) testmac("d.3-\*#(I" .. ch129 .. "J$()@~i", "~02eQ\*()@89h" .. ch127 .. "3fj", 14) testmac("d.3-\*#(I" .. ch129 .. "J$()@~i", "~02eQ\*()@89h" .. ch128 .. "3fj", 15) testmac("d.3-\*#(I" .. ch129 .. "J$()@~i", "~02eQ\*()@89h" .. ch129 .. "3fj", 16) --[[2014.2511 (2014.11.18) - CORONA SIMULATOR ------------------------------- Test   1 ------------------------------- KEY      100  46  51  45  42  35  40  73 126  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 126  51 102 106 DIG       60 214  10 219 181 189 220 ... 168  37 211  94 196 144 176 198 ------------------------------- Test   2 ------------------------------- KEY      100  46  51  45  42  35  40  73 126  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 127  51 102 106 DIG      208 202 141 172  22  56 240 ...  23 184  39 232  46   6 192 186 ------------------------------- Test   3 ------------------------------- KEY      100  46  51  45  42  35  40  73 126  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 128  51 102 106 DIG       25 153  82  88 184 224  90 ...  45  36 167 215 102 233 175 172 ------------------------------- Test   4 ------------------------------- KEY      100  46  51  45  42  35  40  73 126  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 129  51 102 106 DIG       77  99 169 228 205 167  44 ... 247 190 112 192  27 192 144 114 ------------------------------- Test   5 ------------------------------- KEY      100  46  51  45  42  35  40  73 127  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 126  51 102 106 DIG      216  98 215  31 211  42  70 ...  31  34  90 105 127 205 197 255 ------------------------------- Test   6 ------------------------------- KEY      100  46  51  45  42  35  40  73 127  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 127  51 102 106 DIG      253 141 237 149   7 124  40 ...  39  63  98  42  42 146 100 166 ------------------------------- Test   7 ------------------------------- KEY      100  46  51  45  42  35  40  73 127  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 128  51 102 106 DIG      156  89 231 104   9 206 244 ...  45 232  30 177  77  64 162 245 ------------------------------- Test   8 ------------------------------- KEY      100  46  51  45  42  35  40  73 127  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 129  51 102 106 DIG      243 242  46 129  80  66 213 ... 171  91 129 252  59   5   4 237 ------------------------------- Test   9 ------------------------------- KEY      100  46  51  45  42  35  40  73 128  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 126  51 102 106 DIG      196 158 110 203  26   6 181 ... 142 166  82  22  43 199 109  40 ------------------------------- Test  10 ------------------------------- KEY      100  46  51  45  42  35  40  73 128  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 127  51 102 106 DIG       61 143 254 207  91 139 229 ... 248 239 151 174  79 199  13 229 ------------------------------- Test  11 ------------------------------- KEY      100  46  51  45  42  35  40  73 128  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 128  51 102 106 DIG       63  99 128 207 220  87 165 ...  61  91 255 195  20 144 240  81 ------------------------------- Test  12 ------------------------------- KEY      100  46  51  45  42  35  40  73 128  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 129  51 102 106 DIG      159 169 242  93  12  59 170 ... 238 188 201  99  99  73  45 207 ------------------------------- Test  13 ------------------------------- KEY      100  46  51  45  42  35  40  73 129  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 126  51 102 106 DIG       70   3 125 214 243  50 219 ... 131 121  57  69 175 197 247  66 ------------------------------- Test  14 ------------------------------- KEY      100  46  51  45  42  35  40  73 129  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 127  51 102 106 DIG       15  84   6 219 209  58 108 ...  88  99  19  55 111  35  74 160 ------------------------------- Test  15 ------------------------------- KEY      100  46  51  45  42  35  40  73 129  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 128  51 102 106 DIG       28  61  17 187 209  63  80 ... 133  21  74 161 123  70  82 109 ------------------------------- Test  16 ------------------------------- KEY      100  46  51  45  42  35  40  73 129  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 129  51 102 106 DIG      253 196  70  39 105 202 213 ...   0  22  98  39  11 237 238 222 2014.2511 (2014.11.18) - ANDROID 4.3 I/Corona  (26838): ------------------------------- Test   1 ------------------------------- I/Corona  (26838): KEY   100  46  51  45  42  35  40  73 126  74  36  40  41  64 126 105 I/Corona  (26838): MSG   126  48  50 101  81  42  40  41  64  56  57 104 126  51 102 106 I/Corona  (26838): DIG    60 214  10 219 181 189 220 ... 168  37 211  94 196 144 176 198 I/Corona  (26838): ------------------------------- Test   2 ------------------------------- I/Corona  (26838): KEY   100  46  51  45  42  35  40  73 126  74  36  40  41  64 126 105 I/Corona  (26838): MSG   126  48  50 101  81  42  40  41  64  56  57 104 127  51 102 106 I/Corona  (26838): DIG   208 202 141 172  22  56 240 ...  23 184  39 232  46   6 192 186 I/Corona  (26838): ------------------------------- Test   3 ------------------------------- I/Corona  (26838): KEY   100  46  51  45  42  35  40  73 126  74  36  40  41  64 126 105 I/Corona  (26838): MSG   126  48  50 101  81  42  40  41  64  56  57 104 128  51 102 106 I/Corona  (26838): DIG    25 153  82  88 184 224  90 ...  45  36 167 215 102 233 175 172 I/Corona  (26838): ------------------------------- Test   4 ------------------------------- I/Corona  (26838): KEY   100  46  51  45  42  35  40  73 126  74  36  40  41  64 126 105 I/Corona  (26838): MSG   126  48  50 101  81  42  40  41  64  56  57 104 129  51 102 106 I/Corona  (26838): DIG    77  99 169 228 205 167  44 ... 247 190 112 192  27 192 144 114 I/Corona  (26838): ------------------------------- Test   5 ------------------------------- I/Corona  (26838): KEY   100  46  51  45  42  35  40  73 127  74  36  40  41  64 126 105 I/Corona  (26838): MSG   126  48  50 101  81  42  40  41  64  56  57 104 126  51 102 106 I/Corona  (26838): DIG   216  98 215  31 211  42  70 ...  31  34  90 105 127 205 197 255 I/Corona  (26838): ------------------------------- Test   6 ------------------------------- I/Corona  (26838): KEY   100  46  51  45  42  35  40  73 127  74  36  40  41  64 126 105 I/Corona  (26838): MSG   126  48  50 101  81  42  40  41  64  56  57 104 127  51 102 106 I/Corona  (26838): DIG   253 141 237 149   7 124  40 ...  39  63  98  42  42 146 100 166 I/Corona  (26838): ------------------------------- Test   7 ------------------------------- I/Corona  (26838): KEY   100  46  51  45  42  35  40  73 127  74  36  40  41  64 126 105 I/Corona  (26838): MSG   126  48  50 101  81  42  40  41  64  56  57 104 128  51 102 106 I/Corona  (26838): DIG   156  89 231 104   9 206 244 ...  45 232  30 177  77  64 162 245 I/Corona  (26838): ------------------------------- Test   8 ------------------------------- I/Corona  (26838): KEY   100  46  51  45  42  35  40  73 127  74  36  40  41  64 126 105 I/Corona  (26838): MSG   126  48  50 101  81  42  40  41  64  56  57 104 129  51 102 106 I/Corona  (26838): DIG   243 242  46 129  80  66 213 ... 171  91 129 252  59   5   4 237 I/Corona  (26838): ------------------------------- Test   9 ------------------------------- I/Corona  (26838): KEY   100  46  51  45  42  35  40  73 128  74  36  40  41  64 126 105 I/Corona  (26838): MSG   126  48  50 101  81  42  40  41  64  56  57 104 126  51 102 106 I/Corona  (26838): DIG   137 251 178 134   1 200  33 ... 209  71 132 231 175 127  65 175 I/Corona  (26838): ------------------------------- Test  10 ------------------------------- I/Corona  (26838): KEY   100  46  51  45  42  35  40  73 128  74  36  40  41  64 126 105 I/Corona  (26838): MSG   126  48  50 101  81  42  40  41  64  56  57 104 127  51 102 106 I/Corona  (26838): DIG    43 195 153 215 223 217 155 ...  12  11  80 114 230 168 168  67 I/Corona  (26838): ------------------------------- Test  11 ------------------------------- I/Corona  (26838): KEY   100  46  51  45  42  35  40  73 128  74  36  40  41  64 126 105 I/Corona  (26838): MSG   126  48  50 101  81  42  40  41  64  56  57 104 128  51 102 106 I/Corona  (26838): DIG   174 179 171 239   4 235  68 ...  58 142   0 187 139 253  33  67 I/Corona  (26838): ------------------------------- Test  12 ------------------------------- I/Corona  (26838): KEY   100  46  51  45  42  35  40  73 128  74  36  40  41  64 126 105 I/Corona  (26838): MSG   126  48  50 101  81  42  40  41  64  56  57 104 129  51 102 106 I/Corona  (26838): DIG   122 189  34 107  70 249 129 ...  87 189 183 150  96 135 213 145 I/Corona  (26838): ------------------------------- Test  13 ------------------------------- I/Corona  (26838): KEY   100  46  51  45  42  35  40  73 129  74  36  40  41  64 126 105 I/Corona  (26838): MSG   126  48  50 101  81  42  40  41  64  56  57 104 126  51 102 106 I/Corona  (26838): DIG     8   2 221  26 228 180  14 ...  77  51 122 137  22 183 230 164 I/Corona  (26838): ------------------------------- Test  14 ------------------------------- I/Corona  (26838): KEY   100  46  51  45  42  35  40  73 129  74  36  40  41  64 126 105 I/Corona  (26838): MSG   126  48  50 101  81  42  40  41  64  56  57 104 127  51 102 106 I/Corona  (26838): DIG   214  63 196 238 193  22 103 ... 173 199 223 140 141  86 119  30 I/Corona  (26838): ------------------------------- Test  15 ------------------------------- I/Corona  (26838): KEY   100  46  51  45  42  35  40  73 129  74  36  40  41  64 126 105 I/Corona  (26838): MSG   126  48  50 101  81  42  40  41  64  56  57 104 128  51 102 106 I/Corona  (26838): DIG   218  39 162  67 160 252  79 ... 166 237 131  40  21 231 162  94 I/Corona  (26838): ------------------------------- Test  16 ------------------------------- I/Corona  (26838): KEY   100  46  51  45  42  35  40  73 129  74  36  40  41  64 126 105 I/Corona  (26838): MSG   126  48  50 101  81  42  40  41  64  56  57 104 129  51 102 106 I/Corona  (26838): DIG   171  42  50 138  81  50  59 ... 226 177  62  86 211  25 253 103 2015.2627 (2015.5.2) - CORONA SIMULATOR ------------------------------- Test   1 ------------------------------- KEY      100  46  51  45  42  35  40  73 126  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 126  51 102 106 DIG       60 214  10 219 181 189 220 ... 168  37 211  94 196 144 176 198 ------------------------------- Test   2 ------------------------------- KEY      100  46  51  45  42  35  40  73 126  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 127  51 102 106 DIG      208 202 141 172  22  56 240 ...  23 184  39 232  46   6 192 186 ------------------------------- Test   3 ------------------------------- KEY      100  46  51  45  42  35  40  73 126  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 128  51 102 106 DIG       25 153  82  88 184 224  90 ...  45  36 167 215 102 233 175 172 ------------------------------- Test   4 ------------------------------- KEY      100  46  51  45  42  35  40  73 126  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 129  51 102 106 DIG       77  99 169 228 205 167  44 ... 247 190 112 192  27 192 144 114 ------------------------------- Test   5 ------------------------------- KEY      100  46  51  45  42  35  40  73 127  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 126  51 102 106 DIG      216  98 215  31 211  42  70 ...  31  34  90 105 127 205 197 255 ------------------------------- Test   6 ------------------------------- KEY      100  46  51  45  42  35  40  73 127  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 127  51 102 106 DIG      253 141 237 149   7 124  40 ...  39  63  98  42  42 146 100 166 ------------------------------- Test   7 ------------------------------- KEY      100  46  51  45  42  35  40  73 127  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 128  51 102 106 DIG      156  89 231 104   9 206 244 ...  45 232  30 177  77  64 162 245 ------------------------------- Test   8 ------------------------------- KEY      100  46  51  45  42  35  40  73 127  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 129  51 102 106 DIG      243 242  46 129  80  66 213 ... 171  91 129 252  59   5   4 237 ------------------------------- Test   9 ------------------------------- KEY      100  46  51  45  42  35  40  73 128  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 126  51 102 106 DIG      196 158 110 203  26   6 181 ... 142 166  82  22  43 199 109  40 ------------------------------- Test  10 ------------------------------- KEY      100  46  51  45  42  35  40  73 128  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 127  51 102 106 DIG       61 143 254 207  91 139 229 ... 248 239 151 174  79 199  13 229 ------------------------------- Test  11 ------------------------------- KEY      100  46  51  45  42  35  40  73 128  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 128  51 102 106 DIG       63  99 128 207 220  87 165 ...  61  91 255 195  20 144 240  81 ------------------------------- Test  12 ------------------------------- KEY      100  46  51  45  42  35  40  73 128  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 129  51 102 106 DIG      159 169 242  93  12  59 170 ... 238 188 201  99  99  73  45 207 ------------------------------- Test  13 ------------------------------- KEY      100  46  51  45  42  35  40  73 129  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 126  51 102 106 DIG       70   3 125 214 243  50 219 ... 131 121  57  69 175 197 247  66 ------------------------------- Test  14 ------------------------------- KEY      100  46  51  45  42  35  40  73 129  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 127  51 102 106 DIG       15  84   6 219 209  58 108 ...  88  99  19  55 111  35  74 160 ------------------------------- Test  15 ------------------------------- KEY      100  46  51  45  42  35  40  73 129  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 128  51 102 106 DIG       28  61  17 187 209  63  80 ... 133  21  74 161 123  70  82 109 ------------------------------- Test  16 ------------------------------- KEY      100  46  51  45  42  35  40  73 129  74  36  40  41  64 126 105 MSG      126  48  50 101  81  42  40  41  64  56  57 104 129  51 102 106 DIG      253 196  70  39 105 202 213 ...   0  22  98  39  11 237 238 222 2015.2627 (2015.5.2) - ANDROID 4.3 I/Corona  (27447): ------------------------------- Test   1 ------------------------------- I/Corona  (27447): KEY   100  46  51  45  42  35  40  73 126  74  36  40  41  64 126 105 I/Corona  (27447): MSG   126  48  50 101  81  42  40  41  64  56  57 104 126  51 102 106 I/Corona  (27447): DIG    60 214  10 219 181 189 220 ... 168  37 211  94 196 144 176 198 I/Corona  (27447): ------------------------------- Test   2 ------------------------------- I/Corona  (27447): KEY   100  46  51  45  42  35  40  73 126  74  36  40  41  64 126 105 I/Corona  (27447): MSG   126  48  50 101  81  42  40  41  64  56  57 104 127  51 102 106 I/Corona  (27447): DIG   208 202 141 172  22  56 240 ...  23 184  39 232  46   6 192 186 I/Corona  (27447): ------------------------------- Test   3 ------------------------------- I/Corona  (27447): KEY   100  46  51  45  42  35  40  73 126  74  36  40  41  64 126 105 I/Corona  (27447): MSG   126  48  50 101  81  42  40  41  64  56  57 104 128  51 102 106 I/Corona  (27447): DIG    25 153  82  88 184 224  90 ...  45  36 167 215 102 233 175 172 I/Corona  (27447): ------------------------------- Test   4 ------------------------------- I/Corona  (27447): KEY   100  46  51  45  42  35  40  73 126  74  36  40  41  64 126 105 I/Corona  (27447): MSG   126  48  50 101  81  42  40  41  64  56  57 104 129  51 102 106 I/Corona  (27447): DIG    77  99 169 228 205 167  44 ... 247 190 112 192  27 192 144 114 I/Corona  (27447): ------------------------------- Test   5 ------------------------------- I/Corona  (27447): KEY   100  46  51  45  42  35  40  73 127  74  36  40  41  64 126 105 I/Corona  (27447): MSG   126  48  50 101  81  42  40  41  64  56  57 104 126  51 102 106 I/Corona  (27447): DIG   216  98 215  31 211  42  70 ...  31  34  90 105 127 205 197 255 I/Corona  (27447): ------------------------------- Test   6 ------------------------------- I/Corona  (27447): KEY   100  46  51  45  42  35  40  73 127  74  36  40  41  64 126 105 I/Corona  (27447): MSG   126  48  50 101  81  42  40  41  64  56  57 104 127  51 102 106 I/Corona  (27447): DIG   253 141 237 149   7 124  40 ...  39  63  98  42  42 146 100 166 I/Corona  (27447): ------------------------------- Test   7 ------------------------------- I/Corona  (27447): KEY   100  46  51  45  42  35  40  73 127  74  36  40  41  64 126 105 I/Corona  (27447): MSG   126  48  50 101  81  42  40  41  64  56  57 104 128  51 102 106 I/Corona  (27447): DIG   156  89 231 104   9 206 244 ...  45 232  30 177  77  64 162 245 I/Corona  (27447): ------------------------------- Test   8 ------------------------------- I/Corona  (27447): KEY   100  46  51  45  42  35  40  73 127  74  36  40  41  64 126 105 I/Corona  (27447): MSG   126  48  50 101  81  42  40  41  64  56  57 104 129  51 102 106 I/Corona  (27447): DIG   243 242  46 129  80  66 213 ... 171  91 129 252  59   5   4 237 I/Corona  (27447): ------------------------------- Test   9 ------------------------------- I/Corona  (27447): KEY   100  46  51  45  42  35  40  73 128  74  36  40  41  64 126 105 I/Corona  (27447): MSG   126  48  50 101  81  42  40  41  64  56  57 104 126  51 102 106 I/Corona  (27447): DIG   196 158 110 203  26   6 181 ... 142 166  82  22  43 199 109  40 I/Corona  (27447): ------------------------------- Test  10 ------------------------------- I/Corona  (27447): KEY   100  46  51  45  42  35  40  73 128  74  36  40  41  64 126 105 I/Corona  (27447): MSG   126  48  50 101  81  42  40  41  64  56  57 104 127  51 102 106 I/Corona  (27447): DIG    61 143 254 207  91 139 229 ... 248 239 151 174  79 199  13 229 I/Corona  (27447): ------------------------------- Test  11 ------------------------------- I/Corona  (27447): KEY   100  46  51  45  42  35  40  73 128  74  36  40  41  64 126 105 I/Corona  (27447): MSG   126  48  50 101  81  42  40  41  64  56  57 104 128  51 102 106 I/Corona  (27447): DIG    63  99 128 207 220  87 165 ...  61  91 255 195  20 144 240  81 I/Corona  (27447): ------------------------------- Test  12 ------------------------------- I/Corona  (27447): KEY   100  46  51  45  42  35  40  73 128  74  36  40  41  64 126 105 I/Corona  (27447): MSG   126  48  50 101  81  42  40  41  64  56  57 104 129  51 102 106 I/Corona  (27447): DIG   159 169 242  93  12  59 170 ... 238 188 201  99  99  73  45 207 I/Corona  (27447): ------------------------------- Test  13 ------------------------------- I/Corona  (27447): KEY   100  46  51  45  42  35  40  73 129  74  36  40  41  64 126 105 I/Corona  (27447): MSG   126  48  50 101  81  42  40  41  64  56  57 104 126  51 102 106 I/Corona  (27447): DIG    70   3 125 214 243  50 219 ... 131 121  57  69 175 197 247  66 I/Corona  (27447): ------------------------------- Test  14 ------------------------------- I/Corona  (27447): KEY   100  46  51  45  42  35  40  73 129  74  36  40  41  64 126 105 I/Corona  (27447): MSG   126  48  50 101  81  42  40  41  64  56  57 104 127  51 102 106 I/Corona  (27447): DIG    15  84   6 219 209  58 108 ...  88  99  19  55 111  35  74 160 I/Corona  (27447): ------------------------------- Test  15 ------------------------------- I/Corona  (27447): KEY   100  46  51  45  42  35  40  73 129  74  36  40  41  64 126 105 I/Corona  (27447): MSG   126  48  50 101  81  42  40  41  64  56  57 104 128  51 102 106 I/Corona  (27447): DIG    28  61  17 187 209  63  80 ... 133  21  74 161 123  70  82 109 I/Corona  (27447): ------------------------------- Test  16 ------------------------------- I/Corona  (27447): KEY   100  46  51  45  42  35  40  73 129  74  36  40  41  64 126 105 I/Corona  (27447): MSG   126  48  50 101  81  42  40  41  64  56  57 104 129  51 102 106 I/Corona  (27447): DIG   253 196  70  39 105 202 213 ...   0  22  98  39  11 237 238 222]]--

>> A value greater than 127; this is probably a sign issue.

Oh right.  Yeah, the code used to convert the key to a UTF-16 string, which was wrong of course and explains why it would fail with byte values greater than 127 because the 8th bit in a UTF-8 string flags that it is a Unicode character which causes the following 2-5 bytes to be converted to a 2 byte UTF-16 Unicode character.  Build #2528 definitely fixes that issue too now that the key is always processed as a binary array.  Thanks for taking the time to post your findings.