Skip to content

Commit 2ed84ef

Browse files
committed
clean up srp client, still not working
1 parent e04ed02 commit 2ed84ef

11 files changed

Lines changed: 627 additions & 600 deletions

File tree

Xcodes.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Xcodes/AppleAPI/Sources/AppleAPI/Client.swift

Lines changed: 22 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import SRP
44
import Crypto
55
import CommonCrypto
66

7+
78
public class Client {
89
private static let authTypes = ["sa", "hsa", "non-sa", "hsa2"]
910

@@ -14,9 +15,8 @@ public class Client {
1415
public func srpLogin(accountName: String, password: String) -> AnyPublisher<AuthenticationState, Swift.Error> {
1516
var serviceKey: String!
1617

17-
let config = SRPConfiguration<SHA256>(.N2048)
18-
let client = SRPClient(configuration: config)
19-
let clientKeys = client.generateKeys()
18+
let client = SRPClient<SHA256>(username: accountName, password: password)
19+
let a = client.startAuthentication()
2020

2121
return Current.network.dataTask(with: URLRequest.itcServiceKey)
2222
.map(\.data)
@@ -33,13 +33,14 @@ public class Client {
3333
}
3434
.flatMap { (serviceKey, hashcash) -> AnyPublisher<(String, String, ServerSRPInitResponse), Swift.Error> in
3535

36-
return Current.network.dataTask(with: URLRequest.SRPInit(serviceKey: serviceKey, a: clientKeys.private.hex, accountName: accountName))
36+
return Current.network.dataTask(with: URLRequest.SRPInit(serviceKey: serviceKey, a: a.base64EncodedString(), accountName: accountName))
3737
.map(\.data)
3838
.decode(type: ServerSRPInitResponse.self, decoder: JSONDecoder())
3939
.map { return (serviceKey, hashcash, $0) }
4040
.eraseToAnyPublisher()
4141
}
4242
.flatMap { (serviceKey, hashcash, srpInit) -> AnyPublisher<URLSession.DataTaskPublisher.Output, Swift.Error> in
43+
print("SRP INIT REsponse: \(srpInit)")
4344

4445
guard let decodedB = Data(base64Encoded: srpInit.b) else {
4546
return Fail(error: AuthenticationError.srpInvalidPublicKey)
@@ -52,46 +53,29 @@ public class Client {
5253
}
5354

5455
let iterations = srpInit.iteration
55-
let serverPublic = SRPKey([UInt8](decodedB))
5656

57-
guard let encryptedPassword = self.pbkdf2(password: password, saltData: decodedSalt, keyByteCount: 32, prf: CCPseudoRandomAlgorithm(kCCPRFHmacAlgSHA256), rounds: iterations) else {
58-
return Fail(error: AuthenticationError.srpInvalidPublicKey)
59-
.eraseToAnyPublisher()
60-
}
61-
62-
63-
let encryptedPasswordArray = encryptedPassword.hexEncodedString()
64-
65-
print("EncryptedPassword: \(encryptedPasswordArray)")
66-
print("EncryptedPassword: \([UInt8](encryptedPassword))")
6757
do {
6858

69-
// this calculates "S"
70-
let clientSharedSecret = try client.calculateSharedSecret(
71-
encryptedPassword: encryptedPasswordArray,
72-
salt: [UInt8](decodedSalt),
73-
clientKeys: clientKeys,
74-
serverPublicKey: serverPublic
75-
)
76-
print("SharedSecret: \(clientSharedSecret)")
59+
guard let encryptedPassword = self.pbkdf2(password: password, saltData: decodedSalt, keyByteCount: 32, prf: CCPseudoRandomAlgorithm(kCCPRFHmacAlgSHA256), rounds: iterations) else {
60+
return Fail(error: AuthenticationError.srpInvalidPublicKey)
61+
.eraseToAnyPublisher()
62+
}
7763

78-
let m1 = client.calculateClientProof(
79-
username: accountName,
80-
salt: [UInt8](decodedSalt),
81-
clientPublicKey: clientKeys.public,
82-
serverPublicKey: serverPublic,
83-
sharedSecret: clientSharedSecret
84-
)
85-
86-
let m2 = client.serverProof(clientProof: m1, clientKeys: clientKeys, sharedSecret: clientSharedSecret)
87-
64+
// let m1 = try client.processChallenge(salt: decodedSalt, publicKey: decodedB, isEncryptedPassword: true, encryptedPassword: encryptedPassword.hexEncodedString())
65+
let encryptedPasswordString = String(data: encryptedPassword, encoding: .utf8)
66+
let m1 = try client.processChallenge(salt: decodedSalt, publicKey: decodedB, isEncryptedPassword: true, encryptedPassword: encryptedPasswordString)
8867

89-
print("M1: \(Data(m1).base64EncodedString())")
90-
print("M2: \(Data(m2).base64EncodedString())")
68+
guard let m2 = client.HAMK else {
69+
return Fail(error: AuthenticationError.srpInvalidPublicKey)
70+
.eraseToAnyPublisher()
71+
}
9172

92-
return Current.network.dataTask(with: URLRequest.SRPComplete(serviceKey: serviceKey, hashcash: hashcash, accountName: accountName, c: srpInit.c, m1: Data(m1).base64EncodedString(), m2: Data(m2).base64EncodedString()))
93-
.mapError { $0 as Swift.Error }
94-
.eraseToAnyPublisher()
73+
print("m1: \(m1.base64EncodedString())")
74+
print("m2: \(m2.base64EncodedString())")
75+
76+
return Current.network.dataTask(with: URLRequest.SRPComplete(serviceKey: serviceKey, hashcash: hashcash, accountName: accountName, c: srpInit.c, m1: m1.base64EncodedString(), m2: m2.base64EncodedString()))
77+
.mapError { $0 as Swift.Error }
78+
.eraseToAnyPublisher()
9579
} catch {
9680
print("Error: calculateSharedSecret \(error)")
9781
return Fail(error: AuthenticationError.srpInvalidPublicKey)

xcodes-srp/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

xcodes-srp/Package.resolved

Lines changed: 34 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

xcodes-srp/Package.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@ let package = Package(
1616
],
1717
dependencies: [
1818
.package(url: "https://github.com/apple/swift-crypto", from: "1.0.0"),
19-
.package(url: "https://github.com/adam-fowler/big-num", from: "2.0.0"),
19+
.package(url: "https://github.com/attaswift/BigInt.git", from: "5.0.0")
2020
],
2121
targets: [
22-
.target(name: "SRP", dependencies: ["BigNum", "Crypto"]),
22+
.target(name: "SRP", dependencies: ["Crypto", "BigInt"]),
2323
.testTarget(
2424
name: "SRPTests", dependencies: ["SRP"]),
2525
]

0 commit comments

Comments
 (0)