Minor: introduce a generateKeyPair() function that wraps the Java API, so we can switch algorithm more easily later.

This commit is contained in:
Mike Hearn 2016-02-05 17:48:08 +01:00
parent 8d1b318370
commit 0665492645
9 changed files with 25 additions and 22 deletions

View File

@ -123,4 +123,7 @@ fun PublicKey.toStringShort(): String {
// Allow Kotlin destructuring: val (private, public) = keypair // Allow Kotlin destructuring: val (private, public) = keypair
operator fun KeyPair.component1() = this.private operator fun KeyPair.component1() = this.private
operator fun KeyPair.component2() = this.public operator fun KeyPair.component2() = this.public
/** A simple wrapper that will make it easier to swap out the EC algorithm we use in future */
fun generateKeyPair() = KeyPairGenerator.getInstance("EC").genKeyPair()

View File

@ -10,11 +10,11 @@ package core
import co.paralleluniverse.fibers.Suspendable import co.paralleluniverse.fibers.Suspendable
import core.crypto.DigitalSignature import core.crypto.DigitalSignature
import core.crypto.generateKeyPair
import core.messaging.MessagingService import core.messaging.MessagingService
import core.messaging.NetworkMap import core.messaging.NetworkMap
import core.serialization.SerializedBytes import core.serialization.SerializedBytes
import java.security.KeyPair import java.security.KeyPair
import java.security.KeyPairGenerator
import java.security.PrivateKey import java.security.PrivateKey
import java.security.PublicKey import java.security.PublicKey
@ -92,7 +92,7 @@ interface TimestamperService {
// We define a dummy authority here to allow to us to develop prototype contracts in the absence of a real authority. // We define a dummy authority here to allow to us to develop prototype contracts in the absence of a real authority.
// The timestamper itself is implemented in the unit test part of the code (in TestUtils.kt). // The timestamper itself is implemented in the unit test part of the code (in TestUtils.kt).
object DummyTimestampingAuthority { object DummyTimestampingAuthority {
val key = KeyPairGenerator.getInstance("EC").genKeyPair() val key = generateKeyPair()
val identity = Party("The dummy timestamper", key.public) val identity = Party("The dummy timestamper", key.public)
} }

View File

@ -12,10 +12,10 @@ import com.google.common.util.concurrent.Futures
import com.google.common.util.concurrent.ListenableFuture import com.google.common.util.concurrent.ListenableFuture
import com.google.common.util.concurrent.MoreExecutors import com.google.common.util.concurrent.MoreExecutors
import core.Party import core.Party
import core.crypto.generateKeyPair
import core.crypto.sha256 import core.crypto.sha256
import core.node.TimestamperNodeService import core.node.TimestamperNodeService
import core.utilities.loggerFor import core.utilities.loggerFor
import java.security.KeyPairGenerator
import java.time.Instant import java.time.Instant
import java.util.* import java.util.*
import java.util.concurrent.Executor import java.util.concurrent.Executor
@ -126,7 +126,7 @@ public class InMemoryNetwork {
check(timestampingAdvert == null) check(timestampingAdvert == null)
val (handle, builder) = createNode(manuallyPumped) val (handle, builder) = createNode(manuallyPumped)
val node = builder.start().get() val node = builder.start().get()
val key = KeyPairGenerator.getInstance("EC").genKeyPair() val key = generateKeyPair()
val identity = Party("Unit test timestamping authority", key.public) val identity = Party("Unit test timestamping authority", key.public)
TimestamperNodeService(node, identity, key) TimestamperNodeService(node, identity, key)
timestampingAdvert = LegallyIdentifiableNode(handle, identity) timestampingAdvert = LegallyIdentifiableNode(handle, identity)

View File

@ -10,8 +10,8 @@ package core.node
import core.KeyManagementService import core.KeyManagementService
import core.ThreadBox import core.ThreadBox
import core.crypto.generateKeyPair
import java.security.KeyPair import java.security.KeyPair
import java.security.KeyPairGenerator
import java.security.PrivateKey import java.security.PrivateKey
import java.security.PublicKey import java.security.PublicKey
import java.util.* import java.util.*
@ -39,7 +39,7 @@ class E2ETestKeyManagementService : KeyManagementService {
override val keys: Map<PublicKey, PrivateKey> get() = mutex.locked { HashMap(keys) } override val keys: Map<PublicKey, PrivateKey> get() = mutex.locked { HashMap(keys) }
override fun freshKey(): KeyPair { override fun freshKey(): KeyPair {
val keypair = KeyPairGenerator.getInstance("EC").genKeyPair() val keypair = generateKeyPair()
mutex.locked { mutex.locked {
keys[keypair.public] = keypair.private keys[keypair.public] = keypair.private
} }

View File

@ -10,6 +10,7 @@ package core.node
import com.google.common.net.HostAndPort import com.google.common.net.HostAndPort
import core.* import core.*
import core.crypto.generateKeyPair
import core.messaging.* import core.messaging.*
import core.serialization.deserialize import core.serialization.deserialize
import core.serialization.serialize import core.serialization.serialize
@ -21,7 +22,6 @@ import java.nio.file.Files
import java.nio.file.Path import java.nio.file.Path
import java.nio.file.StandardOpenOption import java.nio.file.StandardOpenOption
import java.security.KeyPair import java.security.KeyPair
import java.security.KeyPairGenerator
import java.util.* import java.util.*
import java.util.concurrent.Executors import java.util.concurrent.Executors
@ -127,7 +127,7 @@ class Node(val dir: Path, val myNetAddr: HostAndPort, val configuration: NodeCon
val (identity, keypair) = if (!Files.exists(privKeyFile)) { val (identity, keypair) = if (!Files.exists(privKeyFile)) {
log.info("Identity key not found, generating fresh key!") log.info("Identity key not found, generating fresh key!")
val keypair: KeyPair = KeyPairGenerator.getInstance("EC").genKeyPair() val keypair: KeyPair = generateKeyPair()
keypair.serialize().writeToFile(privKeyFile) keypair.serialize().writeToFile(privKeyFile)
val myIdentity = Party(configuration.myLegalName, keypair.public) val myIdentity = Party(configuration.myLegalName, keypair.public)
// We include the Party class with the file here to help catch mixups when admins provide files of the // We include the Party class with the file here to help catch mixups when admins provide files of the

View File

@ -13,6 +13,7 @@ import contracts.CommercialPaper
import contracts.protocols.TwoPartyTradeProtocol import contracts.protocols.TwoPartyTradeProtocol
import core.* import core.*
import core.crypto.SecureHash import core.crypto.SecureHash
import core.crypto.generateKeyPair
import core.messaging.LegallyIdentifiableNode import core.messaging.LegallyIdentifiableNode
import core.messaging.SingleMessageRecipient import core.messaging.SingleMessageRecipient
import core.messaging.runOnNextMessage import core.messaging.runOnNextMessage
@ -24,7 +25,6 @@ import joptsimple.OptionParser
import java.nio.file.Files import java.nio.file.Files
import java.nio.file.Path import java.nio.file.Path
import java.nio.file.Paths import java.nio.file.Paths
import java.security.KeyPairGenerator
import java.security.PublicKey import java.security.PublicKey
import java.time.Instant import java.time.Instant
import java.util.* import java.util.*
@ -176,7 +176,7 @@ fun main(args: Array<String>) {
fun makeFakeCommercialPaper(ownedBy: PublicKey): StateAndRef<CommercialPaper.State> { fun makeFakeCommercialPaper(ownedBy: PublicKey): StateAndRef<CommercialPaper.State> {
// Make a fake company that's issued its own paper. // Make a fake company that's issued its own paper.
val party = Party("MegaCorp, Inc", KeyPairGenerator.getInstance("EC").genKeyPair().public) val party = Party("MegaCorp, Inc", generateKeyPair().public)
// ownedBy here is the random key that gives us control over it. // ownedBy here is the random key that gives us control over it.
val paper = CommercialPaper.State(party.ref(1,2,3), ownedBy, 1100.DOLLARS, Instant.now() + 10.days) val paper = CommercialPaper.State(party.ref(1,2,3), ownedBy, 1100.DOLLARS, Instant.now() + 10.days)
val randomRef = StateRef(SecureHash.randomSHA256(), 0) val randomRef = StateRef(SecureHash.randomSHA256(), 0)

View File

@ -16,8 +16,9 @@ import com.esotericsoftware.kryo.Serializer
import com.esotericsoftware.kryo.io.Input import com.esotericsoftware.kryo.io.Input
import com.esotericsoftware.kryo.io.Output import com.esotericsoftware.kryo.io.Output
import com.esotericsoftware.kryo.serializers.JavaSerializer import com.esotericsoftware.kryo.serializers.JavaSerializer
import core.crypto.SecureHash
import core.SignedWireTransaction import core.SignedWireTransaction
import core.crypto.SecureHash
import core.crypto.generateKeyPair
import core.crypto.sha256 import core.crypto.sha256
import de.javakaffee.kryoserializers.ArraysAsListSerializer import de.javakaffee.kryoserializers.ArraysAsListSerializer
import org.objenesis.strategy.StdInstantiatorStrategy import org.objenesis.strategy.StdInstantiatorStrategy
@ -25,7 +26,6 @@ import java.io.ByteArrayOutputStream
import java.lang.reflect.InvocationTargetException import java.lang.reflect.InvocationTargetException
import java.nio.file.Files import java.nio.file.Files
import java.nio.file.Path import java.nio.file.Path
import java.security.KeyPairGenerator
import java.time.Instant import java.time.Instant
import java.util.* import java.util.*
import kotlin.reflect.* import kotlin.reflect.*
@ -198,7 +198,7 @@ fun createKryo(k: Kryo = Kryo()): Kryo {
// Some things where the JRE provides an efficient custom serialisation. // Some things where the JRE provides an efficient custom serialisation.
val ser = JavaSerializer() val ser = JavaSerializer()
val keyPair = KeyPairGenerator.getInstance("EC").genKeyPair() val keyPair = generateKeyPair()
register(keyPair.public.javaClass, ser) register(keyPair.public.javaClass, ser)
register(keyPair.private.javaClass, ser) register(keyPair.private.javaClass, ser)
register(Instant::class.java, ser) register(Instant::class.java, ser)

View File

@ -9,6 +9,7 @@
package core package core
import core.crypto.DigitalSignature import core.crypto.DigitalSignature
import core.crypto.generateKeyPair
import core.crypto.signWithECDSA import core.crypto.signWithECDSA
import core.messaging.MessagingService import core.messaging.MessagingService
import core.messaging.MockNetworkMap import core.messaging.MockNetworkMap
@ -19,7 +20,6 @@ import core.serialization.deserialize
import core.testutils.TEST_KEYS_TO_CORP_MAP import core.testutils.TEST_KEYS_TO_CORP_MAP
import core.testutils.TEST_TX_TIME import core.testutils.TEST_TX_TIME
import java.security.KeyPair import java.security.KeyPair
import java.security.KeyPairGenerator
import java.security.PrivateKey import java.security.PrivateKey
import java.security.PublicKey import java.security.PublicKey
import java.time.Clock import java.time.Clock
@ -53,7 +53,7 @@ object MockIdentityService : IdentityService {
class MockKeyManagementService( class MockKeyManagementService(
override val keys: Map<PublicKey, PrivateKey>, override val keys: Map<PublicKey, PrivateKey>,
val nextKeys: MutableList<KeyPair> = arrayListOf(KeyPairGenerator.getInstance("EC").genKeyPair()) val nextKeys: MutableList<KeyPair> = arrayListOf(generateKeyPair())
) : KeyManagementService { ) : KeyManagementService {
override fun freshKey() = nextKeys.removeAt(nextKeys.lastIndex) override fun freshKey() = nextKeys.removeAt(nextKeys.lastIndex)
} }
@ -64,7 +64,7 @@ class MockWalletService(val states: List<StateAndRef<OwnableState>>) : WalletSer
@ThreadSafe @ThreadSafe
class MockStorageService : StorageService { class MockStorageService : StorageService {
override val myLegalIdentityKey: KeyPair = KeyPairGenerator.getInstance("EC").genKeyPair() override val myLegalIdentityKey: KeyPair = generateKeyPair()
override val myLegalIdentity: Party = Party("Unit test party", myLegalIdentityKey.public) override val myLegalIdentity: Party = Party("Unit test party", myLegalIdentityKey.public)
private val tables = HashMap<String, MutableMap<Any, Any>>() private val tables = HashMap<String, MutableMap<Any, Any>>()

View File

@ -15,8 +15,8 @@ import core.*
import core.crypto.DummyPublicKey import core.crypto.DummyPublicKey
import core.crypto.NullPublicKey import core.crypto.NullPublicKey
import core.crypto.SecureHash import core.crypto.SecureHash
import core.crypto.generateKeyPair
import core.visualiser.GraphVisualiser import core.visualiser.GraphVisualiser
import java.security.KeyPairGenerator
import java.security.PublicKey import java.security.PublicKey
import java.time.Instant import java.time.Instant
import java.util.* import java.util.*
@ -25,8 +25,8 @@ import kotlin.test.assertFailsWith
import kotlin.test.fail import kotlin.test.fail
object TestUtils { object TestUtils {
val keypair = KeyPairGenerator.getInstance("EC").genKeyPair() val keypair = generateKeyPair()
val keypair2 = KeyPairGenerator.getInstance("EC").genKeyPair() val keypair2 = generateKeyPair()
} }
// A few dummy values for testing. // A few dummy values for testing.
@ -36,9 +36,9 @@ val MINI_CORP_KEY = TestUtils.keypair2
val MINI_CORP_PUBKEY = MINI_CORP_KEY.public val MINI_CORP_PUBKEY = MINI_CORP_KEY.public
val DUMMY_PUBKEY_1 = DummyPublicKey("x1") val DUMMY_PUBKEY_1 = DummyPublicKey("x1")
val DUMMY_PUBKEY_2 = DummyPublicKey("x2") val DUMMY_PUBKEY_2 = DummyPublicKey("x2")
val ALICE_KEY = KeyPairGenerator.getInstance("EC").genKeyPair() val ALICE_KEY = generateKeyPair()
val ALICE = ALICE_KEY.public val ALICE = ALICE_KEY.public
val BOB_KEY = KeyPairGenerator.getInstance("EC").genKeyPair() val BOB_KEY = generateKeyPair()
val BOB = BOB_KEY.public val BOB = BOB_KEY.public
val MEGA_CORP = Party("MegaCorp", MEGA_CORP_PUBKEY) val MEGA_CORP = Party("MegaCorp", MEGA_CORP_PUBKEY)
val MINI_CORP = Party("MiniCorp", MINI_CORP_PUBKEY) val MINI_CORP = Party("MiniCorp", MINI_CORP_PUBKEY)