2017-06-07 14 views
1

現在、Ncryptoki C#サンプルプロジェクトを使用してHSMが動作しているかどうかをテストしています。私はすでにスロットとトークンをセットアップして初期化しました。サンプルコードを実行すると、常に誤ったPINが表示されます。私はパスワード "1111"を入力するためにPINpadを使用して、どんな助けも本当に感謝します。PINcadを使用してNcryptokiのパスワードを入力する方法

using System; 
using System.Collections.Generic; 
using System.Collections; 
using System.Text; 
using Cryptware.NCryptoki; 

namespace USCToolkit.NCryptokiTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
     // Creates a Cryptoki object related to the specific PKCS#11 native library 
     //Cryptoki cryptoki = new Cryptoki("smaoscki.dll"); 
     Cryptoki cryptoki = new Cryptoki(@"C:\Program Files\SafeNet\LunaClient\cryptoki.dll"); 

     cryptoki.Initialize(); 

     // Prints all information relating to the native library 
     CryptokiInfo info = cryptoki.Info; 
     Console.WriteLine(info.Version);  
     Console.WriteLine(info.ManufacturerID); 
     Console.WriteLine(info.LibDescription); 

     // Reads the set of slots containing a token 
     SlotList slots = cryptoki.Slots; 
     if(slots.Count == 0) 
     { 
      Console.WriteLine("No slot available"); 
      return; 
     } 

     // Gets the first slot available 
     Slot slot = slots[0]; 

     // Prints all information relating to the slot 
     SlotInfo sinfo = slot.Info; 
     Console.WriteLine(sinfo.Description); 
     Console.WriteLine(sinfo.ManufacturerID); 
     /// 
     Console.WriteLine("flags: "+sinfo.Flags); 

     if (!slot.IsTokenPresent) 
     { 
      Console.WriteLine("No token inserted in the slot: " + slots[0].Info.Description); 
      return; 
     } 

     // Gets the first token available 
     Token token = slot.Token; 


     // Prints all information relating to the token 
     TokenInfo tinfo = token.Info; 
     Console.WriteLine(tinfo.Label); 
     Console.WriteLine(tinfo.ManufacturerID); 
     Console.WriteLine(tinfo.Model); 
     Console.WriteLine(tinfo.SerialNumber); 
     Console.WriteLine(tinfo.HardwareVersion); 





     // Opens a read/write serial session 
     Session session = 
      token.OpenSession(Session.CKF_SERIAL_SESSION | Session.CKF_RW_SESSION, 
           null, 
           null); 

     ///// 
     //PIN pin = new PIN(); 
     ///// 
     // Executes the login passing the user PIN 
     int nRes = session.Login(Session.CKU_USER,"1111"); 
     if (nRes != 0) 
     { 
      Console.WriteLine("Wrong PIN"); 
      return; 
     } 

     Console.WriteLine("Logged in:" + session.IsLoggedIn); 

     // Searchs for an RSA private key object 
     // Sets the template with its attributes 
     CryptokiCollection template = new CryptokiCollection(); 
     template.Add(new ObjectAttribute(ObjectAttribute.CKA_CLASS, CryptokiObject.CKO_PRIVATE_KEY)); 
     template.Add(new ObjectAttribute(ObjectAttribute.CKA_KEY_TYPE, Key.CKK_RSA)); 
     template.Add(new ObjectAttribute(ObjectAttribute.CKA_LABEL, "Ugo's new Key")); 

     // Launchs the search specifying the template just created 
     CryptokiCollection objects = session.Objects.Find(template, 10); 

     foreach (Object obj in objects) 
     { 
      Console.WriteLine(((PrivateKey)obj).Label); 
     } 

     for (int i = 0; i < objects.Count; i++) 
     { 
      Console.WriteLine(((PrivateKey)objects[i]).Label); 
     } 

     RSAPrivateKey privateKey; 
     RSAPublicKey publicKey; 

     // If the private key is not found generates the key pair 
     if(objects.Count == 0) 
     { 
      CryptokiCollection templatePub = new CryptokiCollection(); 
      templatePub.Add(new ObjectAttribute(ObjectAttribute.CKA_CLASS, CryptokiObject.CKO_PUBLIC_KEY)); 
      templatePub.Add(new ObjectAttribute(ObjectAttribute.CKA_TOKEN, true)); 
      templatePub.Add(new ObjectAttribute(ObjectAttribute.CKA_PRIVATE, true)); 
      templatePub.Add(new ObjectAttribute(ObjectAttribute.CKA_LABEL, "Ugo's new Key")); 
      templatePub.Add(new ObjectAttribute(ObjectAttribute.CKA_ID, "1")); 
      templatePub.Add(new ObjectAttribute(ObjectAttribute.CKA_MODULUS_BITS, 1024)); 

      CryptokiCollection templatePri = new CryptokiCollection(); 
      templatePri.Add(new ObjectAttribute(ObjectAttribute.CKA_CLASS, CryptokiObject.CKO_PRIVATE_KEY)); 
      templatePri.Add(new ObjectAttribute(ObjectAttribute.CKA_TOKEN, true)); 
      templatePri.Add(new ObjectAttribute(ObjectAttribute.CKA_PRIVATE, true)); 
      templatePri.Add(new ObjectAttribute(ObjectAttribute.CKA_LABEL, "Ugo's new Key")); 
      templatePri.Add(new ObjectAttribute(ObjectAttribute.CKA_ID, "1")); 

      //Generate the key pair 
      Key[] keys = session.GenerateKeyPair(Mechanism.RSA_PKCS_KEY_PAIR_GEN, templatePub, templatePri); 
      privateKey = (RSAPrivateKey)keys[1]; 
      publicKey = (RSAPublicKey)keys[0]; 
     } 
     else //If the private key is found gets the corresponding public key 
     { 
      privateKey = (RSAPrivateKey)objects[objects.Count - 1]; 
      Console.WriteLine(privateKey.Label); 

      // search for the related public key 
      template = new CryptokiCollection(); 
      template.Add(new ObjectAttribute(ObjectAttribute.CKA_CLASS, CryptokiObject.CKO_PUBLIC_KEY)); 
      template.Add(new ObjectAttribute(ObjectAttribute.CKA_KEY_TYPE, Key.CKK_RSA)); 
      template.Add(new ObjectAttribute(ObjectAttribute.CKA_LABEL, "Ugo's new Key")); 

      // Launchs the search specifying the template just created 
      objects = session.Objects.Find(template, 1);     
      publicKey = (RSAPublicKey)objects[0]; 
      Console.WriteLine(publicKey.Label); 

      // prepares for the signature 
      string helloworld = "Hello World"; 
      byte[] text = Encoding.ASCII.GetBytes(helloworld); 

      // launches the digital signature operation with a RSA_PKCS mechanism 
      nRes = session.SignInit(Mechanism.SHA1_RSA_PKCS, privateKey); 

      // computes the signature 
      byte[] signature = session.Sign(text); 

      // launches the digital signature verification with a RSA_PKCS mechanism     
      nRes = session.VerifyInit(Mechanism.SHA1_RSA_PKCS, publicKey); 

      // verifies the signature 
      nRes = session.Verify(text, signature); 

      // results if nRes == 0 means that the verification is OK 
      Console.Write("Verified " + (nRes == 0)); 
     } 

     // Logouts and closes the session 
     session.Logout(); 
     session.Close(); 
     cryptoki.Finalize(IntPtr.Zero); 
    } 


} 
} 
+0

レガシースタイルPED認証アプリケーションパーティションの作成実際に、私は私がSOに差し込む場合は、それが動作していないだろう、セキュリティ担当者とctypto役員を持っています。 – ccy

答えて

1

最後に、私は私の質問を見つけます。私はLunaG5で作業しています。トークン(黒鍵)を初期化すると、秘密の文字列が作成されます。 Asdf-s4SD-DF7d4-wd3Sのような形式です。この文字列は、KSPをインストールするときにも使用されます。パスワード "1111"はPINpadでのみ使用されますが、使用したトークンを確認するにはアプリケーションで秘密の文字列を使用する必要があります。秘密の文字列の場合

int nRes = session.Login(Session.CKU_USER,"Asdfs4SDDF7d4wd3S"); 
if (nRes != 0) 
{ 
    Console.WriteLine("Wrong PIN"); 
    return; 
} 

、検索を作成します。

0

私はあなたの問題はLoginメソッドからの戻り値の不十分な検証によって引き起こされていると思います:

int nRes = session.Login(Session.CKU_USER,"1111"); 
if (nRes != 0) 
{ 
    Console.WriteLine("Wrong PIN"); 
    return; 
} 

あなたのコードは、値が0である場合にのみ続けるがCKR_OKないだけを返すC_Login PKCS#11の機能の基礎となりますCKR_USER_ALREADY_LOGGED_INと、必ずしもエラーを示すものではない他のコードが含まれています。

+0

こんにちは@ jariq、私は他のタイプに "1111"を隠すべきですか?しかし、私はPINpadに4桁の "1"を入力する必要があります。私は何をすべきか? – ccy

+0

@ccy文字列の値の代わりに 'null'を渡してみてください。 – jariq

+0

私はnullを試しました、それは動作しません。 – ccy

関連する問題