@@ -4,6 +4,7 @@ import SRP
44import Crypto
55import CommonCrypto
66
7+
78public 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)
0 commit comments