私は、いくつかの楕円形のcurve暗号コードをAndroidで動作させようとしています。( https://github.com/k3d3/ed25519-java )。コンピューターでは問題なく動作しますが、Android では StackOverflowError が発生します。
問題が発生する場所は、Android デバイスによって異なります。一方では、別の expmod() では scalarmult() にあります。デバッガーは、しばらくの間動作することを示し、その後突然死します。何か案は?メモリの問題?
static BigInteger[] scalarmult(BigInteger[] P, BigInteger e) {
//System.out.println("scalarmult open with e = " + e);
if (e.equals(BigInteger.ZERO)) {
System.out.println("scalarmult close with Q = 0,1");
return new BigInteger[]{BigInteger.ZERO, BigInteger.ONE};
}
BigInteger[] Q = scalarmult(P, e.divide(BigInteger.valueOf(2)));
//System.out.println("scalarmult asQ = " + Q[0] + "," + Q[1]);
Q = edwards(Q, Q);
//System.out.println("scalarmult aeQ = " + Q[0] + "," + Q[1] + " e="+e+" testbit="+(e.testBit(0)?1:0));
if (e.testBit(0)) Q = edwards(Q, P);
//System.out.println("scalarmult close with Q = " + Q[0] + "," + Q[1]);
return Q;
}
static BigInteger expmod(BigInteger b, BigInteger e, BigInteger m) {
//System.out.println("expmod open with b=" + b + " e=" + e + " m=" + m);
if (e.equals(BigInteger.ZERO)) {
//System.out.println("expmod close with 1z");
return BigInteger.ONE;
}
BigInteger t = expmod(b, e.divide(BigInteger.valueOf(2)), m).pow(2).mod(m);
//System.out.println("expmod 1/2 t="+t+" e="+e+" testbit="+(e.testBit(0)?1:0));
if (e.testBit(0)) {
t = t.multiply(b).mod(m);
}
//System.out.println("expmod close with " + t);
return t;
}
スタック トレース (繰り返しているだけなので最後の部分をカット):
10-06 19:00:17.855: E/AndroidRuntime(749): FATAL EXCEPTION: main
10-06 19:00:17.855: E/AndroidRuntime(749): java.lang.StackOverflowError
10-06 19:00:17.855: E/AndroidRuntime(749): at java.lang.ref.FinalizerReference.<init>(FinalizerReference.java:34)
10-06 19:00:17.855: E/AndroidRuntime(749): at java.lang.ref.FinalizerReference.add(FinalizerReference.java:48)
10-06 19:00:17.855: E/AndroidRuntime(749): at java.math.BigInt.<init>(BigInt.java:24)
10-06 19:00:17.855: E/AndroidRuntime(749): at java.math.BigInteger.divide(BigInteger.java:903)
10-06 19:00:17.855: E/AndroidRuntime(749): at com.test.crypto.Curve25519.expmod(Curve25519.java:45)
10-06 19:00:17.855: E/AndroidRuntime(749): at com.test.crypto.Curve25519.expmod(Curve25519.java:45)
10-06 19:00:17.855: E/AndroidRuntime(749): at com.test.crypto.Curve25519.expmod(Curve25519.java:45)
10-06 19:00:17.855: E/AndroidRuntime(749): at com.test.crypto.Curve25519.expmod(Curve25519.java:45)
10-06 19:00:17.855: E/AndroidRuntime(749): at com.test.crypto.Curve25519.expmod(Curve25519.java:45)
10-06 19:00:17.855: E/AndroidRuntime(749): at com.test.crypto.Curve25519.expmod(Curve25519.java:45)