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)); }
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)); }