Curve25519 2.0.0

Curve25519 2.0.0

Christoph Hagen 维护。



  • 作者
  • Christoph Hagen

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'