Генерация и подписание пары ключей ECDSA secp256k1 в Swift - PullRequest
0 голосов
/ 18 мая 2018

Я делаю прототип клиента 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" и нашел следующие библиотеки:

Все они являются привязками биткойн-ядраБиблиотека secp256k1 для Swift.

Можно ли сделать что-то вроде let kp = KeyPair("secp256k1"), let signedBytes = kp.sign(bytes)?Если да, то как, а если нет, то есть ли другие способы сделать это?

Ответы [ 2 ]

0 голосов
/ 10 марта 2019

Вы всегда можете использовать привязки C, но тогда вам придется работать с UnsafePointers и Bytes, и я предполагаю, что вы ищете подходящие оболочки.Поэтому я обнаружил этот sawtooth-swift-sdk , который, похоже, использует библиотеку secp256k1, чтобы в свою очередь импортировать широко используемый bitcoin-core / libsecp256k1 .Это позволяет что-то похожее на то, что вы просили (в соответствии с документами):

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. * ​​1010 *

0 голосов
/ 06 июня 2018

я нашел решение.это Биткойн-каркас .У меня были некоторые проблемы с установкой с Carthage, но Cocoapods + установка некоторых недостающих инструментов, найденных в сообщениях об ошибках, работает хорошо.

...