public KeyData GetPublicKey(Uri requestUri, string keyName)
        {
            requestUri.ThrowIfNull(nameof(requestUri));
            keyName.ThrowIfNull(nameof(keyName));

            var key       = keyStore.GetActiveKey(keyName);
            var publicKey = key.Key.GetPublicKey();

            publicKey.KeyId     = requestUri.GetLeftPart(UriPartial.Path) + "/" + key.KeyId;
            publicKey.KeyType   = key.KeyType;
            publicKey.Algorithm = key.SupportedAlgorithm;
            PublicKeyCache cache = null;

            if (key.ExpirationTimeInDays.HasValue)
            {
                cache = new PublicKeyCache(
                    DateTime.UtcNow.AddDays(
                        key.ExpirationTimeInDays.Value).ToString("yyyy-MM-ddTHH:mm:ss", sg.CultureInfo.InvariantCulture));
            }

            return(new KeyData(publicKey, cache));
        }
Esempio n. 2
0
        public KeyData GetPublicKey(Uri requestUri, string keyName)
        {
            _logger.LogInformation("get public key : " + keyName);
            //requestUri.ThrowIfNull(nameof(requestUri));
            keyName.ThrowIfNull(nameof(keyName));
            PublicKeyCache cache = null;

            //use ukc to search the key
            byte[] keyNameBytes = Encoding.UTF8.GetBytes(keyName);

            Library.C_Initialize();
            CK_SLOT_ID[]      slots   = Library.C_GetSlotList(true);
            CK_SLOT_ID        slot    = slots[0];
            CK_SESSION_HANDLE session = Library.C_OpenSession(slot);

            Library.C_FindObjectsInit(session, new CK_ATTRIBUTE[]
            {
                new CK_ATTRIBUTE(CK.CKA_TOKEN, true),
                new CK_ATTRIBUTE(CK.CKA_CLASS, CK.CKO_PRIVATE_KEY),
                new CK_ATTRIBUTE(CK.CKA_KEY_TYPE, CK.CKK_RSA),
                new CK_ATTRIBUTE(CK.CKA_ID, keyNameBytes),
                //new CK_ATTRIBUTE(CK.DYCKA_UID , keyUID)
            });

            CK_OBJECT_HANDLE[] foundKeyHandles = Library.C_FindObjects(session, 1);
            Library.C_FindObjectsFinal(session);

            CK_ATTRIBUTE n             = new CK_ATTRIBUTE(CK.CKA_MODULUS);
            CK_ATTRIBUTE e             = new CK_ATTRIBUTE(CK.CKA_PUBLIC_EXPONENT);
            CK_ATTRIBUTE privateKeyUid = new CK_ATTRIBUTE(CK.DYCKA_UID);

            if (foundKeyHandles.Length == 0)
            {
                throw new Exception("key" + keyName + " not found");
            }


            //get public key
            Library.C_GetAttributeValue(session, foundKeyHandles[0], new CK_ATTRIBUTE[]
            {
                n,
                e,
                privateKeyUid
            });

            string nStrBase64 = Convert.ToBase64String((byte[])n.pValue);
            var    KeyId      = Convert.ToString((long)privateKeyUid.pValue, 16);

            //var key = keyStore.GetActiveKey(keyName);
            var publicKey = new PublicKey(nStrBase64, 65537);

            //publicKey.KeyId = requestUri.GetLeftPart(UriPartial.Path) + "/" + KeyId;

            publicKey.KeyId = requestUri.GetLeftPart(UriPartial.Path) + "/" + KeyId;
            string keyUrl = requestUri.GetLeftPart(UriPartial.Path) + "/" + KeyId;

            if (!publicKey.KeyId.Contains("https"))
            {
                publicKey.KeyId = publicKey.KeyId.Replace("http", "https");
            }
            publicKey.KeyType   = "RSA";
            publicKey.Algorithm = "RS256";

            // if(key.ExpirationTimeInDays.HasValue)
            // {
            //     cache = new PublicKeyCache(
            //         DateTime.UtcNow.AddDays(
            //             key.ExpirationTimeInDays.Value).ToString("yyyy-MM-ddTHH:mm:ss", sg.CultureInfo.InvariantCulture));
            // }

            return(new KeyData(publicKey, cache));
        }