コード例 #1
0
ファイル: Keys.cs プロジェクト: leeholder/Netduino_SDK
        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);
        }
コード例 #2
0
ファイル: Keys.cs プロジェクト: leeholder/Netduino_SDK
        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);
        }