Files
age-plugin-se/Tests/PluginTests.swift

829 lines
21 KiB
Swift

import XCTest
@testable import age_plugin_se
#if !os(Linux) && !os(Windows)
import CryptoKit
#else
import Crypto
#endif
final class PluginTests: XCTestCase {
func testCertificateTag() throws {
let key = try P256.KeyAgreement.PublicKey(compactRepresentation: Data(count: 32))
XCTAssertEqual("Ujulpw", key.tag.base64RawEncodedString)
}
// Test to ensure that age-plugin-yubikey has the same output tag
// These values were extracted from a yubikey recipient
func testCertificateTag_YubiKeyPlugin() throws {
let key = try P256.KeyAgreement.PublicKey(
compactRepresentation: Data([
182, 32, 36, 98, 119, 204, 123, 231, 20, 203, 102, 119, 81, 232, 194, 196, 140, 194, 55,
12, 222, 162, 205, 252, 47, 114, 187, 157, 117, 151, 57, 158,
]))
XCTAssertEqual(Data([128, 103, 102, 255]), key.tag)
XCTAssertEqual("gGdm/w", key.tag.base64RawEncodedString)
}
}
final class GenerateTests: XCTestCase {
var stream = MemoryStream()
var crypto = DummyCrypto()
override func setUp() {
stream = MemoryStream()
crypto = DummyCrypto()
}
func testGenerate() throws {
let plugin = Plugin(crypto: crypto, stream: stream)
let result = try plugin.generateKey(
accessControl: .anyBiometryOrPasscode, now: Date(timeIntervalSinceReferenceDate: -123456789.0)
)
XCTAssertEqual(
"""
# created: 1997-02-02T02:26:51Z
# access control: any biometry or passcode
# public key: age1se1qvlvs7x2g83gtaqg0dlstnm3ee8tr49dhtdnxudpfd0sy2gedw20kjmseq4
AGE-PLUGIN-SE-1XAJERWKUTH2YWAYH3F32SZKGMGPFSJF3HWJ7Z0Q9SP4JEDTMVG6Q6JD2VG
""", result.0)
XCTAssertEqual(
"age1se1qvlvs7x2g83gtaqg0dlstnm3ee8tr49dhtdnxudpfd0sy2gedw20kjmseq4", result.1)
}
func testGenerate_AnyBiometryAndPasscode() throws {
let plugin = Plugin(crypto: crypto, stream: stream)
let result = try plugin.generateKey(
accessControl: .anyBiometryAndPasscode,
now: Date(timeIntervalSinceReferenceDate: -123456789.0))
XCTAssertEqual(
"""
# created: 1997-02-02T02:26:51Z
# access control: any biometry and passcode
# public key: age1se1qvlvs7x2g83gtaqg0dlstnm3ee8tr49dhtdnxudpfd0sy2gedw20kjmseq4
AGE-PLUGIN-SE-1XAJERWKUTH2YWAYH3F32SZKGMGPFSJF3HWJ7Z0Q9SP4JEDTMVG6Q6JD2VG
""", result.0)
XCTAssertEqual(
"age1se1qvlvs7x2g83gtaqg0dlstnm3ee8tr49dhtdnxudpfd0sy2gedw20kjmseq4", result.1)
}
func testGenerate_CurrentBiometry() throws {
let plugin = Plugin(crypto: crypto, stream: stream)
let result = try plugin.generateKey(
accessControl: .currentBiometry, now: Date(timeIntervalSinceReferenceDate: -123456789.0))
XCTAssertEqual(
"""
# created: 1997-02-02T02:26:51Z
# access control: current biometry
# public key: age1se1qvlvs7x2g83gtaqg0dlstnm3ee8tr49dhtdnxudpfd0sy2gedw20kjmseq4
AGE-PLUGIN-SE-1XAJERWKUTH2YWAYH3F32SZKGMGPFSJF3HWJ7Z0Q9SP4JEDTMVG6Q6JD2VG
""", result.0)
XCTAssertEqual(
"age1se1qvlvs7x2g83gtaqg0dlstnm3ee8tr49dhtdnxudpfd0sy2gedw20kjmseq4", result.1)
}
func testGenerate_NoSecureEnclaveSupport() throws {
let plugin = Plugin(crypto: crypto, stream: stream)
crypto.isSecureEnclaveAvailable = false
XCTAssertThrowsError(
try plugin.generateKey(
accessControl: .anyBiometryOrPasscode,
now: Date(timeIntervalSinceReferenceDate: -123456789.0))
) { error in
XCTAssertEqual(Plugin.Error.seUnsupported, error as! Plugin.Error)
}
}
}
final class RecipientV1Tests: XCTestCase {
var stream = MemoryStream()
var crypto = DummyCrypto()
override func setUp() {
stream = MemoryStream()
crypto = DummyCrypto()
}
// Just a test to get the identities of the test keys used in this test
func testKeys() throws {
let key1 = try! crypto.newSecureEnclavePrivateKey(
dataRepresentation: Data(base64RawEncoded: "OSe+zDK18qF0UrjxYVkmwvxyEdxZHp9F69rElj8bKS8")!)
XCTAssertEqual(
"AGE-PLUGIN-SE-18YNMANPJKHE2ZAZJHRCKZKFXCT78YYWUTY0F730TMTZFV0CM9YHSRP8GPG",
key1.ageIdentity)
XCTAssertEqual(
"age1se1qf0l9gks6x65ha077wq3w3u8fy02tpg3cd9w5j0jlgpfgqkcut2lw6hta9l",
key1.publicKey.ageRecipient)
let key2 = try! crypto.newSecureEnclavePrivateKey(
dataRepresentation: Data(base64RawEncoded: "kBuQrPyfvCqBXJ5G4YBkqNER201niIeOmlXsRS2gxN0")!)
XCTAssertEqual(
"AGE-PLUGIN-SE-1JQDEPT8UN77Z4Q2UNERWRQRY4RG3RK6DV7YG0R562HKY2TDQCNWSREKAW7",
key2.ageIdentity)
XCTAssertEqual(
"age1se1q0mm28s88km3d8fvwve26xg4tt26cqamhxm79g9xvmw0f2erawj752upj6l",
key2.publicKey.ageRecipient)
}
func testNothing() throws {
let plugin = Plugin(crypto: crypto, stream: stream)
stream.add(input: "-> done\n")
plugin.runRecipientV1()
XCTAssertEqual("-> done\n", stream.output)
}
func testRecipient() throws {
let plugin = Plugin(crypto: crypto, stream: stream)
stream.add(
input:
"""
-> add-recipient age1se1qf0l9gks6x65ha077wq3w3u8fy02tpg3cd9w5j0jlgpfgqkcut2lw6hta9l
-> wrap-file-key
AAAAAAAAAAAAAAAAAAAAAQ
-> done
-> ok
""")
plugin.runRecipientV1()
XCTAssertEqual(
"""
-> recipient-stanza 0 piv-p256 14yi6A Az7IeMpB4oX0CHt/Bc9xzk6x1K262zNxoUtfAikZa5T7
SLgnrcnHLaJHCx+fwSEWWoflDgL91oDGCGNwb2YaT+4
-> done
""", stream.output)
}
func testIdentity() throws {
let plugin = Plugin(crypto: crypto, stream: stream)
stream.add(
input:
"""
-> add-identity AGE-PLUGIN-SE-18YNMANPJKHE2ZAZJHRCKZKFXCT78YYWUTY0F730TMTZFV0CM9YHSRP8GPG
-> wrap-file-key
AAAAAAAAAAAAAAAAAAAAAQ
-> done
-> ok
""")
plugin.runRecipientV1()
XCTAssertEqual(
"""
-> recipient-stanza 0 piv-p256 14yi6A Az7IeMpB4oX0CHt/Bc9xzk6x1K262zNxoUtfAikZa5T7
SLgnrcnHLaJHCx+fwSEWWoflDgL91oDGCGNwb2YaT+4
-> done
""", stream.output)
}
func testMultipleRecipients() throws {
let plugin = Plugin(crypto: crypto, stream: stream)
stream.add(
input:
"""
-> add-recipient age1se1qf0l9gks6x65ha077wq3w3u8fy02tpg3cd9w5j0jlgpfgqkcut2lw6hta9l
-> wrap-file-key
AAAAAAAAAAAAAAAAAAAAAQ
-> add-recipient age1se1q0mm28s88km3d8fvwve26xg4tt26cqamhxm79g9xvmw0f2erawj752upj6l
-> done
-> ok
-> ok
""")
plugin.runRecipientV1()
XCTAssertEqual(
"""
-> recipient-stanza 0 piv-p256 14yi6A Az7IeMpB4oX0CHt/Bc9xzk6x1K262zNxoUtfAikZa5T7
SLgnrcnHLaJHCx+fwSEWWoflDgL91oDGCGNwb2YaT+4
-> recipient-stanza 0 piv-p256 1mgwOA A1x2nUpw2wo/7z0JR5puskK6NuvW5XkQBwkun/T3WC80
9NGkkBZykDMgw6dndbbjnn7DQBalVV4sVIurWku030Y
-> done
""", stream.output)
}
func testMultipleRecipientsMultipleKeys() throws {
let plugin = Plugin(crypto: crypto, stream: stream)
stream.add(
input:
"""
-> add-recipient age1se1qf0l9gks6x65ha077wq3w3u8fy02tpg3cd9w5j0jlgpfgqkcut2lw6hta9l
-> wrap-file-key
AAAAAAAAAAAAAAAAAAAAAQ
-> wrap-file-key
AAAAAAAAAAAAAAAAAAAAAg
-> add-recipient age1se1q0mm28s88km3d8fvwve26xg4tt26cqamhxm79g9xvmw0f2erawj752upj6l
-> done
-> ok
-> ok
-> ok
-> ok
""")
plugin.runRecipientV1()
XCTAssertEqual(
"""
-> recipient-stanza 0 piv-p256 14yi6A Az7IeMpB4oX0CHt/Bc9xzk6x1K262zNxoUtfAikZa5T7
SLgnrcnHLaJHCx+fwSEWWoflDgL91oDGCGNwb2YaT+4
-> recipient-stanza 0 piv-p256 1mgwOA A1x2nUpw2wo/7z0JR5puskK6NuvW5XkQBwkun/T3WC80
9NGkkBZykDMgw6dndbbjnn7DQBalVV4sVIurWku030Y
-> recipient-stanza 1 piv-p256 14yi6A AvEp8Oz0cMnXhpXnWM6cwer4nEDHus/AvNp3kYnUH0Qs
L3ig8s2AqjusH/0lW6ZueSEYhpeV2ofrQpaKP06WI9g
-> recipient-stanza 1 piv-p256 1mgwOA AoIMpSYaKzGl5IBFaM9AFJXmrseGzTzcQjS9R4kRcjRi
vm8flaP+4W08S6LwFENwnEKLlpzZ5YqZ3NdpKFo7Vg8
-> done
""", stream.output)
}
func testRecipientError() throws {
let plugin = Plugin(crypto: crypto, stream: stream)
stream.add(
input:
"""
-> add-recipient age1se1qf0l9gks6x65ha077wq3w3u8fy02tpg3cd9w5j0jlgpfgqkcut2lw6hta9l
-> wrap-file-key
AAAAAAAAAAAAAAAAAAAAAQ
-> add-recipient age1invalid1q0mm28s88km3d8fvwve26xg4tt26cqamhxm79g9xvmw0f2erawj75hkckfk
-> done
-> ok
""")
plugin.runRecipientV1()
XCTAssertEqual(
"""
-> error recipient 1
Q2hlY2tzdW0gZG9lc24ndCBtYXRjaA
-> done
""", stream.output)
}
func testIdentityError() throws {
let plugin = Plugin(crypto: crypto, stream: stream)
stream.add(
input:
"""
-> add-identity AGE-PLUGIN-SE-18YNMANPJKHE2ZAZJHRCKZKFXCT78YYWUTY0F730TMTZFV0CM9YHSRP8GPG
-> wrap-file-key
AAAAAAAAAAAAAAAAAAAAAQ
-> add-identity AGE-PLUGIN-INVALID-18YNMANPJKHE2ZAZJHRCKZKFXCT78YYWUTY0F730TMTZFV0CM9YHS2FM3SW
-> done
-> ok
""")
plugin.runRecipientV1()
XCTAssertEqual(
"""
-> error identity 1
Q2hlY2tzdW0gZG9lc24ndCBtYXRjaA
-> done
""", stream.output)
}
func testInvalidRecipientHRP() throws {
let plugin = Plugin(crypto: crypto, stream: stream)
stream.add(
input:
"""
-> add-recipient age1vld7p2khw44ds8t00vcfmjdf35zxqvn2trjccd35h4s22faj94vsjhn620
-> wrap-file-key
AAAAAAAAAAAAAAAAAAAAAQ
-> done
-> ok
""")
plugin.runRecipientV1()
XCTAssertEqual(
"""
-> error recipient 0
dW5rbm93biBIUlA6IGFnZQ
-> done
""", stream.output)
}
// func testFailingCryptoOperations() throws {
// let plugin = Plugin(crypto: crypto, stream: stream)
// stream.add(
// input:
// """
// -> add-recipient age1se1qf0l9gks6x65ha077wq3w3u8fy02tpg3cd9w5j0jlgpfgqkcut2lw6hta9l
// -> wrap-file-key
// AAAAAAAAAAAAAAAAAAAAAQ
// -> done
// -> ok
// """)
// crypto.failingOperations = true
// plugin.runRecipientV1()
// XCTAssertEqual(
// """
// -> error internal
// ZHVtbXkgZXJyb3I
// -> done
// """, stream.output)
// }
func testUnknownStanzaTypes() throws {
let plugin = Plugin(crypto: crypto, stream: stream)
stream.add(
input:
"""
-> add-recipient age1se1qf0l9gks6x65ha077wq3w3u8fy02tpg3cd9w5j0jlgpfgqkcut2lw6hta9l
-> unknown-stanza 1 2 3
-> wrap-file-key
AAAAAAAAAAAAAAAAAAAAAQ
-> anotherunknownstanza
AAAAAAAAAAAAAAAAAAAAAQ
-> done
-> ok
""")
plugin.runRecipientV1()
XCTAssertEqual(
"""
-> recipient-stanza 0 piv-p256 14yi6A Az7IeMpB4oX0CHt/Bc9xzk6x1K262zNxoUtfAikZa5T7
SLgnrcnHLaJHCx+fwSEWWoflDgL91oDGCGNwb2YaT+4
-> done
""", stream.output)
}
}
final class IdentityV1Tests: XCTestCase {
var stream = MemoryStream()
var crypto = DummyCrypto()
override func setUp() {
stream = MemoryStream()
crypto = DummyCrypto()
}
func testNothing() throws {
let plugin = Plugin(crypto: crypto, stream: stream)
stream.add(input: "-> done\n")
plugin.runIdentityV1()
XCTAssertEqual("-> done\n", stream.output)
}
func testRecipientStanza() throws {
let plugin = Plugin(crypto: crypto, stream: stream)
stream.add(
input:
"""
-> add-identity AGE-PLUGIN-SE-18YNMANPJKHE2ZAZJHRCKZKFXCT78YYWUTY0F730TMTZFV0CM9YHSRP8GPG
-> recipient-stanza 0 piv-p256 14yi6A Az7IeMpB4oX0CHt/Bc9xzk6x1K262zNxoUtfAikZa5T7
SLgnrcnHLaJHCx+fwSEWWoflDgL91oDGCGNwb2YaT+4
-> done
-> ok
""")
plugin.runIdentityV1()
XCTAssertEqual(
"""
-> file-key 0
AAAAAAAAAAAAAAAAAAAAAQ
-> done
""", stream.output)
}
func testRecipientStanzaMultipleFiles() throws {
let plugin = Plugin(crypto: crypto, stream: stream)
stream.add(
input:
"""
-> add-identity AGE-PLUGIN-SE-18YNMANPJKHE2ZAZJHRCKZKFXCT78YYWUTY0F730TMTZFV0CM9YHSRP8GPG
-> recipient-stanza 0 piv-p256 14yi6A Az7IeMpB4oX0CHt/Bc9xzk6x1K262zNxoUtfAikZa5T7
SLgnrcnHLaJHCx+fwSEWWoflDgL91oDGCGNwb2YaT+4
-> recipient-stanza 1 piv-p256 14yi6A AvEp8Oz0cMnXhpXnWM6cwer4nEDHus/AvNp3kYnUH0Qs
L3ig8s2AqjusH/0lW6ZueSEYhpeV2ofrQpaKP06WI9g
-> done
-> ok
-> ok
""")
plugin.runIdentityV1()
XCTAssertEqual(
"""
-> file-key 0
AAAAAAAAAAAAAAAAAAAAAQ
-> file-key 1
AAAAAAAAAAAAAAAAAAAAAg
-> done
""", stream.output)
}
func testRecipientStanzaMultipleFilesMultipleIdentities() throws {
let plugin = Plugin(crypto: crypto, stream: stream)
stream.add(
input:
"""
-> add-identity AGE-PLUGIN-SE-18YNMANPJKHE2ZAZJHRCKZKFXCT78YYWUTY0F730TMTZFV0CM9YHSRP8GPG
-> add-identity AGE-PLUGIN-SE-1JQDEPT8UN77Z4Q2UNERWRQRY4RG3RK6DV7YG0R562HKY2TDQCNWSREKAW7
-> recipient-stanza 0 piv-p256 14yi6A Az7IeMpB4oX0CHt/Bc9xzk6x1K262zNxoUtfAikZa5T7
SLgnrcnHLaJHCx+fwSEWWoflDgL91oDGCGNwb2YaT+4
-> recipient-stanza 0 piv-p256 1mgwOA A1x2nUpw2wo/7z0JR5puskK6NuvW5XkQBwkun/T3WC80
9NGkkBZykDMgw6dndbbjnn7DQBalVV4sVIurWku030Y
-> recipient-stanza 1 piv-p256 14yi6A AvEp8Oz0cMnXhpXnWM6cwer4nEDHus/AvNp3kYnUH0Qs
L3ig8s2AqjusH/0lW6ZueSEYhpeV2ofrQpaKP06WI9g
-> recipient-stanza 1 piv-p256 1mgwOA AoIMpSYaKzGl5IBFaM9AFJXmrseGzTzcQjS9R4kRcjRi
vm8flaP+4W08S6LwFENwnEKLlpzZ5YqZ3NdpKFo7Vg8
-> done
-> ok
-> ok
""")
plugin.runIdentityV1()
XCTAssertEqual(
"""
-> file-key 0
AAAAAAAAAAAAAAAAAAAAAQ
-> file-key 1
AAAAAAAAAAAAAAAAAAAAAg
-> done
""", stream.output)
}
func testRecipientStanzaMultipleStanzasMissingIdentity() throws {
let plugin = Plugin(crypto: crypto, stream: stream)
stream.add(
input:
"""
-> add-identity AGE-PLUGIN-SE-1JQDEPT8UN77Z4Q2UNERWRQRY4RG3RK6DV7YG0R562HKY2TDQCNWSREKAW7
-> recipient-stanza 0 piv-p256 14yi6A Az7IeMpB4oX0CHt/Bc9xzk6x1K262zNxoUtfAikZa5T7
SLgnrcnHLaJHCx+fwSEWWoflDgL91oDGCGNwb2YaT+4
-> recipient-stanza 0 piv-p256 1mgwOA A1x2nUpw2wo/7z0JR5puskK6NuvW5XkQBwkun/T3WC80
9NGkkBZykDMgw6dndbbjnn7DQBalVV4sVIurWku030Y
-> done
-> ok
-> ok
""")
plugin.runIdentityV1()
XCTAssertEqual(
"""
-> file-key 0
AAAAAAAAAAAAAAAAAAAAAQ
-> done
""", stream.output)
}
func testRecipientStanza_UnknownType() throws {
let plugin = Plugin(crypto: crypto, stream: stream)
stream.add(
input:
"""
-> add-identity AGE-PLUGIN-SE-18YNMANPJKHE2ZAZJHRCKZKFXCT78YYWUTY0F730TMTZFV0CM9YHSRP8GPG
-> recipient-stanza 0 X25519 A1x2nUpw2wo/7z0JR5puskK6NuvW5XkQBwkun/T3WC80
9NGkkBZykDMgw6dndbbjnn7DQBalVV4sVIurWku030Y
-> recipient-stanza 0 piv-p256 14yi6A Az7IeMpB4oX0CHt/Bc9xzk6x1K262zNxoUtfAikZa5T7
SLgnrcnHLaJHCx+fwSEWWoflDgL91oDGCGNwb2YaT+4
-> done
-> ok
""")
plugin.runIdentityV1()
XCTAssertEqual(
"""
-> file-key 0
AAAAAAAAAAAAAAAAAAAAAQ
-> done
""", stream.output)
}
func testIdentityError() throws {
let plugin = Plugin(crypto: crypto, stream: stream)
stream.add(
input:
"""
-> add-identity AGE-PLUGIN-SE-18YNMANPJKHE2ZAZJHRCKZKFXCT78YYWUTY0F730TMTZFV0CM9YHSRP8GPG
-> add-identity AGE-PLUGIN-INVALID-18YNMANPJKHE2ZAZJHRCKZKFXCT78YYWUTY0F730TMTZFV0CM9YHS2FM3SW
-> recipient-stanza 0 piv-p256 14yi6A Az7IeMpB4oX0CHt/Bc9xzk6x1K262zNxoUtfAikZa5T7
SLgnrcnHLaJHCx+fwSEWWoflDgL91oDGCGNwb2YaT+4
-> done
-> ok
-> ok
""")
plugin.runIdentityV1()
XCTAssertEqual(
"""
-> error identity 1
Q2hlY2tzdW0gZG9lc24ndCBtYXRjaA
-> done
""", stream.output)
}
func testUnknownIdentityHRP() throws {
let plugin = Plugin(crypto: crypto, stream: stream)
stream.add(
input:
"""
-> add-identity AGE-PLUGIN-SE-18YNMANPJKHE2ZAZJHRCKZKFXCT78YYWUTY0F730TMTZFV0CM9YHSRP8GPG
-> add-identity AGE-SECRET-KEY-1MCFVWZK6PK625PWMWVYPZDQM4N7AS3VA754JHCC60ZT7WJ79TQQSQDYVGF
-> recipient-stanza 0 piv-p256 14yi6A Az7IeMpB4oX0CHt/Bc9xzk6x1K262zNxoUtfAikZa5T7
SLgnrcnHLaJHCx+fwSEWWoflDgL91oDGCGNwb2YaT+4
-> done
-> ok
-> ok
""")
plugin.runIdentityV1()
XCTAssertEqual(
"""
-> error identity 1
dW5rbm93biBIUlA6IEFHRS1TRUNSRVQtS0VZLQ
-> done
""", stream.output)
}
func testRecipientStanzaMultipleFilesStructurallyInvalidFile() throws {
let plugin = Plugin(crypto: crypto, stream: stream)
stream.add(
input:
"""
-> add-identity AGE-PLUGIN-SE-18YNMANPJKHE2ZAZJHRCKZKFXCT78YYWUTY0F730TMTZFV0CM9YHSRP8GPG
-> add-identity AGE-PLUGIN-SE-1JQDEPT8UN77Z4Q2UNERWRQRY4RG3RK6DV7YG0R562HKY2TDQCNWSREKAW7
-> recipient-stanza 0 piv-p256 14yi6A Az7IeMpB4oX0CHt/Bc9xzk6x1K262zNxoUtfAikZa5T7
SLgnrcnHLaJHCx+fwSEWWoflDgL91oDGCGNwb2YaT+4
-> recipient-stanza 0 piv-p256 1mgwOA
9NGkkBZykDMgw6dndbbjnn7DQBalVV4sVIurWku030Y
-> recipient-stanza 1 piv-p256 14yi6A AvEp8Oz0cMnXhpXnWM6cwer4nEDHus/AvNp3kYnUH0Qs
L3ig8s2AqjusH/0lW6ZueSEYhpeV2ofrQpaKP06WI9g
-> recipient-stanza 1 piv-p256 1mgwOA AoIMpSYaKzGl5IBFaM9AFJXmrseGzTzcQjS9R4kRcjRi
vm8flaP+4W08S6LwFENwnEKLlpzZ5YqZ3NdpKFo7Vg8
-> done
-> ok
-> ok
""")
plugin.runIdentityV1()
XCTAssertEqual(
"""
-> error stanza 0
aW5jb3JyZWN0IGFyZ3VtZW50IGNvdW50
-> file-key 1
AAAAAAAAAAAAAAAAAAAAAg
-> done
""", stream.output)
}
func testRecipientStanzaInvalidStructure_ArgumentCount() throws {
let plugin = Plugin(crypto: crypto, stream: stream)
stream.add(
input:
"""
-> add-identity AGE-PLUGIN-SE-18YNMANPJKHE2ZAZJHRCKZKFXCT78YYWUTY0F730TMTZFV0CM9YHSRP8GPG
-> recipient-stanza 0 piv-p256 1mgwOA
9NGkkBZykDMgw6dndbbjnn7DQBalVV4sVIurWku030Y
-> done
-> ok
""")
plugin.runIdentityV1()
XCTAssertEqual(
"""
-> error stanza 0
aW5jb3JyZWN0IGFyZ3VtZW50IGNvdW50
-> done
""", stream.output)
}
func testRecipientStanzaInvalidTag() throws {
let plugin = Plugin(crypto: crypto, stream: stream)
stream.add(
input:
"""
-> add-identity AGE-PLUGIN-SE-18YNMANPJKHE2ZAZJHRCKZKFXCT78YYWUTY0F730TMTZFV0CM9YHSRP8GPG
-> recipient-stanza 0 piv-p256 14yi Az7IeMpB4oX0CHt/Bc9xzk6x1K262zNxoUtfAikZa5T7
SLgnrcnHLaJHCx+fwSEWWoflDgL91oDGCGNwb2YaT+4
-> done
-> ok
""")
plugin.runIdentityV1()
XCTAssertEqual(
"""
-> error stanza 0
aW52YWxpZCB0YWc
-> done
""", stream.output)
}
func testRecipientStanzaInvalidShare() throws {
let plugin = Plugin(crypto: crypto, stream: stream)
stream.add(
input:
"""
-> add-identity AGE-PLUGIN-SE-18YNMANPJKHE2ZAZJHRCKZKFXCT78YYWUTY0F730TMTZFV0CM9YHSRP8GPG
-> recipient-stanza 0 piv-p256 14yi6A Az7IeMpB4oX0CHt/Bc9xzk6x1K262zNxoUtfAikZa5Q
SLgnrcnHLaJHCx+fwSEWWoflDgL91oDGCGNwb2YaT+4
-> done
-> ok
""")
plugin.runIdentityV1()
XCTAssertEqual(
"""
-> error stanza 0
aW52YWxpZCBzaGFyZQ
-> done
""", stream.output)
}
func testRecipientStanzaInvalidBody() throws {
let plugin = Plugin(crypto: crypto, stream: stream)
stream.add(
input:
"""
-> add-identity AGE-PLUGIN-SE-18YNMANPJKHE2ZAZJHRCKZKFXCT78YYWUTY0F730TMTZFV0CM9YHSRP8GPG
-> recipient-stanza 0 piv-p256 14yi6A Az7IeMpB4oX0CHt/Bc9xzk6x1K262zNxoUtfAikZa5T7
AAAAAAAAAAAAAAAAAAAAARIiJq2e9+1E+xK92Pvdtw
-> done
-> ok
""")
plugin.runIdentityV1()
XCTAssertEqual(
"""
-> error stanza 0
aW52YWxpZCBib2R5
-> done
""", stream.output)
}
func testFailingCryptoOperations() throws {
let plugin = Plugin(crypto: crypto, stream: stream)
stream.add(
input:
"""
-> add-identity AGE-PLUGIN-SE-18YNMANPJKHE2ZAZJHRCKZKFXCT78YYWUTY0F730TMTZFV0CM9YHSRP8GPG
-> add-identity AGE-PLUGIN-SE-1JQDEPT8UN77Z4Q2UNERWRQRY4RG3RK6DV7YG0R562HKY2TDQCNWSREKAW7
-> recipient-stanza 0 piv-p256 14yi6A Az7IeMpB4oX0CHt/Bc9xzk6x1K262zNxoUtfAikZa5T7
SLgnrcnHLaJHCx+fwSEWWoflDgL91oDGCGNwb2YaT+4
-> recipient-stanza 0 piv-p256 1mgwOA A1x2nUpw2wo/7z0JR5puskK6NuvW5XkQBwkun/T3WC80
9NGkkBZykDMgw6dndbbjnn7DQBalVV4sVIurWku030Y
-> done
-> ok
-> ok
-> ok
""")
crypto.failingOperations = true
plugin.runIdentityV1()
XCTAssertEqual(
"""
-> msg
ZHVtbXkgZXJyb3I
-> msg
ZHVtbXkgZXJyb3I
-> done
""", stream.output)
}
func testUnknownStanzas() throws {
let plugin = Plugin(crypto: crypto, stream: stream)
stream.add(
input:
"""
-> unknown-stanza-1 a bbb c
-> add-identity AGE-PLUGIN-SE-18YNMANPJKHE2ZAZJHRCKZKFXCT78YYWUTY0F730TMTZFV0CM9YHSRP8GPG
-> unknown-stanza-2
9NGkkBZykDMgw6dndbbjnn7DQBalVV4sVIurWku030Y
-> recipient-stanza 0 piv-p256 14yi6A Az7IeMpB4oX0CHt/Bc9xzk6x1K262zNxoUtfAikZa5T7
SLgnrcnHLaJHCx+fwSEWWoflDgL91oDGCGNwb2YaT+4
-> done
-> ok
""")
plugin.runIdentityV1()
XCTAssertEqual(
"""
-> file-key 0
AAAAAAAAAAAAAAAAAAAAAQ
-> done
""", stream.output)
}
}