-
-
Save teacupx/9393507ad6250429707f0318b04f1a3b to your computer and use it in GitHub Desktop.
#!/bin/sh -eu | |
# Make sure we have wget or curl | |
available () { | |
command -v "$1" >/dev/null 2>&1 | |
} | |
if available wget; then | |
DL="wget -O-" | |
DL_SL="wget -qO-" | |
elif available curl; then | |
DL="curl -L" | |
DL_SL="curl -s" | |
else | |
echo "Install Wget or cURL" >&2 | |
exit 1 | |
fi | |
# Find a URL to a suitable arm64 ChromeOS recovery image | |
CHROMEOS_URL="$($DL_SL https://dl.google.com/dl/edgedl/chromeos/recovery/recovery.conf | grep -A11 C101PA | sed -n 's/^url=//p')" | |
CHROMEOS_IMG="$(basename "$CHROMEOS_URL" .zip)" | |
if [ -e "$CHROMEOS_IMG" ]; then | |
CHROMEOS_IMG_PATH="./" | |
DEL_IMG=N | |
else | |
CHROMEOS_IMG_PATH="$(mktemp -td ChromeOS-IMG.XXXXXX)" | |
DEL_IMG=Y | |
# Fetch the recovery image (2Gb+ on disk after download) | |
$DL "$CHROMEOS_URL" | zcat > "$CHROMEOS_IMG_PATH/$CHROMEOS_IMG" | |
fi | |
# Note the next free loop device in a variable | |
LOOPD="$(losetup -f)" | |
# If root, we can mount silently (no popup windows after mount) | |
if [ "$USER" = "root" ]; then | |
MNTPNT="$(mktemp -d -t ChromeOS.XXXXXX)" | |
losetup -Pf "$CHROMEOS_IMG_PATH/$CHROMEOS_IMG" | |
mount -o ro "${LOOPD}p3" "$MNTPNT" | |
else | |
# Associate all the partitions on the disk image with loop devices: | |
udisksctl loop-setup -rf "$CHROMEOS_IMG_PATH/$CHROMEOS_IMG" | |
sleep 1 | |
# Mount the third partition of the disk image (if the previous did not do it automatically) | |
if ! lsblk -lo MOUNTPOINT "${LOOPD}p3" | tail -n1 | grep -q \.; then | |
udisksctl mount -b "${LOOPD}p3" | |
fi | |
# Note the mount point in a variable | |
MNTPNT="$(lsblk -lo MOUNTPOINT "${LOOPD}p3" | tail -n1)" | |
fi | |
# Extract the libs out and copy them to a compressed tar archive | |
ARCHIVE_NAME="widevine-flash-$(date '+%Y%m%d')_arm64.tgz" | |
echo "Extracting and compressing files" | |
tar -C"$MNTPNT" -caf "$ARCHIVE_NAME" opt/google/chrome/libwidevinecdm.so opt/google/chrome/pepper/libpepflashplayer.so --xform 's/pepper/PepperFlash/' --format ustar | |
echo "Created: $ARCHIVE_NAME" | |
# Cleanup | |
if [ "$USER" = "root" ]; then | |
umount "$MNTPNT" | |
losetup -d "$LOOPD" | |
rmdir "$MNTPNT" | |
else | |
ALLMNTS="$(lsblk -lo NAME,MOUNTPOINT "$LOOPD" | sed -n '/\//s/^\(loop[0-9]\+p[0-9]\+\).*/\1/p')" | |
echo "$ALLMNTS" | xargs -I{} -n1 udisksctl unmount -b /dev/{} | |
if [ "$LOOPD" != "$(losetup -f)" ]; then | |
udisksctl loop-delete -b "$LOOPD" | |
fi | |
fi | |
if [ "$DEL_IMG" = "N" ] || [ "${1:-EMPTY}" = "-k" ]; then | |
: | |
else | |
rm "$CHROMEOS_IMG_PATH/$CHROMEOS_IMG" | |
rmdir -v "$CHROMEOS_IMG_PATH" | |
fi | |
# Inform the user how to proceed | |
cat <<EOF | |
To install the contents of these files on an ARM64 device, copy the tar archive over to the target machine and issue the following: | |
sudo tar -C/ -xf $ARCHIVE_NAME | |
EOF |
#!/bin/sh -eu | |
# Make sure we have wget or curl | |
available () { | |
command -v "$1" >/dev/null 2>&1 | |
} | |
if available wget; then | |
DL="wget -O-" | |
DL_SL="wget -qO-" | |
elif available curl; then | |
DL="curl -L" | |
DL_SL="curl -s" | |
else | |
echo "Install Wget or cURL" >&2 | |
exit 1 | |
fi | |
# Find a URL to a suitable armhf ChromeOS recovery image | |
CHROMEOS_URL="$($DL_SL https://dl.google.com/dl/edgedl/chromeos/recovery/recovery.conf | grep -A11 CB5-312T | sed -n 's/^url=//p')" | |
CHROMEOS_IMG="$(basename "$CHROMEOS_URL" .zip)" | |
if [ -e "$CHROMEOS_IMG" ]; then | |
CHROMEOS_IMG_PATH="./" | |
DEL_IMG=N | |
else | |
CHROMEOS_IMG_PATH="$(mktemp -td ChromeOS-IMG.XXXXXX)" | |
DEL_IMG=Y | |
# Fetch the recovery image (2Gb+ on disk after download) | |
$DL "$CHROMEOS_URL" | zcat > "$CHROMEOS_IMG_PATH/$CHROMEOS_IMG" | |
fi | |
# Note the next free loop device in a variable | |
LOOPD="$(losetup -f)" | |
# If root, we can mount silently (no popup windows after mount) | |
if [ "$USER" = "root" ]; then | |
MNTPNT="$(mktemp -d -t ChromeOS.XXXXXX)" | |
losetup -Pf "$CHROMEOS_IMG_PATH/$CHROMEOS_IMG" | |
mount -o ro "${LOOPD}p3" "$MNTPNT" | |
else | |
# Associate all the partitions on the disk image with loop devices: | |
udisksctl loop-setup -rf "$CHROMEOS_IMG_PATH/$CHROMEOS_IMG" | |
sleep 1 | |
# Mount the third partition of the disk image (if the previous did not do it automatically) | |
if ! lsblk -lo MOUNTPOINT "${LOOPD}p3" | tail -n1 | grep -q \.; then | |
udisksctl mount -b "${LOOPD}p3" | |
fi | |
# Note the mount point in a variable | |
MNTPNT="$(lsblk -lo MOUNTPOINT "${LOOPD}p3" | tail -n1)" | |
fi | |
# Extract the libs out and copy them to a compressed tar archive | |
ARCHIVE_NAME="widevine-flash-$(date '+%Y%m%d')_armhf.tgz" | |
echo "Extracting and compressing files" | |
tar -C"$MNTPNT" -caf "$ARCHIVE_NAME" opt/google/chrome/libwidevinecdm.so opt/google/chrome/pepper/libpepflashplayer.so --xform 's/pepper/PepperFlash/' --format ustar | |
echo "Created: $ARCHIVE_NAME" | |
# Cleanup | |
if [ "$USER" = "root" ]; then | |
umount "$MNTPNT" | |
losetup -d "$LOOPD" | |
rmdir "$MNTPNT" | |
else | |
ALLMNTS="$(lsblk -lo NAME,MOUNTPOINT "$LOOPD" | sed -n '/\//s/^\(loop[0-9]\+p[0-9]\+\).*/\1/p')" | |
echo "$ALLMNTS" | xargs -I{} -n1 udisksctl unmount -b /dev/{} | |
if [ "$LOOPD" != "$(losetup -f)" ]; then | |
udisksctl loop-delete -b "$LOOPD" | |
fi | |
fi | |
if [ "$DEL_IMG" = "N" ] || [ "${1:-EMPTY}" = "-k" ]; then | |
: | |
else | |
rm "$CHROMEOS_IMG_PATH/$CHROMEOS_IMG" | |
rmdir -v "$CHROMEOS_IMG_PATH" | |
fi | |
# Inform the user how to proceed | |
cat <<EOF | |
To install the contents of these files on an ARMhf device, copy the tar archive over to the target machine and issue the following: | |
sudo tar -C/ -xf $ARCHIVE_NAME | |
EOF |
Google is finally working on ARM64 widevine! https://chromium.googlesource.com/chromium/src.git/+/2868ab1359c64c5e063f259d46bd655bd8ad8bf2
Do you have a link to the CDM file? https://dl.google.com/widevine-cdm/4.10.2449.0-linux-arm64.zip
is still 404.
Do you have a link to the CDM file?
https://dl.google.com/widevine-cdm/4.10.2449.0-linux-arm64.zip
is still 404.
No, and I don't think it's public yet. The latest ChromeOS images that I could find (v101) still had arm32 userspace and widevine.
We'll have to keep our eyes open for an image-drop.
Where should we look for this? I’m using a PineBook Pro (aarch64) that doesn’t officially support Widevine. I am not above using a reverse engineered Widevine either.
Any update on this?
ChromeOS ARM64 userspace has hit the beta channel for some boards
https://groups.google.com/a/chromium.org/g/chromium-os-dev/c/GdZ0mebutXw
I am posting this here for greater visibility. If anyone has a trogdor
based chromebook, the beta for chromeOS should be using an ARM64 userspace RIGHT NOW.
Recovery images are not available for this and probably won't be for a few more months until it hits stable. If anyone here sees this and has a trogdor
based chromebook please use the beta channel and check for an arm64
widevine module.
trogdor
may not be the only device with ARM64 userspace on the beta. cherry
, corsola
, jacuzzi
, and kevin
also have ARM64 userspace preparred in the CI but its not be confirmed whether or not these devices are using ARM64 userspace now or not.
ChromeOS ARM64 userspace has hit the beta channel for some boards https://groups.google.com/a/chromium.org/g/chromium-os-dev/c/GdZ0mebutXw
I am posting this here for greater visibility. If anyone has a
trogdor
based chromebook, the beta for chromeOS should be using an ARM64 userspace RIGHT NOW.Recovery images are not available for this and probably won't be for a few more months until it hits stable. If anyone here sees this and has a
trogdor
based chromebook please use the beta channel and check for anarm64
widevine module.
trogdor
may not be the only device with ARM64 userspace on the beta.cherry
,corsola
,jacuzzi
, andkevin
also have ARM64 userspace preparred in the CI but its not be confirmed whether or not these devices are using ARM64 userspace now or not.
Good one! I checked the trogdor
boards and picked a random one from recovery.json, the Libera-Merdeka Chromebook C100/C110/C120/C150
with hwidmatch=^PAZQUEL-HGNV .*
. I found the ID of this device in this list: 9023C063-08D6-4A4F-908C-BCF97DE8BA69
. Now we can make a request to the Omaha update service to get the latest dev-channel image:
$ curl https://tools.google.com/service/update2 -d '<?xml version="1.0" encoding="UTF-8"?>
<request protocol="3.0" ismachine="1">
<app appid="{9023C063-08D6-4A4F-908C-BCF97DE8BA69}" track="dev-channel" board="trogdor-signed-mp-v7keys" hardware_class="PAZQUEL-OPNA " delta_okay="false">
<updatecheck/>
</app>
</request>'
<?xml version="1.0" encoding="UTF-8"?><response protocol="3.0" server="prod"><daystart elapsed_days="5883" elapsed_seconds="7637"/><app appid="{9023C063-08D6-4A4F-908C-BCF97DE8BA69}" cohort="1:4h:" cohortname="trogdor_pazquel_dev" status="ok"><updatecheck _eol_date="22067" _firmware_version="1.1" _firmware_version_0="1.1" _firmware_version_1="1.1" _firmware_version_2="1.1" _firmware_version_3="1.1" _firmware_version_4="1.1" _kernel_version="1.1" _kernel_version_0="1.1" _kernel_version_1="1.1" _kernel_version_2="1.1" _kernel_version_3="1.1" _kernel_version_4="1.1" status="ok"><urls><url codebase="http://edgedl.me.gvt1.com/edgedl/chromeos/trogdor/15329.8.0/dev-channel/"/><url codebase="http://dl.google.com/chromeos/trogdor/15329.8.0/dev-channel/"/><url codebase="https://edgedl.me.gvt1.com/edgedl/chromeos/trogdor/15329.8.0/dev-channel/"/><url codebase="https://dl.google.com/chromeos/trogdor/15329.8.0/dev-channel/"/></urls><manifest version="15329.8.0"><actions><action event="install" run="chromeos_15329.8.0_trogdor_dev-channel_full_mp-v7.bin-gyzwiyjsgrstofwmrqotalztdgqyfxjj.signed"/><action ChromeOSVersion="15329.8.0" ChromeVersion="111.0.5563.8" IsDeltaPayload="false" MaxDaysToScatter="14" MetadataSignatureRsa="RJCWBhCiroW0+vTuI7j8/p8mjoOd3hDf8deDDPWbzSMNZGSQywHQbAJ9vPsnUtNr85RgSv+URQcrKznhY+J+GYQ8qGlSk42yRZ/Br7G4R+7cfS6WgpVart8E+Sv6GB3T/OQvX16jXsqLUbJ1CQvK76G/CFkfLT5vueRInTxFDUZJNZHJgmSX47EjL2hmRV/0kholGvt+FKvcO91GgIAecQxb9SBg7/Bc/qyPvTpqyhwu/KVKvozMrTFYjWpWvWRsTaiaSfwGkegc5cw5J1NdK9bTWMnnLHE+pjLiSF6G/EiIxX/lJlsP54jDwhwvg5rcW97R5GcO5ObCayrC8oJWxw==" MetadataSize="66328" event="postinstall" sha256="H3k+NT3BMvhSEJHfdY6VI7q1lrQEwjHEexoY8AcUxdM="/></actions><packages><package fp="3.1f793e353dc132f8521091df758e9523bab596b404c231c47b1a18f00714c5d3" hash_sha256="1f793e353dc132f8521091df758e9523bab596b404c231c47b1a18f00714c5d3" name="chromeos_15329.8.0_trogdor_dev-channel_full_mp-v7.bin-gyzwiyjsgrstofwmrqotalztdgqyfxjj.signed" required="true" size="1273013509"/></packages></manifest></updatecheck></app></response>%
So the resulting image is: http://edgedl.me.gvt1.com/edgedl/chromeos/trogdor/15329.8.0/dev-channel/chromeos_15329.8.0_trogdor_dev-channel_full_mp-v7.bin-gyzwiyjsgrstofwmrqotalztdgqyfxjj.signed
I don't have time to figure out how to extract the contents of this file, but that should be possible. The file format is described here: https://chromium.googlesource.com/aosp/platform/system/update_engine/+/HEAD/#update-payload-file-specification
@Niek lucky for use someone else has already written a tool to extract these payloads, I used https://github.com/tobyxdd/android-ota-payload-extractor
https://github.com/theofficialgman/testing/releases/download/gmans-releases/WidevineCdm.tar.gz
I can't seem to get it working though on chromium
unforuntatly it working with nothing but chromeOS right now
firstly you have this problem as described here: https://thebrokenrail.com/2022/12/31/xfinity-stream-on-linux.html#how-do-i-actually-do-this you have to patch and rebuid your system GLIBC in order to even allow the library to load (no small feat)
and then you have the problem that since arm64 widevine doesn't normally exist for linux, browsers (all of that I have found except for rpm fusion chromium-freeworld) have widevine loading disabled and don't even attempt to load it.
At this point I wonder if it'd be easier to patch the CDM itself
Or just create some sort of shim that does the same thing
Like, it might be easier to just defeat the DRM altogether.
Interesting resource on how glibc was patched in PiOS: raspberrypi/Raspberry-Pi-OS-64bit#11 (comment)
Thanks for the extracted tarball, @theofficialgman! Seems like the URL will be: https://dl.google.com/widevine-cdm/4.10.2557.0-cros-arm64.zip (404 at the time of writing).
When trying to load the library I get a symbol lookup error undefined symbol: __aarch64_ldadd4_acq_rel
on Ubuntu 22.04. On Ubuntu 22.10 I get the DT_RELR without GLIBC_ABI_DT_RELR dependency
error mentioned before. Instead of patching glibc, this could probably be resolved with a small LD_PRELOADed library. Ideally, the ChromeOS toolchain will update to a newer glibc version so this error won't happen in future builds.
I've requested assistance from RPi developers over on this github repo: raspberrypi/Raspberry-Pi-OS-64bit#248
Thanks for the extracted tarball, @theofficialgman! Seems like the URL will be: https://dl.google.com/widevine-cdm/4.10.2557.0-cros-arm64.zip (404 at the time of writing).
I have never seen any other chromeos (cros
) links there. only windows and linux (win
x64 and arm64, and linux
x64)
Thank You @teacupx @theofficialgman and all the guys involved in this thread ❤️ .
I was successfully able to run widewine needed playback on Kodi 19.4 on Arm64 with some modification to Input Stream Helper Plugin using the libwidevinecdm.so
aarch64 version.
Widewine CDM on Kodi for Arm64 is a thing now.
Thanks to all of you again <3
Google is finally working on ARM64 widevine!
https://chromium.googlesource.com/chromium/src.git/+/2868ab1359c64c5e063f259d46bd655bd8ad8bf2