Hacktoberfest 2026 : les issues que les mainteneurs ont marquées pour octobre, ouvertes et accessibles aux débutants. Parcourir les issues Hacktoberfest

C_GetSlotList of opensc-pkcs11 returns inconsistent results on Rutokens depending on args

Ouverte
#3,393 12 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Les mainteneurs répondent en général sous 2 jours

@frankmorgner y travaille déjà.

Depuis le 26/6/2026.

  • #3721 par @frankmorgner — ouverte

Évaluation

Difficulté
4/5
Temps estimé
3-5 jours
Accessibilité débutants
25/100
Type d'issue
Bug
Clarté
Clairement spécifiée
Activité
À l'abandon
Stack technique
c
Domaine
api, security

Piste de recherche

Start by reading the PKCS#11 implementations of C_GetSlotList and C_GetSlotInfo, then reproduce the reported behavior with a Rutoken using the provided program and compare the two debug logs. The issue names no source files or tests. Done means the present-token results are consistent between C_GetSlotList(CK_FALSE, ...) and C_GetSlotList(CK_TRUE, ...), as described in either expected-behavior option.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

opensc version 0.25.1
OS: Ubuntu 24.04.1 LTS

Description

Hi!

I noticed some curious behaviour of opensc-pkcs11 with Rutokens. C_GetSlotList(CK_TRUE, ...) returns empty list of slots, meanwhile C_GetSlotList(CK_FALSE, ...) returns list of with single slot marked as present. Calling C_GetSlotInfo on this slot returns CKR_TOKEN_NOT_RECOGNIZED

How to reproduce

Here is the program I used to check it:

#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>

int main(int, char* argv[]) {
    CK_RV r;

    printf("load lib\n");
    void* h =dlopen(argv[1], RTLD_NOW);
    if (!h)
        return 1;
    
    printf("load funcs\n");
    CK_C_GetFunctionList flf= dlsym(h, "C_GetFunctionList");
    if (!flf)
        return 2;

    printf("get funcs\n");
    CK_FUNCTION_LIST_PTR fl;
    r = flf(&fl);
    if (r != CKR_OK)
        return 3;

    printf("init lib\n");
    r = fl->C_Initialize(NULL_PTR);
    if (r != CKR_OK)
        return 4;

    printf("get slots\n");
    CK_ULONG sls;
    CK_SLOT_ID_PTR sll = NULL_PTR;
    r = fl->C_GetSlotList(CK_FALSE, sll, &sls);
    if (r != CKR_OK)
        return 5;

    sll = malloc(sls*sizeof(CK_SLOT_ID));
    r = fl->C_GetSlotList(CK_FALSE, sll, &sls);
    if (r != CKR_OK)
        return 6;

    if (sls == 0)
        printf("no tokens\n");

    for (CK_ULONG i=0; i != sls; ++i) {
        CK_SLOT_INFO si;
        r = fl->C_GetSlotInfo(sll[i], &si);
        if (si.flags & CKF_TOKEN_PRESENT) {
            printf("slot has token\n");
            CK_TOKEN_INFO ti;
            r = fl->C_GetTokenInfo(sll[i], &ti);
            printf("get info res: %lu\n", r);
        } else {
            printf("slot has no  token\n");
        }
    }

    if (sll) {
        free(sll);
    }

    r = fl->C_Finalize(NULL_PTR);
    dlclose(h);
}

Output:

load lib
load funcs
get funcs
init lib
get slots
slot has token
get info res: 225

If replace it to C_GetSlotList(CK_FALSE, ...) to C_GetSlotList(CK_TRUE, ...) I see no tokens in output

Logs:
C_GetSlotList(CK_FALSE, ...) log: opensc-debug-with-C_GetSlotList-false.txt

C_GetSlotList(CK_TRUE, ...) log: opensc-debug-with-C_GetSlotList-true.txt

This issue connected with this one

Expected behaviour

So, I think a correct way to make showing of present tokens consistent. It's could be achieved two ways:

  1. tokens, marked as present and returned by C_GetSlotList(CK_FALSE, ...), should also be returned by C_GetSlotList(TRUE, ...)
  2. tokens, not returned by C_GetSlotList(TRUE, ...) shouldn't be marked as present by C_GetSlotList(CK_FALSE, ...)
Langage dominant
C
Étoiles
3.1k
Forks
858
Merge moyen
3 j 23 h
PR mergées (30 j)
17

Préparer son environnement

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de OpenSC/OpenSC

Toutes les issues de OpenSC/OpenSC

Issues similaires

Plus d'issues C

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.