80 lines
2.5 KiB
Dart
80 lines
2.5 KiB
Dart
// See file LICENSE for more information.
|
|
|
|
import 'package:pointycastle/asymmetric/ec_elgamal.dart';
|
|
import 'package:pointycastle/ecc/ecc_fp.dart' as fp;
|
|
import 'package:pointycastle/export.dart';
|
|
import 'package:pointycastle/src/platform_check/platform_check.dart';
|
|
import 'package:test/test.dart';
|
|
|
|
import '../test/src/helpers.dart';
|
|
|
|
SecureRandom _newSecureRandom() => FortunaRandom()
|
|
..seed(KeyParameter(Platform.instance.platformEntropySource().getBytes(32)));
|
|
|
|
void main() {
|
|
var n = BigInt.parse(
|
|
'6277101735386680763835789423176059013767194773182842284081');
|
|
var q = BigInt.parse(
|
|
'6277101735386680763835789423207666416083908700390324961279');
|
|
var a = BigInt.parse(
|
|
'fffffffffffffffffffffffffffffffefffffffffffffffc',
|
|
radix: 16,
|
|
);
|
|
var b = BigInt.parse(
|
|
'64210519e59c80e70fa7e9ab72243049feb8deecc146b9b1',
|
|
radix: 16,
|
|
);
|
|
var curve = fp.ECCurve(q, a, b);
|
|
var params = ECDomainParametersImpl(
|
|
'test_elgamal',
|
|
curve,
|
|
curve.decodePoint(
|
|
createUint8ListFromHexString(
|
|
'03188da80eb03090f67cbf20eb43a18800f4ff0afd82ff1012',
|
|
),
|
|
)!, // G
|
|
n,
|
|
);
|
|
var pubKey = ECPublicKey(
|
|
curve.decodePoint(
|
|
createUint8ListFromHexString(
|
|
'0262b12d60690cdcf330babab6e69763b471f994dd702d16a5'),
|
|
), // Q
|
|
params,
|
|
);
|
|
var priKey = ECPrivateKey(
|
|
BigInt.parse(
|
|
'651056770906015076056810763456358567190100156695615665659'), // d
|
|
params,
|
|
);
|
|
var secureRandom = _newSecureRandom();
|
|
var pRandom = ParametersWithRandom<PublicKeyParameter>(
|
|
PublicKeyParameter(pubKey),
|
|
secureRandom,
|
|
);
|
|
|
|
test('ECElgamal encrypt and decrypt test: first', () {
|
|
var value = BigInt.from(123);
|
|
var data = (priKey.parameters!.G * value)!;
|
|
var encryptor = ECElGamalEncryptor();
|
|
encryptor.init(pRandom);
|
|
var pair = encryptor.encrypt(data);
|
|
var decryptor = ECElGamalDecryptor();
|
|
decryptor.init(PrivateKeyParameter(priKey));
|
|
var result = decryptor.decrypt(pair);
|
|
expect(data, equals(result));
|
|
});
|
|
|
|
test('ECElgamal encrypt and decrypt test: second', () {
|
|
var value =
|
|
_newSecureRandom().nextBigInteger(pubKey.parameters!.n.bitLength - 1);
|
|
var data = (priKey.parameters!.G * value)!;
|
|
var encryptor = ECElGamalEncryptor();
|
|
encryptor.init(pRandom);
|
|
var pair = encryptor.encrypt(data);
|
|
var decryptor = ECElGamalDecryptor();
|
|
decryptor.init(PrivateKeyParameter(priKey));
|
|
var result = decryptor.decrypt(pair);
|
|
expect(data, equals(result));
|
|
});
|
|
}
|