No description
  • C++ 94.8%
  • Roff 2.4%
  • Makefile 1.7%
  • C 0.9%
  • Shell 0.2%
Find a file
Benoît Perrin 1abb470819 Fix adept_remove -O placing result in a nested sub-directory
With -O <dir>, the output path was built from the full input path
instead of its base name:

    filename = std::string(inputFile);
    if (outputDir)
        filename = std::string(outputDir) + "/" + filename;

So `adept_remove -O /out /tmp/x/book.epub` wrote the result to
/out/tmp/x/book.epub (createPath() silently creating the intermediate
directories) instead of /out/book.epub.

-O is documented as the directory "were to put result", so only the
input's base name should be appended. acsmdownloader is unaffected
because it derives its output name from the title metadata, not from
the input path.

Reduce the input to its base name before prefixing it with -O.
2026-07-01 11:14:30 +02:00
include Update version to 0.8.9 2026-04-12 19:42:11 +02:00
scripts Update uPDFParser git address 2025-08-25 20:37:52 +02:00
src fix regression in 76cab18667 2026-04-03 14:38:34 +02:00
utils Fix adept_remove -O placing result in a nested sub-directory 2026-07-01 11:14:30 +02:00
.gitignore Update .gitignore 2022-07-03 09:22:06 +02:00
LICENSE Initial commit 2021-07-03 21:57:53 +02:00
Makefile Add darwin support to Makefile 2026-01-25 10:15:35 +01:00
README.md Update README.md 2025-11-17 22:29:35 +01:00

Introduction

libgourou is a free implementation of Adobe's ADEPT protocol used to add DRM on ePub/PDF files. It overcomes the lack of Adobe support for Linux platforms.

Architecture

Like RMSDK, libgourou has a client/server scheme. All platform specific functions (crypto, network...) have to be implemented in a client class (that derives from DRMProcessorClient) while server implements ADEPT protocol. A reference implementation using cURL, OpenSSL and libzip is provided (in utils directory).

Main functions to use from gourou::DRMProcessor are:

  • Get an ePub from an ACSM file : fulfill() and download()
  • Create a new device : createDRMProcessor()
  • Register a new device : signIn() and activateDevice()
  • Remove DRM : removeDRM()
  • Return loaned book : returnLoan()

You can import configuration from (at least):

  • Kobo device : .adept/device.xml, .adept/devicesalt and .adept/activation.xml
  • Bookeen device : .adobe-digital-editions/device.xml, root/devkey.bin and .adobe-digital-editions/activation.xml

Or create a new one. Be careful: there is a limited number of devices that can be created by one account.

ePub are encrypted using a shared key: one account / multiple devices, so you can create and register a device into your computer and read downloaded (and encrypted) ePub file with your eReader configured using the same AdobeID account.

For those who want to remove DRM without adept_remove, you can export your private key and import it within Calibre an its DeDRM plugin.

Dependencies

For libgourou:

externals :

  • libpugixml

internals:

  • uPDFParser

For utils:

  • libcurl
  • openssl
  • libzip
  • libpugixml

External & utils dependencies has to be installed by your package manager (apt for example). Use -dev flavours to get needed headers. Internal libraries are automatically fetched and statically compiled during the first compilation. When you update libgourou's repository, don't forget to update internal libraries with:

make update_lib

Compilation

Use make command

make [CROSS=XXX] [DEBUG=(0*|1)] [STATIC_UTILS=(0*|1)] [BUILD_UTILS=(0|1*)] [BUILD_STATIC=(0*|1)] [BUILD_SHARED=(0|1*)] [all*|clean|ultraclean|build_utils|install|uninstall]

CROSS can define a cross compiler prefix (ie arm-linux-gnueabihf-)

DEBUG can be set to compile in DEBUG mode

BUILD_UTILS to build utils or not

STATIC_UTILS to build utils with static library (libgourou.a) instead of default dynamic one (libgourou.so)

BUILD_STATIC build libgourou.a if 1, nothing if 0, can be combined with BUILD_SHARED

BUILD_SHARED build libgourou.so if 1, nothing if 0, can be combined with BUILD_STATIC

other variables are DESTDIR and PREFIX to handle destination install directory

  • Default value

Utils

First, add libgourou.so to your LD_LIBRARY_PATH

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD

You can optionaly specify your .adept directory

export ADEPT_DIR=/home/XXX

Then, use utils as following:

You can import configuration from your eReader or create a new one with utils/adept_activate:

./utils/adept_activate -u <AdobeID USERNAME>

Then a /home//.config/adept directory is created with all configuration file

To download an ePub/PDF:

./utils/acsmdownloader <ACSM_FILE>

To export your private key (for DeDRM software):

./utils/acsmdownloader --export-private-key [-o adobekey_1.der]

To remove ADEPT DRM:

./utils/adept_remove <encryptedFile>

To list loaned books:

./utils/adept_loan_mgt [-l]

To return a loaned book:

./utils/adept_loan_mgt -r <id>

You can get utils full options description with -h or --help switch

Binary packages

Compiled version (and AppImage) of libgourou and utils are available in Release page

Docker

A docker image (by bcliang) is available at https://github.com/bcliang/docker-libgourou/

Grégory Soutadé

License

libgourou : LGPL v3 or later

utils : BSD

Special thanks

  • Jens for all test samples and utils testing
  • Milian for debug & code
  • Berwyn H for all test samples, feedbacks, patches and kind donation

Donation

https://www.paypal.com/donate/?hosted_button_id=JD3U6XMZCPHKN

Donators

  • Berwyn H
  • bwitt
  • Ismail
  • Radon