适用于 Swift 4 的 Ed25519

CircleCI

本项目是便携式 C 语言 Ed25519 实现的 Swift 改编版本,该实现可从此处获得。 包括密钥交换和标量加法功能在内的完整功能均可用。

在 macOS 和 Linux 系统上,/dev/urandom 将用于生成种子。

安装

要在您的 SwiftPM 项目中集成该库,请将以下依赖项添加到 Package.swift

// swift-tools-version:4.1

.package(url: "https://github.com/AndrewBarba/ed25519.git", from: "1.0.0")

API

let seed = try Seed()

创建一个 32 字节的随机种子,用于密钥生成。 如果从 /dev/urandom 读取时出现问题,可能会抛出 Ed25519Error.seedGenerationFailed 错误。

let seedBytes: [UInt8] = [ ... ]
let seed2 = try Seed(bytes: bytes)

使用先前已知的值创建一个密钥生成种子。 bytes 必须是一个包含 32 字节的数组,否则将抛出 Ed25519Error.invalidSeedLength 错误。

let keyPair = KeyPair(seed: seed)

从给定的种子创建一个新的密钥对。

let pubBytes: [UInt8] = [ ... ]
let privBytes: [UInt8] = [ ... ]
let keyPair2 = try KeyPair(publicKey: pubBytes, privateKey: privBytes)

从先前已知的公钥和私钥创建一个密钥对。 如果公钥不是 32 字节长,则抛出 Ed25519Error.invalidPublicKeyLength 错误;如果私钥不是 64 字节长,则抛出 Ed25519Error.invalidPrivateKeyLength 错误。

let publicKey = try PublicKey(pubBytes)
let privateKey = try PrivateKey(privBytes)
let keyPair3 = KeyPair(publicKey: publicKey, privateKey: privateKey)

直接构造公钥和私钥。 同样的长度限制和异常适用。

publicKey.bytes
privateKey.bytes
keyPair.publicKey.bytes
keyPair.privateKey.bytes
seed.bytes

使用 bytes 属性访问任何密钥或种子背后的原始字节数组。

let message: [UInt8] = [ ... ]
let signature: [UInt8] = keyPair.sign(message: message)

使用给定的密钥对创建给定消息的签名。 signature 将是一个包含 64 字节的数组。

let valid: Bool = try keyPair.verify(signature: signature, message: message)
let valid2: Bool = try publicKey.verify(signature: signature, message: message)

使用密钥对或公钥验证给定消息上的签名。 如果 signature 不是一个包含 64 字节的数组,则两种方法都会抛出 Ed25519Error.invalidSignatureLength 错误。

let scalar: [UInt8] = [ ... ]
let keyPairMod = try keyPair.add(scalar: scalar)
let publicKeyMod = try publicKey.add(scalar: scalar)
let privateKeyMod = try privateKey.add(scalar: scalar)

scalar 添加到给定的密钥对、公钥或私钥中,其中 scalar 是一个 32 字节的缓冲区(可能是用种子生成的),生成新的密钥。 这对于在仅知道公钥的情况下,由第三方强制密钥对的随机性非常有用。 警告:标量的最后一位将被忽略 - 如果比较标量,请确保忽略 scalar[31]

let sharedSecret = keyPair.keyExchange()
let sharedSecret2 = try KeyPair.keyExchange(publicKey: pubBytes, privateKey: privBytes)
let sharedSecret3 = KeyPair.keyExchange(publicKey: publicKey, privateKey: privateKey)

对给定的公钥和私钥执行密钥交换,生成一个共享密钥,即一个包含 32 字节的数组。 建议在使用共享密钥之前对其进行哈希处理。

示例

查看单元测试以获取用法示例。

许可证

该 Swift 库是在 MIT 许可证下发布的。 有关详细信息,请参阅 LICENSE。

C 实现是 (c) 2015 Orson Peters,在宽松的 zlib 许可证下授权。 原始源代码未被修改,仅针对 SwiftPM 使用进行了重新组织。 有关详细信息,请参阅 CEd25519 中的 license.txt。