我在Swift上为iOS制作Hyperledger Sawtooth客户端原型。
在此之前,我对Java上的Android做了同样的事情。在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();
我用google搜索“secp256k1 swift”并找到了这些库:
所有这些都是比特币核心的secp256k1库与Swift的绑定。
我可以制作像let kp = KeyPair("secp256k1")
,let signedBytes = kp.sign(bytes)
这样的东西吗?如果是,那么如何,如果没有,那么还有其他方法吗?
我找到了解决方案这是BitcoinKit framework。我在使用Carthage安装时遇到了一些问题,但Cocoapods +在错误消息中找到的一些缺少工具的安装效果很好。
你总是可以使用C绑定,但是你必须使用UnsafePointers和Bytes,我假设你正在寻找合适的包装器。因此,我发现这个sawtooth-swift-sdk,它似乎使用boilertalk的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类。