Skip to content

Instantly share code, notes, and snippets.

@ctjhai
Created May 10, 2018 20:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ctjhai/e33982dd61a2d14d0b579b1ff4df88db to your computer and use it in GitHub Desktop.
Save ctjhai/e33982dd61a2d14d0b579b1ff4df88db to your computer and use it in GitHub Desktop.
package com.foo;
import org.bouncycastle.jce.ECNamedCurveTable;
import org.bouncycastle.jce.spec.ECNamedCurveParameterSpec;
import org.bouncycastle.math.ec.ECPoint;
import org.bouncycastle.util.encoders.Hex;
import org.junit.Assert;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import java.math.BigInteger;
public class ECDH3WayTest {
@DisplayName("Test Vectors")
@ParameterizedTest(name = "Test #{index} : {0}")
@CsvSource({
"secp256r1, 15b2a83c5a0a38b61f2aa8200ee4994b8afdc01c58507d10d0a38f7eedf051bb, 54ce181a98525f217216f59b245f60e9df30ac7f6b26c939418cfc3c42d1afa0, f798ed2e19286f6a6efe210b1863badb99af2a14b497634dbfd2a97394fb5aa5, 0488b37ed91938b5197097808a6244847617892046d93b9501afd48fa0f148dfde00f73b6991287884a9c9a33f8e0691f14d44b59811e9d8242d010270b0d33ec0, 0409c585a91b4df9fd25a045201885c39cc5cfae397ddaeda957dec57fa0e3503f52bf05968198a2f92883e96a386d767579883302dbf292105c90a43694c2fd5c, 045e3fb3576884887f17c3203d8a3a6c2fac722ef0e2201b61ac73bc655c709a902d4b030669fb9eff8b0a79fa7c1a172ac2a92c626256963f9274dc90682c81e5, 04fb737234c973cc3a36e64e5170a32f12089d198c73c2fd85a53d0b282530fd029876c937b642cce8f604bef0c24ce0dad2c2786708a7575af940a58cfe8ca3ce",
"secp384r1, 40428496d8bbb1a68c8bf2b6bd1ec8039859e79d9c3de9dc675154c2c0a37c3f0c7eed79bf212e0d48fcca2842dade8c, 9db831510572f027bfc8bf1d6aa8222b178a30bb70efbe9d55e4b9d7421735f5b70fee9faa4f3410907c37cf546248f8, 452b1aacded5852b7d12a5ff717449b94fb2911e03b013352e589aa1c6915987144fb483b2790335ccc610e01cdadbb5, 04b0d7d4ecbd61c96cf246a2145cd797dc1d0fd3b3539b3e8e2ace411d4ed736b95f29c73d515cbc1c8e9184d126361f9ba5edf15b7e5336ab119e0507ebab2dae110ec3ab04dbdcbf871029c0694a03c4cdb1294ab9fb649caeffdba5ff0a4443, 046433bdc3fd4ee707d5026c6df5a9b03a2e2eb5048c77697fae7e2bbbff7ed370bf45e7bc9d78108587a89ed57d94a4b723fa7a9576fd37f75d548a5d115a5ecb1b1c93ff2bd147751f3282f4266ffb8c7e651e52aafcc022b25776dee84ddfcc, 04c2f24432282c939d05c603bbdeabb1d4cbfd7917fd0e12a6ab21b1aa8111f306431a334629c469731a19b1e90079d441c38f5d0b66598a1851996c320271631487f9405c25e2ab1ba6eae68cc21eaeca60b1e802a58c5abbf27c05602dec587d, 044884bb3db417d04601fdbd4df1dd3d71d63a9b1a452be74b5c3142fe5159f2965353361fb6fc99acde1c3ad4b391ffbaf3e5e99db36b13bbcf92454e440fc506b6e37a1c31db303cae1229253c52feb04fb661d4a272779b310dcc98fae50219",
"secp521r1, 60c10df14af5ef27f6e362d31bdd9eeb44be77a323ba64b08f3f03d58b92cbfe05c182a91660caa081ca344243c47b5aa088bcdf738840eb35f0218b9f26881e02, 61e54f518cdf859735da3dd64c6f72c2f086f41a6fd52915152ea2fe0f24ddaecd8883730c9c9fd82cf7c043a41021696388cf5190b731dd83638bcd56d8b6c743, 01d8b7b17cd1b0a33f7c66fb4220999329cdaf4f8b44b2ffadde8ab8ed8abffa9f5358c5b1caae26709ca4fb78e52a4d08f2e4f24111a36a6f440d20a0000ff51597, 040114896c5614fc01e881ab4bcecd6a4657ca47cb655527fe60ed4e12a534e442fda79438de7bc3a3450f13fc53186358ca2e217ffa4c56242e340365a0cb348132810094d9773bb46f66a69cc7577ebb83f1c57a8d6ac30528ad39869ab74cd23a8e537dad1eab1f39be6e5d03c6a694640a53dff6f0a413ca312f7d54fd568f08ffa680, 0401d38cca93cef4cf30c824a7e4854d0385ed9b1da87d5f281c891e901a65f242328787d3dfcb257af6e19577170fbc582fdcda42c6a43ff516e9036d8c328ece73de00bb5b69e9c51dfb233757e927b68046d77d2a1196bc4851421d656970bd221bbe52e15d3d1cbac600629229a0180a87bd9d8a834c750a9e8e1be9f4cc9cb0c07df0, 0400e2cacd1610b7c147899fbfba55fdf336664b80a5a4e790adeab1ca7b5ca62641f25bee4a1974d43ab2eb4626f897283280ac7cd2e2790709ba7d6ad90ce64fad0401d5924292225c0c220ac340d1d19219adc58fdfb9d0d911dec8201b513445afb1a2100195ae1bece9c21f4f28a2fe3c0d828e9344f6bd43c8123fc9d23e2c71d223, 0400e002528b7b9cc8aefcefbe0dc3c74fe47a74d32a9df82e7bbc22b1470894cb19f4d57eba935c25c5af6d0ac7d0058b2eb83623ca9076fcb76331eaebde5eb55733010477f31978c7a56aa63053f74b22a43f5ca4ed862eb82c12d0db0cfc188b236af98a48334356cb8d99d2969be2f4231ab9f64c560b6e58a97cefe1777ccf1e6803"
})
public void test(String curve,
String _bi,
String _br,
String _pr,
String _Bi,
String _Br,
String _Pr,
String _L) throws Exception {
BigInteger bi = new BigInteger(_bi, 16);
BigInteger br = new BigInteger(_br, 16);
BigInteger pr = new BigInteger(_pr, 16);
ECNamedCurveParameterSpec parameterSpec = ECNamedCurveTable.getParameterSpec(curve);
ECPoint Bi = parameterSpec.getG().multiply(bi).normalize();
Assert.assertArrayEquals(Bi.getEncoded(false), Hex.decode(_Bi));
ECPoint Br = parameterSpec.getG().multiply(br).normalize();
Assert.assertArrayEquals(Br.getEncoded(false), Hex.decode(_Br));
ECPoint Pr = parameterSpec.getG().multiply(pr).normalize();
Assert.assertArrayEquals(Pr.getEncoded(false), Hex.decode(_Pr));
/* L = [ (pr + br) mod q ] * Bi */
ECPoint L = Bi.multiply( pr.add(br).mod(parameterSpec.getN()) ).normalize();
Assert.assertArrayEquals(L.getEncoded(false), Hex.decode(_L));
/* L' = [ bi ] * (Br + Pr) */
ECPoint LL = Br.add(Pr).multiply(bi).normalize();
Assert.assertArrayEquals(LL.getEncoded(false), Hex.decode(_L));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment