• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

LudovicRousseau / PyKCS11 / 16367380199

18 Jul 2025 09:31AM UTC coverage: 93.474% (+5.9%) from 87.592%
16367380199

push

github

LudovicRousseau
IsNum(): CKA_HW_FEATURE_TYPE is also a numeric value

Thanks to Ivan Wallis for the bug report
"Venafi PKCS#11 Library fails with Unkown PKCS#11 type () during findObjects #140"
Closes: https://github.com/LudovicRousseau/PyKCS11/issues/140

5529 of 5915 relevant lines covered (93.47%)

0.93 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

83.33
/test/test_LowLevel.py
1
# pylint: disable=missing-module-docstring
2
# pylint: disable=missing-class-docstring
3
# pylint: disable=missing-function-docstring
4

5
import os
1✔
6
import platform
1✔
7
import unittest
1✔
8

9
import PyKCS11.LowLevel
1✔
10
from PyKCS11 import ckbytelist
1✔
11

12

13
class TestUtil(unittest.TestCase):
1✔
14
    def test_LowLevel(self):
1✔
15
        a = PyKCS11.LowLevel.CPKCS11Lib()
1✔
16
        self.assertIsNotNone(a)
1✔
17

18
        # File not found
19
        self.assertEqual(a.Load("NoFile"), -1)
1✔
20

21
        # C_GetFunctionList() not found
22
        if platform.system() == "Linux":
1✔
23
            # GNU/Linux
24
            lib = "libc.so.6"
1✔
25
        elif platform.system() == "Darwin":
×
26
            # macOS
27
            lib = "/usr/lib/libSystem.B.dylib"
×
28
        else:
29
            # Windows
30
            lib = "WinSCard.dll"
×
31
        self.assertEqual(a.Load(lib), -4)
1✔
32

33
        info = PyKCS11.LowLevel.CK_INFO()
1✔
34
        self.assertIsNotNone(info)
1✔
35

36
        slotInfo = PyKCS11.LowLevel.CK_SLOT_INFO()
1✔
37
        self.assertIsNotNone(slotInfo)
1✔
38

39
        lib = os.getenv("PYKCS11LIB")
1✔
40
        if lib is None:
1✔
41
            raise Exception("Define PYKCS11LIB")
×
42

43
        session = PyKCS11.LowLevel.CK_SESSION_HANDLE()
1✔
44
        self.assertIsNotNone(session)
1✔
45

46
        sessionInfo = PyKCS11.LowLevel.CK_SESSION_INFO()
1✔
47
        self.assertIsNotNone(sessionInfo)
1✔
48

49
        tokenInfo = PyKCS11.LowLevel.CK_TOKEN_INFO()
1✔
50
        self.assertIsNotNone(tokenInfo)
1✔
51

52
        slotList = PyKCS11.LowLevel.ckulonglist()
1✔
53
        self.assertIsNotNone(slotList)
1✔
54

55
        longList = PyKCS11.LowLevel.ckulonglist(1)
1✔
56
        longList[0] = 42
1✔
57
        self.assertEqual(longList[0], 42)
1✔
58
        longList[0] = 0x80000000
1✔
59
        self.assertEqual(longList[0], 2147483648)
1✔
60
        longList[0] = 0xFFFFFFFF
1✔
61
        self.assertEqual(longList[0], 4294967295)
1✔
62
        # negative numbers are not allowed
63
        with self.assertRaises(TypeError):
1✔
64
            longList[0] = -1
1✔
65

66
        a.Load(lib)
1✔
67

68
        self.assertEqual(a.C_GetInfo(info), PyKCS11.LowLevel.CKR_OK)
1✔
69
        manufacturerID = info.GetManufacturerID()
1✔
70
        self.assertEqual(manufacturerID, "SoftHSM".ljust(32))
1✔
71
        del info
1✔
72

73
        a.C_GetSlotList(0, slotList)
1✔
74
        slot = slotList[0]
1✔
75

76
        self.assertEqual(a.C_GetSlotInfo(slot, slotInfo), PyKCS11.LowLevel.CKR_OK)
1✔
77

78
        self.assertEqual(
1✔
79
            a.C_OpenSession(
80
                slot,
81
                PyKCS11.LowLevel.CKF_SERIAL_SESSION | PyKCS11.LowLevel.CKF_RW_SESSION,
82
                session,
83
            ),
84
            PyKCS11.LowLevel.CKR_OK,
85
        )
86
        self.assertEqual(
1✔
87
            a.C_GetSessionInfo(session, sessionInfo), PyKCS11.LowLevel.CKR_OK
88
        )
89

90
        self.assertEqual(a.C_GetTokenInfo(slot, tokenInfo), PyKCS11.LowLevel.CKR_OK)
1✔
91
        label = tokenInfo.GetLabel()
1✔
92
        manufacturerID = tokenInfo.GetManufacturerID()
1✔
93
        flags = tokenInfo.flags
1✔
94
        model = tokenInfo.GetModel()
1✔
95

96
        pin = ckbytelist("1234")
1✔
97
        self.assertEqual(
1✔
98
            a.C_Login(session, PyKCS11.LowLevel.CKU_USER, pin), PyKCS11.LowLevel.CKR_OK
99
        )
100
        self.assertEqual(a.C_Logout(session), PyKCS11.LowLevel.CKR_OK)
1✔
101
        self.assertEqual(a.C_CloseSession(session), PyKCS11.LowLevel.CKR_OK)
1✔
102

103
        self.assertEqual(
1✔
104
            a.C_OpenSession(slotList[0], PyKCS11.LowLevel.CKF_SERIAL_SESSION, session),
105
            PyKCS11.LowLevel.CKR_OK,
106
        )
107
        self.assertEqual(
1✔
108
            a.C_Login(session, PyKCS11.LowLevel.CKU_USER, pin), PyKCS11.LowLevel.CKR_OK
109
        )
110

111
        SearchResult = PyKCS11.LowLevel.ckulonglist(10)
1✔
112
        SearchTemplate = PyKCS11.LowLevel.ckattrlist(2)
1✔
113
        SearchTemplate[0].SetNum(
1✔
114
            PyKCS11.LowLevel.CKA_CLASS, PyKCS11.LowLevel.CKO_CERTIFICATE
115
        )
116
        SearchTemplate[1].SetBool(PyKCS11.LowLevel.CKA_TOKEN, True)
1✔
117

118
        self.assertEqual(
1✔
119
            a.C_FindObjectsInit(session, SearchTemplate), PyKCS11.LowLevel.CKR_OK
120
        )
121
        self.assertEqual(
1✔
122
            a.C_FindObjects(session, SearchResult), PyKCS11.LowLevel.CKR_OK
123
        )
124
        self.assertEqual(a.C_FindObjectsFinal(session), PyKCS11.LowLevel.CKR_OK)
1✔
125

126
        for x in SearchResult:
1✔
127
            print("object: " + hex(x.value()))
×
128
            valTemplate = PyKCS11.LowLevel.ckattrlist(2)
×
129
            valTemplate[0].SetType(PyKCS11.LowLevel.CKA_LABEL)
×
130
            # valTemplate[0].Reserve(128)
131
            valTemplate[1].SetType(PyKCS11.LowLevel.CKA_CLASS)
×
132
            # valTemplate[1].Reserve(4)
133
            print(
×
134
                "C_GetAttributeValue(): "
135
                + hex(a.C_GetAttributeValue(session, x, valTemplate))
136
            )
137
            print(
×
138
                "CKA_LABEL Len: ",
139
                valTemplate[0].GetLen(),
140
                " CKA_CLASS Len: ",
141
                valTemplate[1].GetLen(),
142
            )
143
            print(
×
144
                "C_GetAttributeValue(): "
145
                + hex(a.C_GetAttributeValue(session, x, valTemplate))
146
            )
147
            print("\tCKO_CERTIFICATE: " + valTemplate[0].GetString())
×
148
            print("\tCKA_TOKEN: " + str(valTemplate[1].GetNum()))
×
149

150
        self.assertEqual(a.C_Logout(session), PyKCS11.LowLevel.CKR_OK)
1✔
151
        self.assertEqual(a.C_CloseSession(session), PyKCS11.LowLevel.CKR_OK)
1✔
152
        self.assertEqual(a.C_Finalize(), PyKCS11.LowLevel.CKR_OK)
1✔
153
        a.Unload()
1✔
154

155

156
if __name__ == "__main__":
1✔
157
    unittest.main()
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc