Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

adobe authentication for rtmp not implemented #1

Closed
mrbemani opened this issue Nov 24, 2015 · 5 comments
Closed

adobe authentication for rtmp not implemented #1

mrbemani opened this issue Nov 24, 2015 · 5 comments
Assignees

Comments

@mrbemani
Copy link

here is my temporary solution:

  • in RTMPConnection.swift add the following to rtmpStatusHandler(notification: NSNotification)
case "NetConnection.Connect.Rejected":
                    if self.user == "" || self.passwd == "" {
                        break
                    }
                    let cc = (data["description"] as! String).componentsSeparatedByString("?")
                    if (cc.count < 2) {
                        reconnect("/?authmod=adobe&user=\(self.user)")
                    } else if (cc.count > 1) {
                        let p = cc[1] as String
                        let params = p.componentsSeparatedByString("&")

                        var salt = "", challenge = "", opaque = ""
                        for i in 0..<params.count {
                            let pa = params[i]
                            let sIdx = pa.startIndex
                            if pa.substringToIndex(sIdx.advancedBy(5)) == "salt=" {
                                salt = pa.substringFromIndex(sIdx.advancedBy(5))
                            } else if pa.substringToIndex(sIdx.advancedBy(10)) == "challenge=" {
                                challenge = pa.substringFromIndex(sIdx.advancedBy(10))
                            } else if pa.substringToIndex(sIdx.advancedBy(7)) == "opaque=" {
                                opaque = pa.substringFromIndex(sIdx.advancedBy(7))
                            }
                        }

                        let newParams = adobe_auth(self.user, password: self.passwd, salt: salt, opaque: opaque, challenge: challenge)
                        print(newParams)
                        reconnect(newParams)
                    }

and then add a user and passwd properties and adobe_auth method as follow:

func adobe_auth(user:String, password:String, salt:String, opaque:String, challenge:String) -> String {
        var hashstr:String = ""
        let challenge2 = String(format: "%08x", random())

        hashstr = rawMD5Base64("\(user)\(salt)\(password)")
        if challenge != "" || opaque != "" {
            if opaque != "" {
                hashstr = "\(hashstr)\(opaque)"
            } else if challenge != "" {
                hashstr = "\(hashstr)\(challenge)"
            }
        }
        hashstr = rawMD5Base64("\(hashstr)\(challenge2)")

        var q = "/?authmod=adobe&user=\(user)&challenge=\(challenge2)&response=\(hashstr)"

        if opaque != "" {
            q = "\(q)&opaque=\(opaque)"
        }


        return q
    }

    private func rawMD5Base64(s:String) -> String {
        let data = s.dataUsingEncoding(NSUTF8StringEncoding)!
        var digest = [UInt8](count:Int(CC_MD5_DIGEST_LENGTH), repeatedValue: 0)
        CC_MD5(data.bytes, CC_LONG(data.length), &digest)
        let ret = NSData(bytes: digest, length: Int(CC_MD5_DIGEST_LENGTH)).base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0))
        return ret
    }

but the last method needs an header file:

#import <CommonCrypto/CommonCrypto.h>

added these two methods for connect with auth and reconnect:

public func connectWithUserAndPasswd(command: String, user: String, passwd: String, arguments: Any?...) {
        if let url:NSURL = NSURL(string: command) {
            self.user = user
            self.passwd = passwd
            orgUri = command // orgUri is an extra member variable
            _uri = command
            self.arguments = arguments
            addEventListener(Event.RTMP_STATUS, selector: "rtmpStatusHandler:")
            socket.connect(url.host!, port: url.port == nil ? RTMPConnection.defaultPort : UInt32(url.port!.intValue))
        }
    }

    public func reconnect(query: String) {
        if let url:NSURL = NSURL(string: orgUri + query) {
            _uri = orgUri + query
            socket.connect(url.host!, port: url.port == nil ? RTMPConnection.defaultPort : UInt32(url.port!.intValue))
        }
    }
@shogo4405
Copy link
Owner

Thank u.
I will implment adobe authn next.

@shogo4405 shogo4405 self-assigned this Nov 29, 2015
@shogo4405
Copy link
Owner

#import CommonCrypto/CommonCrypto.h
So difficult. Swift framework project can't include Bridging Header X)

@mrbemani
Copy link
Author

mrbemani commented Jan 6, 2016

Try CryptoSwift

@shogo4405
Copy link
Owner

implemented
5c8c0a1
i can release soon :)

Thank u

@shogo4405
Copy link
Owner

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants