Skip to content

Managing containers (libdigidoc lib)

Boriss Melikjan edited this page Sep 9, 2025 · 1 revision

High-level support for signing and parsing containers.

SignedContainer is an immutable class so all modifier methods return a new instance.

Setup libraries in MainActivity onCreate

@Inject
lateinit var librarySetup: LibrarySetup

override fun onCreate(savedInstanceState: Bundle?) {
    super<ComponentActivity>.onCreate(savedInstanceState)
    lifecycleScope.launch {
        LoggingUtil.initialize(
            applicationContext,
            Logger.getLogger(MainActivity::class.java.name),
            isLoggingEnabled,
        )
        fileTypeSetup.initializeApplicationFileTypesAssociation(componentClassName)
        librarySetup.setupLibraries(applicationContext, isLoggingEnabled)
    }
}

Creating a new container

val containerFile = File("path-to-container.asice")
val dataFiles: List<File> = listOf(...)

val container = SignedContainer.openOrCreate(
    context,
    containerFile,
    dataFiles,
    isSivaConfirmed,
    forceFirstDataFileContainer,
)

Opening an existing container

val containerFile = File("path-to-container.asice")
val dataFiles: List<File> = listOf(containerFile)

val container = SignedContainer.openOrCreate(
    context,
    containerFile,
    dataFiles,
    isSivaConfirmed,
    forceFirstDataFileContainer,
)

Working with container data files

val container: SignedContainer =

// returns all data files in the container
val dataFiles = container.getDataFiles()

// check whether container is signed (has any signature)
val isSigned = container.isSigned()

// check whether container is legacy
val isLegacy = container.isLegacy()

// extract data file from the container to a File
val dataFileInterface: DataFileInterface = ...
val dataFileDirectory = File("path/to/data-files/")
val dataFile = container.getDataFile(dataFileInterface, dataFileDirectory)

// add data files to the container
val newDataFiles: List<File> = listOf(...)
val newContainer = SignedContainer.addDataFiles(
    context = context,
    signedContainer = container,
    dataFiles = newDataFiles)

// remove data file from the container
val dataFileInterface: DataFileInterface = ...
val container = container.removeDataFile(dataFileInterface)

Working with container signatures

val container: SignedContainer = ...

// returns all signatures in the container
val signatures = container.getSignatures()

// remove signature from container
val signatureInterface: SignatureInterface = ...
val container = container.removeSignature(signatureInterface)

// add signature by signing it with signing certificate
val container: SignedContainer = ...
val smartToken = Token.create(...)
val signerCert = smartToken.certificate(CertificateType.SIGNING)

val signer = ExternalSigner(signerCert)
signer.setProfile(SIGNATURE_PROFILE_TS)

val dataToSignBytes =
    containerWrapper.prepareSignature(signer, container, signerCert, roleData)

val signatureArray =
    card.calculateSignature(pin2Code, dataToSignBytes, true)

containerWrapper.finalizeSignature(
    signer,
    container,
    signatureArray,
)

Other useful functions

// check whether a file can be opened as a container or could only be added to containers
val file = File("file-to-check.asice")
val isContainer = file.isContainer(context)

// check whether a container is considered legacy and needs to be nested inside a new container to add signatures
val container: SignedContainer = ...
val isLegacy = container.isLegacy()

Clone this wiki locally