1+ //
2+ // Created by Scott Phillips on 9/8/21.
3+ //
4+
5+ import XCTest
6+ import SwiftProtobuf
7+ import Foundation
8+
9+ @testable import OkapiSwift
10+
11+ final class OberonTests : XCTestCase {
12+ func testOberonDemo( ) throws {
13+ let key = try Oberon . createKey ( request: Okapi_Security_V1_CreateOberonKeyRequest ( ) )
14+ let data = " alice " . data ( using: . utf8) ?? Data ( )
15+ let nonce = " 1234 " . data ( using: . utf8) ?? Data ( )
16+ var createTokenRequest = Okapi_Security_V1_CreateOberonTokenRequest ( )
17+ createTokenRequest. data = data
18+ createTokenRequest. sk = key. sk
19+ let token = try Oberon . createToken ( request: createTokenRequest)
20+ var createProofRequest = Okapi_Security_V1_CreateOberonProofRequest ( )
21+ createProofRequest. data = data
22+ createProofRequest. nonce = nonce
23+ createProofRequest. token = token. token
24+ let proof = try Oberon . createProof ( request: createProofRequest)
25+ var verifyProofRequest = Okapi_Security_V1_VerifyOberonProofRequest ( )
26+ verifyProofRequest. data = data
27+ verifyProofRequest. nonce = nonce
28+ verifyProofRequest. pk = key. pk
29+ verifyProofRequest. proof = proof. proof
30+ let result = try Oberon . verifyProof ( request: verifyProofRequest)
31+
32+ XCTAssertTrue ( result. valid, " Proof should verify " )
33+ }
34+
35+ func testDemoWithBlinding( ) throws {
36+ let key = try Oberon . createKey ( request: Okapi_Security_V1_CreateOberonKeyRequest ( ) )
37+ let data = " alice " . data ( using: . utf8) ?? Data ( )
38+ let nonce = " 1234 " . data ( using: . utf8) ?? Data ( )
39+
40+ let issuer_2fa = " issuer code " . data ( using: . utf8) ?? Data ( )
41+ var tokenRequest = Okapi_Security_V1_CreateOberonTokenRequest ( )
42+ tokenRequest. data = data
43+ tokenRequest. sk = key. sk
44+ tokenRequest. blinding. append ( issuer_2fa)
45+ let blindedToken = try Oberon . createToken ( request: tokenRequest)
46+
47+ // Holder unblinds the token
48+ var unblindRequest = Okapi_Security_V1_UnBlindOberonTokenRequest ( )
49+ unblindRequest. token = blindedToken. token
50+ unblindRequest. blinding. append ( issuer_2fa)
51+ let token = try Oberon . unblindToken ( request: unblindRequest)
52+
53+ // Holder prepares a proof without blinding
54+ var createProofRequest = Okapi_Security_V1_CreateOberonProofRequest ( )
55+ createProofRequest. data = data
56+ createProofRequest. nonce = nonce
57+ createProofRequest. token = token. token
58+ var proof = try Oberon . createProof ( request: createProofRequest)
59+ // Verifier verifies the proof
60+ var verifyProofRequest = Okapi_Security_V1_VerifyOberonProofRequest ( )
61+ verifyProofRequest. data = data
62+ verifyProofRequest. nonce = nonce
63+ verifyProofRequest. pk = key. pk
64+ verifyProofRequest. proof = proof. proof
65+ var result = try Oberon . verifyProof ( request: verifyProofRequest)
66+ XCTAssertTrue ( result. valid)
67+
68+ // Holder blinds the token with a personal pin
69+ let userPin = " 0042 " . data ( using: . utf8) ?? Data ( )
70+ var blindRequest = Okapi_Security_V1_BlindOberonTokenRequest ( )
71+ blindRequest. token = token. token
72+ blindRequest. blinding. append ( userPin)
73+
74+ var userBlindedToken = try Oberon . blindToken ( request: blindRequest)
75+ var proofRequest = Okapi_Security_V1_CreateOberonProofRequest ( )
76+ proofRequest. data = data
77+ proofRequest. nonce = nonce
78+ proofRequest. token = userBlindedToken. token
79+ // Verifier verifies the proof
80+ verifyProofRequest = Okapi_Security_V1_VerifyOberonProofRequest ( )
81+ verifyProofRequest. data = data
82+ verifyProofRequest. nonce = nonce
83+ verifyProofRequest. pk = key. pk
84+ verifyProofRequest. proof = proof. proof
85+ result = try Oberon . verifyProof ( request: verifyProofRequest)
86+ XCTAssertTrue ( result. valid)
87+
88+ // Bad actor creates a proof with incorrect blinding pin
89+ let badPin = " invalid pin " . data ( using: . utf8) ?? Data ( )
90+ proofRequest = Okapi_Security_V1_CreateOberonProofRequest ( )
91+ proofRequest. data = data
92+ proofRequest. nonce = nonce
93+ proofRequest. token = userBlindedToken. token
94+ proofRequest. blinding. append ( badPin)
95+
96+ proof = try Oberon . createProof ( request: proofRequest)
97+ // Verify tries to verify proof, fails
98+ verifyProofRequest = Okapi_Security_V1_VerifyOberonProofRequest ( )
99+ verifyProofRequest. data = data
100+ verifyProofRequest. nonce = nonce
101+ verifyProofRequest. pk = key. pk
102+ verifyProofRequest. proof = proof. proof
103+ result = try Oberon . verifyProof ( request: verifyProofRequest)
104+ XCTAssertFalse ( result. valid, " Bad actor cannot verify " )
105+ }
106+ }
0 commit comments