Skip to content

Commit

Permalink
refactor rtmp and rtsp auth utils
Browse files Browse the repository at this point in the history
  • Loading branch information
pedroSG94 committed Apr 23, 2024
1 parent d427750 commit 62db07c
Show file tree
Hide file tree
Showing 6 changed files with 38 additions and 133 deletions.
14 changes: 14 additions & 0 deletions common/src/main/java/com/pedro/common/Extensions.kt
Expand Up @@ -22,7 +22,10 @@ import android.os.Handler
import android.os.Looper
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import java.io.UnsupportedEncodingException
import java.nio.ByteBuffer
import java.security.MessageDigest
import java.security.NoSuchAlgorithmException
import java.util.concurrent.BlockingQueue
import java.util.concurrent.ExecutorService

Expand Down Expand Up @@ -82,4 +85,15 @@ fun ByteArray.bytesToHex(): String {

fun ExecutorService.secureSubmit(code: () -> Unit) {
try { submit { code() }.get() } catch (ignored: Exception) {}
}

fun String.getMd5Hash(): String {
val md: MessageDigest
try {
md = MessageDigest.getInstance("MD5")
return md.digest(toByteArray()).bytesToHex()
} catch (ignore: NoSuchAlgorithmException) {
} catch (ignore: UnsupportedEncodingException) {
}
return ""
}
8 changes: 8 additions & 0 deletions common/src/test/java/com/pedro/common/ExtensionTest.kt
Expand Up @@ -52,4 +52,12 @@ class ExtensionTest {
val expectedHex = numbersToHex.values.reduce { acc, s -> acc + s }
assertEquals(expectedHex, testBytes.bytesToHex())
}

@Test
fun `GIVEN String WHEN generate hash THEN return a MD5 hash String`() {
val fakeBuffer = "hello world"
val expectedResult = "5eb63bbbe01eeed093cb22bb8f5acdc3"
val md5Hash = fakeBuffer.getMd5Hash()
assertEquals(expectedResult, md5Hash)
}
}
67 changes: 12 additions & 55 deletions rtmp/src/main/java/com/pedro/rtmp/utils/AuthUtil.kt
Expand Up @@ -16,10 +16,8 @@

package com.pedro.rtmp.utils

import com.pedro.common.bytesToHex
import java.io.UnsupportedEncodingException
import com.pedro.common.getMd5Hash
import java.security.MessageDigest
import java.security.NoSuchAlgorithmException
import java.util.Random
import kotlin.io.encoding.Base64
import kotlin.io.encoding.ExperimentalEncodingApi
Expand Down Expand Up @@ -64,47 +62,17 @@ object AuthUtil {
val queryPos = path.indexOf("?")
if (queryPos >= 0) path = path.substring(0, queryPos)
if (!path.contains("/")) path += "/_definst_"
val hash1 = getMd5Hash("$user:$realm:$password")
val hash2 = getMd5Hash("$method:/$path")
val hash3 = getMd5Hash("$hash1:$nonce:$ncHex:$cNonce:$qop:$hash2")
val hash1 = "$user:$realm:$password".getMd5Hash()
val hash2 = "$method:/$path".getMd5Hash()
val hash3 = "$hash1:$nonce:$ncHex:$cNonce:$qop:$hash2".getMd5Hash()
return "?authmod=$authMod&user=$user&nonce=$nonce&cnonce=$cNonce&nc=$ncHex&response=$hash3"
}

fun getSalt(description: String): String {
var salt = ""
val data = description.split("&").toTypedArray()
for (s in data) {
if (s.contains("salt=")) {
salt = s.substring(5)
break
}
}
return salt
}
fun getSalt(description: String): String = findDescriptionValue("salt=", description)

fun getChallenge(description: String): String {
var challenge = ""
val data = description.split("&").toTypedArray()
for (s in data) {
if (s.contains("challenge=")) {
challenge = s.substring(10)
break
}
}
return challenge
}
fun getChallenge(description: String): String = findDescriptionValue("challenge=", description)

fun getOpaque(description: String): String {
var opaque = ""
val data = description.split("&").toTypedArray()
for (s in data) {
if (s.contains("opaque=")) {
opaque = s.substring(7)
break
}
}
return opaque
}
fun getOpaque(description: String): String = findDescriptionValue("opaque=", description)

@OptIn(ExperimentalEncodingApi::class)
fun stringToMd5Base64(s: String): String {
Expand All @@ -120,26 +88,15 @@ object AuthUtil {
/**
* Limelight auth utils
*/
fun getNonce(description: String): String {
var nonce = ""
fun getNonce(description: String): String = findDescriptionValue("nonce=", description)

private fun findDescriptionValue(value: String, description: String): String {
val data = description.split("&").toTypedArray()
for (s in data) {
if (s.contains("nonce=")) {
nonce = s.substring(6)
break
if (s.contains(value)) {
return s.substring(value.length)
}
}
return nonce
}

fun getMd5Hash(buffer: String): String {
val md: MessageDigest
try {
md = MessageDigest.getInstance("MD5")
return md.digest(buffer.toByteArray()).bytesToHex()
} catch (ignore: NoSuchAlgorithmException) {
} catch (ignore: UnsupportedEncodingException) {
}
return ""
}
}
Expand Up @@ -20,14 +20,14 @@ import android.util.Log
import com.pedro.common.AudioCodec
import com.pedro.common.TimeUtils
import com.pedro.common.VideoCodec
import com.pedro.common.getMd5Hash
import com.pedro.rtsp.rtsp.Protocol
import com.pedro.rtsp.rtsp.commands.SdpBody.createAV1Body
import com.pedro.rtsp.rtsp.commands.SdpBody.createAacBody
import com.pedro.rtsp.rtsp.commands.SdpBody.createG711Body
import com.pedro.rtsp.rtsp.commands.SdpBody.createH264Body
import com.pedro.rtsp.rtsp.commands.SdpBody.createH265Body
import com.pedro.rtsp.rtsp.commands.SdpBody.createOpusBody
import com.pedro.rtsp.utils.AuthUtil.getMd5Hash
import com.pedro.rtsp.utils.RtpConstants
import com.pedro.rtsp.utils.encodeToString
import com.pedro.rtsp.utils.getData
Expand Down Expand Up @@ -187,9 +187,9 @@ open class CommandsManager {
Log.i(TAG, "using digest auth")
val realm = matcher.group(1)
val nonce = matcher.group(2)
val hash1 = getMd5Hash("$user:$realm:$password")
val hash2 = getMd5Hash("ANNOUNCE:rtsp://$host:$port$path")
val hash3 = getMd5Hash("$hash1:$nonce:$hash2")
val hash1 = "$user:$realm:$password".getMd5Hash()
val hash2 = "ANNOUNCE:rtsp://$host:$port$path".getMd5Hash()
val hash3 = "$hash1:$nonce:$hash2".getMd5Hash()
"Digest username=\"$user\", realm=\"$realm\", nonce=\"$nonce\", uri=\"rtsp://$host:$port$path\", response=\"$hash3\""
//basic auth
} else {
Expand Down
40 changes: 0 additions & 40 deletions rtsp/src/main/java/com/pedro/rtsp/utils/AuthUtil.kt

This file was deleted.

34 changes: 0 additions & 34 deletions rtsp/src/test/java/com/pedro/rtsp/utils/AuthUtilTest.kt

This file was deleted.

0 comments on commit 62db07c

Please sign in to comment.