예제 #1
0
    private void SCardListReaders()
    {
        uint pcchReaders = 0;

        // NFCリーダの文字列バッファのサイズを取得
        uint ret = NfcApi.SCardListReaders(hContext, null, null, ref pcchReaders);

        if (ret != NfcConstant.SCARD_S_SUCCESS)
        {
            // 検出失敗
            throw new ApplicationException("NFCリーダを確認できません。");
        }

        // NFCリーダの文字列を取得
        byte[] mszReaders = new byte[pcchReaders * 2]; // 1文字2byte
        ret = NfcApi.SCardListReaders(hContext, null, mszReaders, ref pcchReaders);
        if (ret != NfcConstant.SCARD_S_SUCCESS)
        {
            // 検出失敗
            throw new ApplicationException("NFCリーダの取得に失敗しました。");
        }


        UnicodeEncoding unicodeEncoding       = new UnicodeEncoding();
        string          readerNameMultiString = unicodeEncoding.GetString(mszReaders);

        // 認識したNDCリーダの最初の1台を使用
        int nullindex = readerNameMultiString.IndexOf((char)0);

        readerName = readerNameMultiString.Substring(0, nullindex);
    }
예제 #2
0
    private void SCardTransmit()
    {
        uint maxRecvDataLen = 256;
        var  recvBuffer     = new byte[maxRecvDataLen + 2];
        var  sendBuffer     = new byte[] { 0xff, 0xca, 0x00, 0x00, 0x00 }; // ← IDmを取得するコマンド

        NfcApi.SCARD_IO_REQUEST ioRecv = new NfcApi.SCARD_IO_REQUEST();
        ioRecv.cbPciLength = 255;

        int pcbRecvLength = recvBuffer.Length;
        int cbSendLength  = sendBuffer.Length;

        IntPtr handle = NfcApi.LoadLibrary("Winscard.dll");
        IntPtr pci    = NfcApi.GetProcAddress(handle, "g_rgSCardT1Pci");

        NfcApi.FreeLibrary(handle);

        uint ret = NfcApi.SCardTransmit(hCard, pci, sendBuffer, cbSendLength, ioRecv, recvBuffer, ref pcbRecvLength);

        if (ret != NfcConstant.SCARD_S_SUCCESS)
        {
            throw new ApplicationException("NFCカードへの送信に失敗しました。code = " + ret);
        }

        // 受信データからIDmを抽出する
        // recvBuffer = IDm + SW1 + SW2 (SW = StatusWord)
        // SW1 = 0x90 (144) SW1 = 0x00 (0) で正常だが、ここでは見ていない
        cardId = BitConverter.ToString(recvBuffer, 0, pcbRecvLength - 2);
    }
예제 #3
0
    private uint SCardEstablishContext()
    {
        uint ret = NfcApi.SCardEstablishContext(NfcConstant.SCARD_SCOPE_USER, IntPtr.Zero, IntPtr.Zero, out hContext);

        if (ret != NfcConstant.SCARD_S_SUCCESS)
        {
            string message;
            switch (ret)
            {
            case NfcConstant.SCARD_E_NO_SERVICE:
                message = "サービスが起動されていません。";
                break;

            default:
                message = "サービスに接続できません。code = " + ret;
                break;
            }
            throw new ApplicationException(message);
        }

        if (hContext == IntPtr.Zero)
        {
            throw new ApplicationException("コンテキストの取得に失敗しました。");
        }
        return(ret);
    }
예제 #4
0
    private void SCardStatus()
    {
        int dwReaderLen = readerName.Length;
        int dwState     = 0;

        byte[] byAtr    = new byte[64]; //ATR
        int    dwAtrLen = byAtr.Length;
        long   lResult  = NfcApi.SCardStatus(hCard, null, ref dwReaderLen, ref dwState, ref activeProtocol, byAtr, ref dwAtrLen);

        if (lResult != NfcConstant.SCARD_S_SUCCESS)
        {
            throw new ApplicationException("");
        }

        lResult = NfcApi.SCardStatus(hCard, readerName, ref dwReaderLen, ref dwState, ref activeProtocol, byAtr, ref dwAtrLen);
        if (lResult != NfcConstant.SCARD_S_SUCCESS)
        {
            throw new ApplicationException("");
        }

        // FeliCaかどうか
        if ((byAtr[13] != 0x00 || byAtr[14] != 0x3b) && DetectOnlyFeliCa)
        {
            throw new ApplicationException("FeliCaではありません。");
        }
    }
예제 #5
0
        private IntPtr getPciT1()
        {
            IntPtr handle = NfcApi.LoadLibrary("Winscard.dll");
            IntPtr pci    = NfcApi.GetProcAddress(handle, "g_rgSCardT1Pci");

            NfcApi.FreeLibrary(handle);
            return(pci);
        }
예제 #6
0
        void disconnect(IntPtr hCard)
        {
            uint ret = NfcApi.SCardDisconnect(hCard, NfcConstant.SCARD_LEAVE_CARD);

            if (ret != NfcConstant.SCARD_S_SUCCESS)
            {
                throw new ApplicationException("カードとの接続を切断できません。code = " + ret);
            }
        }
예제 #7
0
    private void SCardDisconnect()
    {
        uint ret = NfcApi.SCardDisconnect(hCard, NfcConstant.SCARD_LEAVE_CARD);

        if (ret != NfcConstant.SCARD_S_SUCCESS)
        {
            throw new ApplicationException("NFCカードとの切断に失敗しました。code = " + ret);
        }
    }
예제 #8
0
        int control(IntPtr hCard, int controlCode, byte[] sendBuffer, byte[] recvBuffer)
        {
            int  bytesReturned = 0;
            uint ret           = NfcApi.SCardControl(hCard, controlCode, sendBuffer, sendBuffer.Length, recvBuffer, recvBuffer.Length, ref bytesReturned);

            if (ret != NfcConstant.SCARD_S_SUCCESS)
            {
                throw new ApplicationException("カードへの制御命令送信に失敗しました。code = " + ret);
            }
            return(bytesReturned);
        }
예제 #9
0
        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            frm = null;

            if (_is_connect)
            {
                NfcApi.SCardReleaseContext(_hContext);
            }

            server.Stop();
        }
예제 #10
0
    private void SCardConnect()
    {
        activeProtocol = IntPtr.Zero;
        hCard          = IntPtr.Zero;
        uint ret = NfcApi.SCardConnect(hContext, readerName, NfcConstant.SCARD_SHARE_SHARED, NfcConstant.SCARD_PROTOCOL_T1, ref hCard, ref activeProtocol);

        if (ret != NfcConstant.SCARD_S_SUCCESS)
        {
            throw new ApplicationException("カードに接続できません。code = " + ret);
        }
    }
예제 #11
0
        IntPtr connect(IntPtr hContext, string readerName)
        {
            IntPtr hCard          = IntPtr.Zero;
            IntPtr activeProtocol = IntPtr.Zero;
            uint   ret            = NfcApi.SCardConnect(hContext, readerName, NfcConstant.SCARD_SHARE_SHARED, NfcConstant.SCARD_PROTOCOL_T1, ref hCard, ref activeProtocol);

            if (ret != NfcConstant.SCARD_S_SUCCESS)
            {
                throw new ApplicationException("カードに接続できません。code = " + ret);
            }
            return(hCard);
        }
예제 #12
0
    private void SCardReleaseContext()
    {
        if (hContext == IntPtr.Zero)
        {
            throw new ApplicationException("コンテキストの取得に失敗しました。");
        }

        uint ret = NfcApi.SCardReleaseContext(hContext);

        if (ret != NfcConstant.SCARD_S_SUCCESS)
        {
            throw new ApplicationException("カードリーダーとの切断に失敗しました。code = " + ret);
        }
    }
예제 #13
0
        private void Timer1_Tick(object sender, EventArgs e)
        {
            timer1.Stop();

            try
            {
                _readerStateArray[0].dwCurrentState = NfcConstant.SCARD_STATE_UNAWARE;
                _readerStateArray[0].szReader       = _readername;

                uint ret = NfcApi.SCardGetStatusChange(_hContext, 100 /*msec*/, _readerStateArray, _readerStateArray.Length);
                if (ret != NfcConstant.SCARD_S_SUCCESS)
                {
                    throw new ApplicationException("リーダーの初期状態の取得に失敗。code = " + ret);
                }

                var state_is_present = _readerStateArray[0].dwEventState & NfcConstant.SCARD_STATE_PRESENT;

                if (_prev_state_is_present != state_is_present &&
                    state_is_present == NfcConstant.SCARD_STATE_PRESENT)
                {
                    IntPtr hCard = connect(_hContext, _readername);
                    string readerSerialNumber = readReaderSerialNumber(hCard);
                    string cardId             = readCardId(hCard);

                    notify_detect_to_sessions(readerSerialNumber, cardId);

                    disconnect(hCard);
                }
                var state_is_empty = _readerStateArray[0].dwEventState & NfcConstant.SCARD_STATE_EMPTY;

                if (_prev_state_is_empty != state_is_empty &&
                    state_is_empty == NfcConstant.SCARD_STATE_EMPTY)
                {
                    notify_lost_to_sessions();
                }

                _prev_state_is_present = state_is_present;
                _prev_state_is_empty   = state_is_empty;
            }
            catch (ApplicationException ex)
            {
                frm.add_log(
                    DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"),
                    ex.Message
                    );
            }

            timer1.Start();
        }
예제 #14
0
        int transmit(IntPtr hCard, byte[] sendBuffer, byte[] recvBuffer)
        {
            NfcApi.SCARD_IO_REQUEST ioRecv = new NfcApi.SCARD_IO_REQUEST();
            ioRecv.cbPciLength = 255;

            int    pcbRecvLength = recvBuffer.Length;
            int    cbSendLength  = sendBuffer.Length;
            IntPtr SCARD_PCI_T1  = getPciT1();
            uint   ret           = NfcApi.SCardTransmit(hCard, SCARD_PCI_T1, sendBuffer, cbSendLength, ioRecv, recvBuffer, ref pcbRecvLength);

            if (ret != NfcConstant.SCARD_S_SUCCESS)
            {
                throw new ApplicationException("カードへの送信に失敗しました。code = " + ret);
            }
            return(pcbRecvLength); // 受信したバイト数(recvBufferに受け取ったバイト数)
        }
예제 #15
0
        private void Form1_Load(object sender, EventArgs e)
        {
            frm = this;

            try
            {
                var server_config = new SuperSocket.SocketBase.Config.ServerConfig()
                {
                    Port = 80,
                    Ip   = "127.0.0.1",
                    MaxConnectionNumber = 100,
                    Mode             = SuperSocket.SocketBase.SocketMode.Tcp,
                    Name             = "SuperSocket.WebSocket Sample Server",
                    MaxRequestLength = 1024 * 1024 * 10
                };

                setup_server(ref server, server_config);

                var result = NfcApi.SCardEstablishContext(
                    NfcConstant.SCARD_SCOPE_USER,
                    IntPtr.Zero,
                    IntPtr.Zero,
                    out _hContext
                    );

                if (result != 0)
                {
                    if (result == NfcConstant.SCARD_E_NO_SERVICE)
                    {
                        frm.add_log(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), "Smart Card Servise is not Started.");
                    }
                    else
                    {
                        frm.add_log(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), string.Format("SCardEstablishContext Error.\nErrorCode.{0:X}\n", result));
                    }
                }
                else
                {
                    _is_connect = true;

                    try
                    {
                        uint pcchReaders = 0;

                        result = NfcApi.SCardListReaders(_hContext, null, null, ref pcchReaders);

                        if (result != NfcConstant.SCARD_S_SUCCESS)
                        {
                            throw new ApplicationException("リーダーの情報が取得できません。\nErrorCode: " + String.Format("{0:X}", result));
                        }

                        byte[] mszReaders = new byte[pcchReaders * 2];

                        result = NfcApi.SCardListReaders(_hContext, null, mszReaders, ref pcchReaders);

                        if (result != NfcConstant.SCARD_S_SUCCESS)
                        {
                            throw new ApplicationException("リーダーの情報が取得できません。\nErrorCode: " + String.Format("{0:X}", result));
                        }

                        UnicodeEncoding unicodeEncoding       = new UnicodeEncoding();
                        string          readerNameMultiString = unicodeEncoding.GetString(mszReaders);

                        int nullindex = readerNameMultiString.IndexOf((char)0);   // 装置は1台のみ
                        _readername = readerNameMultiString.Substring(0, nullindex);

                        frm.add_log(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), "リーダー名:" + _readername);

                        _readerStateArray = new NfcApi.SCARD_READERSTATE[1];


                        timer1.Start();
                    }
                    catch (ApplicationException ex)
                    {
                        frm.add_log(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), ex.Message);
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
예제 #16
0
        private void Form1_Load(object sender, EventArgs e)
        {
            frm = this;

            try
            {
                var server_config_ssl = new SuperSocket.SocketBase.Config.ServerConfig()
                {
                    Port = 443,
                    Ip   = "127.0.0.1",
                    MaxConnectionNumber = 100,
                    Mode             = SuperSocket.SocketBase.SocketMode.Tcp,
                    Name             = "SuperWebSocket Sample Server",
                    MaxRequestLength = 1024 * 1024 * 10,
                    Security         = "tls",
                    Certificate      = new SuperSocket.SocketBase.Config.CertificateConfig
                    {
                        FilePath = ConfigurationManager.AppSettings["cert_file_path"],
                        Password = ConfigurationManager.AppSettings["cert_password"]
                    }
                };

                setup_server(ref server_ssl, server_config_ssl);

                valid_cert();

                var result = NfcApi.SCardEstablishContext(
                    NfcConstant.SCARD_SCOPE_USER,
                    IntPtr.Zero,
                    IntPtr.Zero,
                    out _hContext
                    );

                if (result != 0)
                {
                    if (result == NfcConstant.SCARD_E_NO_SERVICE)
                    {
                        frm.add_log(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), "Smart Card Servise is not Started.");
                    }
                    else
                    {
                        frm.add_log(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), string.Format("SCardEstablishContext Error.\nErrorCode.%08X\n", result));
                    }
                }
                else
                {
                    _is_connect = true;

                    try
                    {
                        uint pcchReaders = 0;

                        result = NfcApi.SCardListReaders(_hContext, null, null, ref pcchReaders);

                        if (result != NfcConstant.SCARD_S_SUCCESS)
                        {
                            throw new ApplicationException("リーダーの情報が取得できません。");
                        }

                        byte[] mszReaders = new byte[pcchReaders * 2];

                        result = NfcApi.SCardListReaders(_hContext, null, mszReaders, ref pcchReaders);

                        if (result != NfcConstant.SCARD_S_SUCCESS)
                        {
                            throw new ApplicationException("リーダーの情報が取得できません。");
                        }

                        UnicodeEncoding unicodeEncoding       = new UnicodeEncoding();
                        string          readerNameMultiString = unicodeEncoding.GetString(mszReaders);

                        int nullindex = readerNameMultiString.IndexOf((char)0);   // 装置は1台のみ
                        _readername = readerNameMultiString.Substring(0, nullindex);

                        frm.add_log(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), "リーダー名:" + _readername);

                        _readerStateArray = new NfcApi.SCARD_READERSTATE[1];


                        timer1.Start();
                    }
                    catch (ApplicationException ex)
                    {
                        frm.add_log(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), ex.Message);
                    }
                }
            }
            catch (Exception ex)
            {
                reflesh_cert();

                MessageBox.Show("証明書を更新しました。\nアプリケーションを再起動します。");

                Application.Restart();
            }
        }