用于 Swift 的 Ed25519

本项目是可移植 C Ed25519 实现的 Swift 改编版,可在此处获取。
完整的功能,包括密钥交换和标量加法函数,均已提供。

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

安装

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

.Package(url: "https://github.com/bytehubio/ed25519.git", branch: "master")

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 许可证下许可。 有关详细信息,请参阅 CEd25519 中的 license.txt。