mirror of
https://github.com/revanced/revanced-patches
synced 2025-02-22 17:41:11 +01:00
66 lines
2.0 KiB
Java
66 lines
2.0 KiB
Java
package fi.vanced.libraries.youtube.ryd;
|
|
|
|
import android.util.Base64;
|
|
import android.util.Log;
|
|
|
|
import java.security.MessageDigest;
|
|
|
|
public class Utils {
|
|
private static final String TAG = "VI - RYD - Utils";
|
|
|
|
public static String solvePuzzle(String challenge, int difficulty) {
|
|
byte[] decodedChallenge = Base64.decode(challenge, Base64.NO_WRAP);
|
|
|
|
byte[] buffer = new byte[20];
|
|
for (int i = 4; i < 20; i++) {
|
|
buffer[i] = decodedChallenge[i - 4];
|
|
}
|
|
|
|
try {
|
|
int maxCount = (int) (Math.pow(2, difficulty + 1) * 5);
|
|
MessageDigest md = MessageDigest.getInstance("SHA-512");
|
|
for (int i = 0; i < maxCount; i++) {
|
|
buffer[0] = (byte)i;
|
|
buffer[1] = (byte)(i >> 8);
|
|
buffer[2] = (byte)(i >> 16);
|
|
buffer[3] = (byte)(i >> 24);
|
|
byte[] messageDigest = md.digest(buffer);
|
|
|
|
if (countLeadingZeroes(messageDigest) >= difficulty) {
|
|
String encode = Base64.encodeToString(new byte[]{buffer[0], buffer[1], buffer[2], buffer[3]}, Base64.NO_WRAP);
|
|
return encode;
|
|
}
|
|
}
|
|
}
|
|
catch (Exception ex) {
|
|
Log.e(TAG, "Failed to solve puzzle", ex);
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
static int countLeadingZeroes(byte[] uInt8View) {
|
|
int zeroes = 0;
|
|
int value = 0;
|
|
for (int i = 0; i < uInt8View.length; i++) {
|
|
value = uInt8View[i] & 0xFF;
|
|
if (value == 0) {
|
|
zeroes += 8;
|
|
} else {
|
|
int count = 1;
|
|
if (value >>> 4 == 0) {
|
|
count += 4;
|
|
value <<= 4;
|
|
}
|
|
if (value >>> 6 == 0) {
|
|
count += 2;
|
|
value <<= 2;
|
|
}
|
|
zeroes += count - (value >>> 7);
|
|
break;
|
|
}
|
|
}
|
|
return zeroes;
|
|
}
|
|
}
|