Sample code for 30+ languages & platforms
SQL Server

ScMinidriver - Get Smartcard Properties

See more ScMinidriver Examples

Gets information about the smart card currently inserted in the reader (or USB token).

Chilkat SQL Server Downloads

SQL Server
-- Important: See this note about string length limitations for strings returned by sp_OAMethod calls.
--
CREATE PROCEDURE ChilkatSample
AS
BEGIN
    DECLARE @hr int
    -- Important: Do not use nvarchar(max).  See the warning about using nvarchar(max).
    DECLARE @sTmp0 nvarchar(4000)
    DECLARE @success int
    SELECT @success = 0

    -- This example requires the Chilkat API to have been previously unlocked.
    -- See Global Unlock Sample for sample code.

    DECLARE @scmd int
    EXEC @hr = sp_OACreate 'Chilkat.ScMinidriver', @scmd OUT
    IF @hr <> 0
    BEGIN
        PRINT 'Failed to create ActiveX component'
        RETURN
    END

    -- Reader names (smart card readers or USB tokens) can be discovered
    -- via PCSC List Readers or PCSC Find Smart Cards
    DECLARE @readerName nvarchar(4000)
    SELECT @readerName = 'Alcor Micro USB Smart Card Reader 0'
    EXEC sp_OAMethod @scmd, 'AcquireContext', @success OUT, @readerName
    IF @success = 0
      BEGIN
        EXEC sp_OAGetProperty @scmd, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
        EXEC @hr = sp_OADestroy @scmd
        RETURN
      END

    DECLARE @json int
    EXEC @hr = sp_OACreate 'Chilkat.JsonObject', @json OUT

    EXEC sp_OASetProperty @json, 'EmitCompact', 0

    EXEC sp_OAMethod @scmd, 'GetCardProperties', @success OUT, @json
    IF @success = 0
      BEGIN
        EXEC sp_OAGetProperty @scmd, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
        EXEC @hr = sp_OADestroy @scmd
        EXEC @hr = sp_OADestroy @json
        RETURN
      END

    EXEC sp_OAMethod @json, 'Emit', @sTmp0 OUT
    PRINT @sTmp0

    -- Here is sample output:
    -- See below for sample code to parse the JSON.
    -- 
    -- NOTE: Not all smart cards support all properties.
    -- The GetCardProperties method will return information for all properties supported by the card.

    -- {
    --   "bytesAvailable": 74752,
    --   "containersAvailable": 18,
    --   "maxKeyContainers": 20,
    --   "capabilities": {
    --     "fCertificateCompression": false,
    --     "fKeyGen": true
    --   },
    --   "keySizes": {
    --     "minimumBitlen": 2048,
    --     "defaultBitlen": 2048,
    --     "maximumBitlen": 4096,
    --     "incrementalBitlen": 1024
    --   },
    --   "readOnly": false,
    --   "cacheMode": "global",
    --   "supportsWinX509Enrollment": true,
    --   "guid": "1201803d-03e6-772a-3d80-0112e6032a77",
    --   "serial": "e6032a773d800112e6032a77",
    --   "pins": [
    --     "user",
    --     "admin",
    --     "role3",
    --     "role4"
    --   ],
    --   "pin": {
    --     "user": {
    --       "type": "regular",
    --       "purpose": "primaryCard",
    --       "changePermission": [
    --         "user"
    --       ],
    --       "unblockPermission": [
    --         "admin"
    --       ],
    --       "cachePolicy": "normal",
    --       "policyInfo": "00000000",
    --       "flags": "00000000",
    --       "acceptPlainTextPin": true,
    --       "generateSessionPin": false
    --     },
    --     "admin": {
    --       "type": "challenge/response",
    --       "purpose": "administrator",
    --       "changePermission": [
    --         "admin"
    --       ],
    --       "cachePolicy": "normal",
    --       "policyInfo": "00000000",
    --       "flags": "00000000"
    --     },
    --     "role3": {
    --       "type": "regular",
    --       "purpose": "digitalSignature",
    --       "changePermission": [
    --         "role3"
    --       ],
    --       "unblockPermission": [
    --         "role4"
    --       ],
    --       "cachePolicy": "alwaysPrompt",
    --       "policyInfo": "00000000",
    --       "flags": "00000000",
    --       "acceptPlainTextPin": true,
    --       "generateSessionPin": false
    --     },
    --     "role4": {
    --       "type": "regular",
    --       "purpose": "unblockOnly",
    --       "changePermission": [
    --         "role4"
    --       ],
    --       "cachePolicy": "normal",
    --       "policyInfo": "00000000",
    --       "flags": "00000000",
    --       "acceptPlainTextPin": true,
    --       "generateSessionPin": false
    --     }
    --   },
    --   "importSupport": [
    --     "plainText",
    --     "rsaKeyest",
    --     "eccKeyest",
    --     "symmetric"
    --   ],
    --   "algorithms": [
    --     "AES"
    --   ],
    --   "paddingSchemes": [
    --     "block",
    --     "pkcs1",
    --     "pss",
    --     "oaep"
    --   ],
    --   "chainingModes": [
    --     "ChainingModeCBC"
    --   ]
    -- }

    -- Use this online tool to generate parsing code from sample JSON: 
    -- Generate Parsing Code from JSON

    DECLARE @strVal nvarchar(4000)

    DECLARE @bytesAvailable int
    EXEC sp_OAMethod @json, 'IntOf', @bytesAvailable OUT, 'bytesAvailable'
    DECLARE @containersAvailable int
    EXEC sp_OAMethod @json, 'IntOf', @containersAvailable OUT, 'containersAvailable'
    DECLARE @maxKeyContainers int
    EXEC sp_OAMethod @json, 'IntOf', @maxKeyContainers OUT, 'maxKeyContainers'
    DECLARE @capabilitiesFCertificateCompression int
    EXEC sp_OAMethod @json, 'BoolOf', @capabilitiesFCertificateCompression OUT, 'capabilities.fCertificateCompression'
    DECLARE @capabilitiesFKeyGen int
    EXEC sp_OAMethod @json, 'BoolOf', @capabilitiesFKeyGen OUT, 'capabilities.fKeyGen'
    DECLARE @keySizesMinimumBitlen int
    EXEC sp_OAMethod @json, 'IntOf', @keySizesMinimumBitlen OUT, 'keySizes.minimumBitlen'
    DECLARE @keySizesDefaultBitlen int
    EXEC sp_OAMethod @json, 'IntOf', @keySizesDefaultBitlen OUT, 'keySizes.defaultBitlen'
    DECLARE @keySizesMaximumBitlen int
    EXEC sp_OAMethod @json, 'IntOf', @keySizesMaximumBitlen OUT, 'keySizes.maximumBitlen'
    DECLARE @keySizesIncrementalBitlen int
    EXEC sp_OAMethod @json, 'IntOf', @keySizesIncrementalBitlen OUT, 'keySizes.incrementalBitlen'
    DECLARE @readOnly int
    EXEC sp_OAMethod @json, 'BoolOf', @readOnly OUT, 'readOnly'
    DECLARE @cacheMode nvarchar(4000)
    EXEC sp_OAMethod @json, 'StringOf', @cacheMode OUT, 'cacheMode'
    DECLARE @supportsWinX509Enrollment int
    EXEC sp_OAMethod @json, 'BoolOf', @supportsWinX509Enrollment OUT, 'supportsWinX509Enrollment'
    DECLARE @guid nvarchar(4000)
    EXEC sp_OAMethod @json, 'StringOf', @guid OUT, 'guid'
    DECLARE @serial nvarchar(4000)
    EXEC sp_OAMethod @json, 'StringOf', @serial OUT, 'serial'
    DECLARE @pinUserType nvarchar(4000)
    EXEC sp_OAMethod @json, 'StringOf', @pinUserType OUT, 'pin.user.type'
    DECLARE @pinUserPurpose nvarchar(4000)
    EXEC sp_OAMethod @json, 'StringOf', @pinUserPurpose OUT, 'pin.user.purpose'
    DECLARE @pinUserCachePolicy nvarchar(4000)
    EXEC sp_OAMethod @json, 'StringOf', @pinUserCachePolicy OUT, 'pin.user.cachePolicy'
    DECLARE @pinUserPolicyInfo nvarchar(4000)
    EXEC sp_OAMethod @json, 'StringOf', @pinUserPolicyInfo OUT, 'pin.user.policyInfo'
    DECLARE @pinUserFlags nvarchar(4000)
    EXEC sp_OAMethod @json, 'StringOf', @pinUserFlags OUT, 'pin.user.flags'
    DECLARE @pinUserAcceptPlainTextPin int
    EXEC sp_OAMethod @json, 'BoolOf', @pinUserAcceptPlainTextPin OUT, 'pin.user.acceptPlainTextPin'
    DECLARE @pinUserGenerateSessionPin int
    EXEC sp_OAMethod @json, 'BoolOf', @pinUserGenerateSessionPin OUT, 'pin.user.generateSessionPin'
    DECLARE @pinAdminType nvarchar(4000)
    EXEC sp_OAMethod @json, 'StringOf', @pinAdminType OUT, 'pin.admin.type'
    DECLARE @pinAdminPurpose nvarchar(4000)
    EXEC sp_OAMethod @json, 'StringOf', @pinAdminPurpose OUT, 'pin.admin.purpose'
    DECLARE @pinAdminCachePolicy nvarchar(4000)
    EXEC sp_OAMethod @json, 'StringOf', @pinAdminCachePolicy OUT, 'pin.admin.cachePolicy'
    DECLARE @pinAdminPolicyInfo nvarchar(4000)
    EXEC sp_OAMethod @json, 'StringOf', @pinAdminPolicyInfo OUT, 'pin.admin.policyInfo'
    DECLARE @pinAdminFlags nvarchar(4000)
    EXEC sp_OAMethod @json, 'StringOf', @pinAdminFlags OUT, 'pin.admin.flags'
    DECLARE @pinRole3Type nvarchar(4000)
    EXEC sp_OAMethod @json, 'StringOf', @pinRole3Type OUT, 'pin.role3.type'
    DECLARE @pinRole3Purpose nvarchar(4000)
    EXEC sp_OAMethod @json, 'StringOf', @pinRole3Purpose OUT, 'pin.role3.purpose'
    DECLARE @pinRole3CachePolicy nvarchar(4000)
    EXEC sp_OAMethod @json, 'StringOf', @pinRole3CachePolicy OUT, 'pin.role3.cachePolicy'
    DECLARE @pinRole3PolicyInfo nvarchar(4000)
    EXEC sp_OAMethod @json, 'StringOf', @pinRole3PolicyInfo OUT, 'pin.role3.policyInfo'
    DECLARE @pinRole3Flags nvarchar(4000)
    EXEC sp_OAMethod @json, 'StringOf', @pinRole3Flags OUT, 'pin.role3.flags'
    DECLARE @pinRole3AcceptPlainTextPin int
    EXEC sp_OAMethod @json, 'BoolOf', @pinRole3AcceptPlainTextPin OUT, 'pin.role3.acceptPlainTextPin'
    DECLARE @pinRole3GenerateSessionPin int
    EXEC sp_OAMethod @json, 'BoolOf', @pinRole3GenerateSessionPin OUT, 'pin.role3.generateSessionPin'
    DECLARE @pinRole4Type nvarchar(4000)
    EXEC sp_OAMethod @json, 'StringOf', @pinRole4Type OUT, 'pin.role4.type'
    DECLARE @pinRole4Purpose nvarchar(4000)
    EXEC sp_OAMethod @json, 'StringOf', @pinRole4Purpose OUT, 'pin.role4.purpose'
    DECLARE @pinRole4CachePolicy nvarchar(4000)
    EXEC sp_OAMethod @json, 'StringOf', @pinRole4CachePolicy OUT, 'pin.role4.cachePolicy'
    DECLARE @pinRole4PolicyInfo nvarchar(4000)
    EXEC sp_OAMethod @json, 'StringOf', @pinRole4PolicyInfo OUT, 'pin.role4.policyInfo'
    DECLARE @pinRole4Flags nvarchar(4000)
    EXEC sp_OAMethod @json, 'StringOf', @pinRole4Flags OUT, 'pin.role4.flags'
    DECLARE @pinRole4AcceptPlainTextPin int
    EXEC sp_OAMethod @json, 'BoolOf', @pinRole4AcceptPlainTextPin OUT, 'pin.role4.acceptPlainTextPin'
    DECLARE @pinRole4GenerateSessionPin int
    EXEC sp_OAMethod @json, 'BoolOf', @pinRole4GenerateSessionPin OUT, 'pin.role4.generateSessionPin'
    DECLARE @i int
    SELECT @i = 0
    DECLARE @count_i int
    EXEC sp_OAMethod @json, 'SizeOfArray', @count_i OUT, 'pins'
    WHILE @i < @count_i
      BEGIN
        EXEC sp_OASetProperty @json, 'I', @i
        EXEC sp_OAMethod @json, 'StringOf', @strVal OUT, 'pins[i]'
        SELECT @i = @i + 1
      END
    SELECT @i = 0
    EXEC sp_OAMethod @json, 'SizeOfArray', @count_i OUT, 'pin.user.changePermission'
    WHILE @i < @count_i
      BEGIN
        EXEC sp_OASetProperty @json, 'I', @i
        EXEC sp_OAMethod @json, 'StringOf', @strVal OUT, 'pin.user.changePermission[i]'
        SELECT @i = @i + 1
      END
    SELECT @i = 0
    EXEC sp_OAMethod @json, 'SizeOfArray', @count_i OUT, 'pin.user.unblockPermission'
    WHILE @i < @count_i
      BEGIN
        EXEC sp_OASetProperty @json, 'I', @i
        EXEC sp_OAMethod @json, 'StringOf', @strVal OUT, 'pin.user.unblockPermission[i]'
        SELECT @i = @i + 1
      END
    SELECT @i = 0
    EXEC sp_OAMethod @json, 'SizeOfArray', @count_i OUT, 'pin.admin.changePermission'
    WHILE @i < @count_i
      BEGIN
        EXEC sp_OASetProperty @json, 'I', @i
        EXEC sp_OAMethod @json, 'StringOf', @strVal OUT, 'pin.admin.changePermission[i]'
        SELECT @i = @i + 1
      END
    SELECT @i = 0
    EXEC sp_OAMethod @json, 'SizeOfArray', @count_i OUT, 'pin.role3.changePermission'
    WHILE @i < @count_i
      BEGIN
        EXEC sp_OASetProperty @json, 'I', @i
        EXEC sp_OAMethod @json, 'StringOf', @strVal OUT, 'pin.role3.changePermission[i]'
        SELECT @i = @i + 1
      END
    SELECT @i = 0
    EXEC sp_OAMethod @json, 'SizeOfArray', @count_i OUT, 'pin.role3.unblockPermission'
    WHILE @i < @count_i
      BEGIN
        EXEC sp_OASetProperty @json, 'I', @i
        EXEC sp_OAMethod @json, 'StringOf', @strVal OUT, 'pin.role3.unblockPermission[i]'
        SELECT @i = @i + 1
      END
    SELECT @i = 0
    EXEC sp_OAMethod @json, 'SizeOfArray', @count_i OUT, 'pin.role4.changePermission'
    WHILE @i < @count_i
      BEGIN
        EXEC sp_OASetProperty @json, 'I', @i
        EXEC sp_OAMethod @json, 'StringOf', @strVal OUT, 'pin.role4.changePermission[i]'
        SELECT @i = @i + 1
      END
    SELECT @i = 0
    EXEC sp_OAMethod @json, 'SizeOfArray', @count_i OUT, 'importSupport'
    WHILE @i < @count_i
      BEGIN
        EXEC sp_OASetProperty @json, 'I', @i
        EXEC sp_OAMethod @json, 'StringOf', @strVal OUT, 'importSupport[i]'
        SELECT @i = @i + 1
      END
    SELECT @i = 0
    EXEC sp_OAMethod @json, 'SizeOfArray', @count_i OUT, 'algorithms'
    WHILE @i < @count_i
      BEGIN
        EXEC sp_OASetProperty @json, 'I', @i
        EXEC sp_OAMethod @json, 'StringOf', @strVal OUT, 'algorithms[i]'
        SELECT @i = @i + 1
      END
    SELECT @i = 0
    EXEC sp_OAMethod @json, 'SizeOfArray', @count_i OUT, 'paddingSchemes'
    WHILE @i < @count_i
      BEGIN
        EXEC sp_OASetProperty @json, 'I', @i
        EXEC sp_OAMethod @json, 'StringOf', @strVal OUT, 'paddingSchemes[i]'
        SELECT @i = @i + 1
      END
    SELECT @i = 0
    EXEC sp_OAMethod @json, 'SizeOfArray', @count_i OUT, 'chainingModes'
    WHILE @i < @count_i
      BEGIN
        EXEC sp_OASetProperty @json, 'I', @i
        EXEC sp_OAMethod @json, 'StringOf', @strVal OUT, 'chainingModes[i]'
        SELECT @i = @i + 1
      END

    -- Delete the context when finished with the card.
    EXEC sp_OAMethod @scmd, 'DeleteContext', @success OUT
    IF @success = 0
      BEGIN
        EXEC sp_OAGetProperty @scmd, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
      END

    EXEC @hr = sp_OADestroy @scmd
    EXEC @hr = sp_OADestroy @json


END
GO