bool IKeyManagementDriver.LoadKeyBlob(int session, IntPtr pKey, int keyLen, KeyType keyType, KeyAttribute keyAttrib, out int hKey) { bool bRet = false; hKey = -1; try { SessionData ctx = ((SessionDriver)this.Hal.Session).GetSessionCtx(session); CryptokiObjectMgrDriver objMgr = (CryptokiObjectMgrDriver)Hal.CryptokiObjectMgr; byte[] keyData = new byte[keyLen]; Marshal.Copy(pKey, keyData, 0, keyLen); if (keyAttrib == KeyAttribute.Secret) { SecretKey key = new SecretKey(keyLen * 8, keyData); hKey = ctx.ObjectCtx.AddObject(CryptokiObjectType.Key, new KeyData(keyData, key)); bRet = true; } else { switch (keyType) { case KeyType.RSA: RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); rsa.ImportCspBlob(keyData); hKey = ctx.ObjectCtx.AddObject(CryptokiObjectType.Key, new KeyData(rsa.ExportCspBlob(0 != (keyAttrib & KeyAttribute.Private)), rsa)); bRet = true; break; case KeyType.DSA: DSACryptoServiceProvider dsa = new DSACryptoServiceProvider(); dsa.ImportCspBlob(keyData); hKey = ctx.ObjectCtx.AddObject(CryptokiObjectType.Key, new KeyData(dsa.ExportCspBlob(0 != (keyAttrib & KeyAttribute.Private)), dsa)); bRet = true; break; case KeyType.ECDSA: { CngKeyBlobFormat fmt = (0 == (keyAttrib & KeyAttribute.Private)) ? CngKeyBlobFormat.EccPublicBlob : CngKeyBlobFormat.EccPrivateBlob; CngKey key = CngKey.Import(keyData, fmt); ECDsaCng ec = new ECDsaCng(key); hKey = ctx.ObjectCtx.AddObject(CryptokiObjectType.Key, new KeyData(ec.Key.Export(fmt), ec)); bRet = true; } break; case KeyType.DH: { CngKeyBlobFormat fmt = (0 == (keyAttrib & KeyAttribute.Private)) ? CngKeyBlobFormat.EccPublicBlob : CngKeyBlobFormat.EccPrivateBlob; CngKey key = CngKey.Import(keyData, fmt); ECDiffieHellmanCng ecdh = new ECDiffieHellmanCng(key); hKey = ctx.ObjectCtx.AddObject(CryptokiObjectType.Key, new KeyData(ecdh.Key.Export(fmt), ecdh)); bRet = true; } break; } } } catch { return(false); } return(bRet); }
bool IKeyManagementDriver.GenerateKeyPair(int session, int alg, int keySize, out int hPubKey, out int hPrivKey) { bool bRet = false; hPrivKey = -1; hPubKey = -1; try { SessionData ctx = ((SessionDriver)this.Hal.Session).GetSessionCtx(session); CryptokiObjectMgrDriver objMgr = (CryptokiObjectMgrDriver)Hal.CryptokiObjectMgr; switch ((AlgorithmType)alg) { case AlgorithmType.RSA_PKCS_KEY_PAIR_GEN: { RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(keySize); //byte[] data = rsa.ExportCspBlob(true); //Debug.WriteLine(string.Format("bType: 0x{0:X02}", data[0])); //Debug.WriteLine(string.Format("bVer : 0x{0:X02}", data[1])); //Debug.WriteLine(string.Format("Res : 0x{0:X04}", (ushort)((uint)data[2] << 0 | (uint)data[3] << 8))); //Debug.WriteLine(string.Format("AlgID: 0x{0:X08}", (uint)((uint)data[4] << 0 | (uint)data[5] << 8 | (uint)data[6] << 16 | (uint)data[7] << 24))); //Debug.WriteLine("KeyData:"); //for (int q = 0; q < data.Length; q++) //{ // Debug.Write(string.Format("0x{0:X02}, ", data[q])); //} //Debug.WriteLine(""); //RSAParameters parms = rsa.ExportParameters(true); //Debug.WriteLine("Modulus:"); //for (int q = 0; q < parms.Modulus.Length; q++) //{ // Debug.Write(string.Format("0x{0:X02}, ", parms.Modulus[q])); //} //Debug.WriteLine(""); //Debug.WriteLine("PubExponent:"); //for (int q = 0; q < parms.Exponent.Length; q++) //{ // Debug.Write(string.Format("0x{0:X02}, ", parms.Exponent[q])); //} //Debug.WriteLine(""); //Debug.WriteLine("PrivateExponent:"); //for (int q = 0; q < parms.D.Length; q++) //{ // Debug.Write(string.Format("0x{0:X02}, ", parms.D[q])); //} //Debug.WriteLine(""); //Debug.WriteLine("Prime1:"); //for (int q = 0; q < parms.P.Length; q++) //{ // Debug.Write(string.Format("0x{0:X02}, ", parms.P[q])); //} //Debug.WriteLine(""); //Debug.WriteLine("Prime2:"); //for (int q = 0; q < parms.Q.Length; q++) //{ // Debug.Write(string.Format("0x{0:X02}, ", parms.Q[q])); //} //Debug.WriteLine(""); //Debug.WriteLine("Exp1:"); //for (int q = 0; q < parms.DP.Length; q++) //{ // Debug.Write(string.Format("0x{0:X02}, ", parms.DP[q])); //} //Debug.WriteLine(""); //Debug.WriteLine("Exp2:"); //for (int q = 0; q < parms.DQ.Length; q++) //{ // Debug.Write(string.Format("0x{0:X02}, ", parms.DQ[q])); //} //Debug.WriteLine(""); //Debug.WriteLine("Coeff:"); //for (int q = 0; q < parms.InverseQ.Length; q++) //{ // Debug.Write(string.Format("0x{0:X02}, ", parms.InverseQ[q])); //} //Debug.WriteLine(""); hPubKey = ctx.ObjectCtx.AddObject(CryptokiObjectType.Key, new KeyData(rsa.ExportCspBlob(true), rsa)); hPrivKey = hPubKey; bRet = true; } break; case AlgorithmType.DSA_KEY_PAIR_GEN: { DSACryptoServiceProvider dsa = new DSACryptoServiceProvider(keySize); hPubKey = ctx.ObjectCtx.AddObject(CryptokiObjectType.Key, new KeyData(dsa.ExportCspBlob(true), dsa)); hPrivKey = hPubKey; /* * byte[] data = dsa.ExportCspBlob(false); * * Debug.WriteLine(string.Format("bType: 0x{0:X02}", data[0])); * Debug.WriteLine(string.Format("bVer : 0x{0:X02}", data[1])); * Debug.WriteLine(string.Format("Res : 0x{0:X04}", (ushort)((uint)data[2] << 0 | (uint)data[3] << 8))); * Debug.WriteLine(string.Format("AlgID: 0x{0:X08}", (uint)((uint)data[4] << 0 | (uint)data[5] << 8 | (uint)data[6] << 16 | (uint)data[7] << 24))); * * Debug.WriteLine("Prime:"); * for (int q = 0; q < data.Length; q++) * { * Debug.Write(string.Format("0x{0:X02}, ", data[q])); * } * Debug.WriteLine(""); */ /* * DSAParameters parms = dsa.ExportParameters(true); * * Debug.WriteLine("Prime:"); * for (int q = 0; q < parms.P.Length; q++) * { * Debug.Write(string.Format("0x{0:X02}, ", parms.P[q])); * } * Debug.WriteLine(""); * * Debug.WriteLine("SubPrime:"); * for (int q = 0; q < parms.Q.Length; q++) * { * Debug.Write(string.Format("0x{0:X02}, ", parms.Q[q])); * } * Debug.WriteLine(""); * * Debug.WriteLine("Base:"); * for (int q = 0; q < parms.G.Length; q++) * { * Debug.Write(string.Format("0x{0:X02}, ", parms.G[q])); * } * Debug.WriteLine(""); * * Debug.WriteLine("Public:"); * for (int q = 0; q < parms.Y.Length; q++) * { * Debug.Write(string.Format("0x{0:X02}, ", parms.Y[q])); * } * Debug.WriteLine(""); * * Debug.WriteLine("Private:"); * for (int q = 0; q < parms.X.Length; q++) * { * Debug.Write(string.Format("0x{0:X02}, ", parms.X[q])); * } * Debug.WriteLine(""); */ bRet = true; } break; case AlgorithmType.ECDSA_KEY_PAIR_GEN: { ECDsaCng ecdsa = new ECDsaCng(keySize); hPubKey = ctx.ObjectCtx.AddObject(CryptokiObjectType.Key, new KeyData(ecdsa.Key.Export(CngKeyBlobFormat.EccPublicBlob), ecdsa)); hPrivKey = hPubKey; bRet = true; } break; case AlgorithmType.ECDH_KEY_PAIR_GEN: { ECDiffieHellmanCng ecdh = new ECDiffieHellmanCng(keySize); hPubKey = ctx.ObjectCtx.AddObject(CryptokiObjectType.Key, new KeyData(ecdh.Key.Export(CngKeyBlobFormat.EccPublicBlob), ecdh)); hPrivKey = hPubKey; bRet = true; } break; } } catch { return(false); } return(bRet); }