Генерация пары ключей 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" и нашел следующие библиотеки:

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

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


person null null    schedule 18.05.2018    source источник
comment
Посмотрите примеры и тесты для перечисленных вами проектов. Похоже, вам также нужна фундаментальная акклиматизация Swift. Вряд ли кто-то будет писать ваш код за вас.   -  person Frank C.    schedule 19.05.2018
comment
В этих библиотеках даже есть методы для создания ключей. Пожалуйста, выберите любой из них (хорошей идеей будет тот, у которого больше всего документации или обзоров), а затем попробуйте что-нибудь, вернитесь, если вы застряли, и включите свой код в новый вопрос.   -  person Maarten Bodewes    schedule 20.05.2018
comment
Это хороший и актуальный вопрос. Я починил это. Поэтому, пожалуйста, не удаляйте его. Вот ответ о реальной библиотеке, которая решает эту проблему!   -  person skywinder    schedule 31.05.2018


Ответы (2)


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

person null null    schedule 06.06.2018
comment
Какие инструменты вам пришлось установить? У меня возникают проблемы с coacopods, установите статическую библиотеку - person S-K'; 18.10.2018
comment
привет как тебе это удалось. я изо всех сил пытался получить и .r .s из подписи, которая эквивалентна версии Java, возможно ли для вас поделиться своим быстрым кодом из BitcoinKit? - person RicardoDuarte; 18.02.2020

Вы всегда можете использовать привязки 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.

person Gigi    schedule 09.03.2019