Curve25519
一个小型框架,用于在 Swift 中使用 Curve25519 函数。
目的
此框架是为了提供 Swift API 给 Signal 协议所必需的椭圆曲线函数。它包含了在 libsignal-protocol-c 中找到的纯 C 实现封装。
该框架用于 Signal 协议的 Swift 实现。
安装
可以使用 Cocoapods 安装此框架。在您的 Podfile
中包含它
pod 'Curve25519'
版本取决于您使用的 Swift 版本
- Swift 5:
1.1
- Swift 4.2:
1.0.1
- Swift 4:
1.0
使用
一旦将框架包含到您的项目中,只需简单地进行以下操作
import Curve25519
所有功能都可通过 Curve25519
类的静态方法访问,例如
let agreement = Curve25519.calculateAgreement(privateKey: priv, publicKey: pub)
特性
该框架提供了以下特性
为私钥创建公钥
创建一个32字节私钥对应的公钥。
func publicKey(for privateKey: Data, basepoint: Data) throws -> Data
如果输入大小不正确,函数将返回nil。
签名和验证消息
可以使用私钥签名消息,并用公钥验证消息。
func signature(for message: Data, privateKey: Data, randomData: Data) throws -> Data
func verify(signature: Data, for message: Data, publicKey: Data) -> Bool
VRF签名和验证
此外,还可以创建和验证VRF(可验证随机函数)签名。
func vrfSignature(for message: Data, privateKey: Data, randomData: Data) throws -> Data
func verify(vrfSignature: Data, for message: Data, publicKey: Data) throws -> Data
密钥协商
在私钥和公钥之间创建共享密钥。
func calculateAgreement(privateKey: Data, publicKey: Data) throws -> Data
错误
如果输入无效,一些函数可能会抛出错误。这些函数抛出的所有错误都是类型为CurveError
的,它是符合CustomStringConvertible
协议的枚举。这使得在代码中检查错误并打印它们以进行调试变得容易。
直接使用C函数
另外,所有C函数都直接暴露出来供使用
// Public key creation
func curve25519_donna(_ pub: UnsafeMutablePointer<UInt8>!,
_ priv: UnsafePointer<UInt8>!,
_ base: UnsafePointer<UInt8>!) -> Int32
// Signing
func curve25519_sign(
_ signature_out: UnsafeMutablePointer<UInt8>!,
_ curve25519_privkey: UnsafePointer<UInt8>!,
_ msg: UnsafePointer<UInt8>!,
_ msg_len: UInt,
_ random: UnsafePointer<UInt8>!) -> Int32
// Verification
func curve25519_verify(
_ signature: UnsafePointer<UInt8>!,
_ curve25519_pubkey: UnsafePointer<UInt8>!,
_ msg: UnsafePointer<UInt8>!,
_ msg_len: UInt) -> Int32
// VRF signature
func generalized_xveddsa_25519_sign(
_ signature_out: UnsafeMutablePointer<UInt8>!,
_ x25519_privkey_scalar: UnsafePointer<UInt8>!,
_ msg: UnsafePointer<UInt8>!,
_ msg_len: UInt,
_ random: UnsafePointer<UInt8>!,
_ customization_label: UnsafePointer<UInt8>!,
_ customization_label_len: UInt) -> Int32
// VRF verification
func generalized_xveddsa_25519_verify(
_ vrf_out: UnsafeMutablePointer<UInt8>!,
_ signature: UnsafePointer<UInt8>!,
_ x25519_pubkey_bytes: UnsafePointer<UInt8>!,
_ msg: UnsafePointer<UInt8>!,
_ msg_len: UInt,
_ customization_label: UnsafePointer<UInt8>!,
_ customization_label_len: UInt) -> Int32
// Agreement
func curve25519_donna(_ shared: UnsafeMutablePointer<UInt8>!,
_ priv: UnsafePointer<UInt8>!,
_ pub: UnsafePointer<UInt8>!) -> Int32
文档
由于它有助于其他人员理解代码,该项目进行了大量的文档编写。文档是用jazzy创建的,它能生成类似苹果风格的优秀文档。
在项目目录中运行以下命令可以(重新)生成文档:
jazzy --min-acl private -a 'Christoph Hagen' -u 'https://github.com/christophhagen' -g 'https://github.com/christophhagen/Curve25519' -o 'Documentation'