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

Другие вопросы по тегам