Генерация и подписание пары ключей ECDSA secp256k1 в Swift
Я делаю прототип клиента Hyperledger Sawtooth для iOS на Swift.
До этого я делал то же самое для Android на Java. В реализации Java это легко сделать с помощью библиотеки SpongyCastle: функция для генерации ключей выглядит следующим образом:
public static KeyPair getKeyPair() throws NoSuchAlgorithmException, NoSuchProviderException, InvalidAlgorithmParameterException {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("ECDSA", "SC");
ECGenParameterSpec ecGenParameterSpec = new ECGenParameterSpec("secp256k1");
keyPairGenerator.initialize(ecGenParameterSpec, new SecureRandom());
return keyPairGenerator.generateKeyPair();
}
Мне нужно сделать то же самое в Swift:
Создать secp256k1
пара ключей и подписать массив байтов с ним.
и используйте это, чтобы подписать массив байтов:
Signature signature = Signature.getInstance("ECDSA", "SC");
signature.initSign(keyPair.getPrivate(), new SecureRandom());
signature.update(bytes);
byte[] signedBytes = signature.sign();
Я погуглил "secp256k1 swift" и нашел следующие библиотеки:
- https://github.com/Boilertalk/secp256k1.swift
- https://github.com/noxproject/ASKSecp256k1
- https://github.com/pebble8888/secp256k1swift
- https://github.com/skywinder/ios-secp256k1
Все они являются привязками библиотеки secp256k1 ядра биткойн-ядра к Swift.
Могу ли я сделать что-то вроде let kp = KeyPair("secp256k1")
, let signedBytes = kp.sign(bytes)
? Если да, то как, а если нет, то есть ли другие способы сделать это?
1 ответ
Я нашел решение. это фреймворк BitcoinKit. У меня были некоторые проблемы с установкой с Carthage, но Cocoapods + установка некоторых недостающих инструментов, найденных в сообщениях об ошибках, работает хорошо.
Вы всегда можете использовать привязки C, но тогда вам придется работать с UnsafePointers и Bytes, и я предполагаю, что вы ищете подходящие оболочки. Таким образом, я нашел этот sawtooth-swift-sdk, который, похоже, использует библиотеку secp256k1, чтобы в свою очередь импортировать широко используемый https://github.com/bitcoin-core/secp256k1. Это позволяет что-то похожее на то, что вы просили (согласно документации):
import SawtoothSigning
let context = Secp256k1Context()
let privateKey = context.newRandomPrivateKey()
let signer = Signer(context: context, privateKey: privateKey)
let signature = signer.sign(data: message_bytes)
Я предполагаю, что это будет перечислено как официально одобренный sdk скоро, как обозначено этим Sawtooth RFC. Единственное, чего там не хватает, - это предоставления сгенерированных классов protobuf.