なぜかLinuxのx86版Monoだと下のコードの結果がおかしい・・・これが原因でCamelliaの復号部分のコードが正しく動いていない感じ。
- ソースコード
using System;
namespace MonoTest
{
class TestCase
{
static void Main (string[] args)
{
TestCase core = new TestCase ();
core.Test (0xffffffff);
}
int _flag;
uint[] _k = new uint[4];
public unsafe TestCase ()
{
_flag = 2;
for (int i = 0; i < _k.Length; i++)
_k[i] = (uint)i;
}
public unsafe void Test (uint plain)
{
fixed (uint* pk = _k) {
uint* k = pk + (_flag == 2 ? 2 : 3);
uint x = plain;
k -= 2;
uint y = x & k[1];
Console.WriteLine ("flag = {0}", _flag);
Console.WriteLine ("x = {0:x8}, k = {1:x8}", x, k[1]);
Console.WriteLine ("result: {0:x8}", y);
}
}
}
}
- 正しい結果
flag = 2
x = ffffffff, k = 00000001
result: 00000001
- Mono 2.4 (x86, Linux)の結果
flag = 2
x = ffffffff, k = 00000001
result: 00000004
楕円曲線暗号が動かない問題は謎・・・
stackallocした変数へのアクセスでなぜかNullReferenceExceptionが発生したり、IndexOutOfRangeExceptionが発生したりする。IndexOutOfRangeExceptionが発生しているんだから、境界をはみ出してアクセスしてるんじゃね?と思うかもしれませんが、stackallocの代わりに new uint[N] のように確保したら例外はおこらない。もちろんほかの部分は変更していない。
なら、stackalloc使わないで普通に配列確保すればいいじゃんって話ですが、何となく僕の方から折れるのはちょっと・・・ぇ
さすがにopenCrypto.NETのソースコードとテストケースと例外の内容をBugzillaにそのまま貼るのは、いざとなると気が引けてきたので、明日1日ぐらいかけて例外が再現する最小のコードを作るかな・・・ちなみに、上記のコードはCamelliaのコードにConsole.WriteLineを追加していって原因箇所を特定後、再現するような最小構成のコードとするまでに1時間ぐらいかかりました orz
僕ってVisualStudioのデバッガに頼りきりだからこういうときにどうすればいいのかよく分からない・・・だめだめだなぁ・・・