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
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
/* GENERATED SOURCE. DO NOT MODIFY. */
package com.android.org.bouncycastle.math.ec.endo;
import java.math.BigInteger;
import com.android.org.bouncycastle.math.ec.ECConstants;
import com.android.org.bouncycastle.math.ec.ECCurve;
import com.android.org.bouncycastle.math.ec.ECPoint;
import com.android.org.bouncycastle.math.ec.PreCompCallback;
import com.android.org.bouncycastle.math.ec.PreCompInfo;
/**
* @hide This class is not part of the Android public SDK API
*/
public abstract class EndoUtil
{
public static final String PRECOMP_NAME = "bc_endo";
public static BigInteger[] decomposeScalar(ScalarSplitParameters p, BigInteger k)
{
int bits = p.getBits();
BigInteger b1 = calculateB(k, p.getG1(), bits);
BigInteger b2 = calculateB(k, p.getG2(), bits);
BigInteger a = k.subtract((b1.multiply(p.getV1A())).add(b2.multiply(p.getV2A())));
BigInteger b = (b1.multiply(p.getV1B())).add(b2.multiply(p.getV2B())).negate();
return new BigInteger[]{ a, b };
}
public static ECPoint mapPoint(final ECEndomorphism endomorphism, final ECPoint p)
{
final ECCurve c = p.getCurve();
EndoPreCompInfo precomp = (EndoPreCompInfo)c.precompute(p, PRECOMP_NAME, new PreCompCallback()
{
public PreCompInfo precompute(PreCompInfo existing)
{
EndoPreCompInfo existingEndo = (existing instanceof EndoPreCompInfo) ? (EndoPreCompInfo)existing : null;
if (checkExisting(existingEndo, endomorphism))
{
return existingEndo;
}
ECPoint mappedPoint = endomorphism.getPointMap().map(p);
EndoPreCompInfo result = new EndoPreCompInfo();
result.setEndomorphism(endomorphism);
result.setMappedPoint(mappedPoint);
return result;
}
private boolean checkExisting(EndoPreCompInfo existingEndo, ECEndomorphism endomorphism)
{
return null != existingEndo
&& existingEndo.getEndomorphism() == endomorphism
&& existingEndo.getMappedPoint() != null;
}
});
return precomp.getMappedPoint();
}
private static BigInteger calculateB(BigInteger k, BigInteger g, int t)
{
boolean negative = (g.signum() < 0);
BigInteger b = k.multiply(g.abs());
boolean extra = b.testBit(t - 1);
b = b.shiftRight(t);
if (extra)
{
b = b.add(ECConstants.ONE);
}
return negative ? b.negate() : b;
}
}
|