2 * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 using System.Runtime.InteropServices;
19 using System.Collections.Generic;
21 namespace Tizen.Network.Smartcard
24 /// A class for Smartcard channel informations. It allows applications to handle channel informations.
26 /// <since_tizen> 3 </since_tizen>
27 /// <privilege>http://tizen.org/privilege/secureelement</privilege>
28 public class SmartcardChannel : IDisposable
30 private int _channelHandle = -1;
31 private bool disposed = false;
32 private SmartcardSession _sessionObject;
35 /// Whether the kind of channel is basic.
37 /// <since_tizen> 3 </since_tizen>
38 public bool IsBasicChannel
43 int ret = Interop.Smartcard.Channel.ChannelIsBasicChannel(_channelHandle, out isBasicChannel);
44 if (ret != (int)SmartcardError.None)
46 Log.Error(Globals.LogTag, "Failed to get basic channel, Error - " + (SmartcardError)ret);
48 return isBasicChannel;
53 /// Whether the kind of channel is logical.
55 /// <since_tizen> 3 </since_tizen>
56 public bool IsLogicalChannel
61 int ret = Interop.Smartcard.Channel.ChannelIsBasicChannel(_channelHandle, out isBasicChannel);
62 if (ret != (int)SmartcardError.None)
64 Log.Error(Globals.LogTag, "Failed to get logical channel, Error - " + (SmartcardError)ret);
66 return !isBasicChannel;
71 /// Whether the channel is closed.
73 /// <since_tizen> 3 </since_tizen>
79 int ret = Interop.Smartcard.Channel.ChannelIsClosed(_channelHandle, out isClosed);
80 if (ret != (int)SmartcardError.None)
82 Log.Error(Globals.LogTag, "Failed to get closed, Error - " + (SmartcardError)ret);
89 /// The session that has opened the given channel.
91 /// <since_tizen> 3 </since_tizen>
92 public SmartcardSession Session
97 int ret = Interop.Smartcard.Channel.ChannelGetSession(_channelHandle, out session);
98 if (ret != (int)SmartcardError.None)
100 Log.Error(Globals.LogTag, "Failed to get session, Error - " + (SmartcardError)ret);
103 if (_sessionObject.GetHandle() != session)
105 Log.Error(Globals.LogTag, "Does not correspond with session, Error - " + _sessionObject.GetHandle() + " " + session);
108 return _sessionObject;
112 internal SmartcardChannel(SmartcardSession sessionHandle, int channelHandle)
114 _sessionObject = sessionHandle;
115 _channelHandle = channelHandle;
123 public void Dispose()
126 GC.SuppressFinalize(this);
129 private void Dispose(bool disposing)
136 // Free managed objects.
138 //Free unmanaged objects
143 /// Closes the given channel to the Secure Element.
145 /// <since_tizen> 3 </since_tizen>
148 int ret = Interop.Smartcard.Channel.ChannelClose(_channelHandle);
149 if (ret != (int)SmartcardError.None)
151 Log.Error(Globals.LogTag, "Failed to channel close, Error - " + (SmartcardError)ret);
152 SmartcardErrorFactory.ThrowSmartcardException(ret);
158 /// Gets the response to the select command.
160 /// <since_tizen> 3 </since_tizen>
161 /// <returns>Byte array to retrieve the SELECT response.</returns>
162 public byte[] GetSelectedResponse()
167 int ret = Interop.Smartcard.Channel.ChannelGetSelectResponse(_channelHandle, out strAtr, out len);
168 if (ret != (int)SmartcardError.None)
170 Log.Error(Globals.LogTag, "Failed to get select response, Error - " + (SmartcardError)ret);
173 respList = new byte[len];
174 for (int i = 0; i < len; i++)
176 respList[i] = Marshal.ReadByte(strAtr);
177 strAtr += sizeof(byte);
183 /// Transmits an APDU command (as per ISO/IEC 7816-4) to the Secure Element.
185 /// <since_tizen> 3 </since_tizen>
186 /// <returns>Byte array for the response APDU plus status words.</returns>
187 /// <param name="cmd">Command APDU to be send to the secure element.</param>
188 public byte[] Transmit(byte[] cmd)
193 int ret = Interop.Smartcard.Channel.ChannelTransmit(_channelHandle, cmd, cmd.Length, out strAtr, out len);
194 if (ret != (int)SmartcardError.None)
196 Log.Error(Globals.LogTag, "Failed to transmit, Error - " + (SmartcardError)ret);
199 atrList = new byte[len];
200 for (int i = 0; i < len; i++)
202 atrList[i] = Marshal.ReadByte(strAtr);
203 strAtr += sizeof(byte);
210 /// Helper function to retrieves the response APDU of the previous transmit() call.
212 /// <since_tizen> 3 </since_tizen>
213 /// <returns>Byte array for the response APDU plus status words.</returns>
214 public byte[] GetTransmittedResponse()
219 int ret = Interop.Smartcard.Channel.ChannelTransmitRetrieveResponse(_channelHandle, out strAtr, out len);
220 if (ret != (int)SmartcardError.None)
222 Log.Error(Globals.LogTag, "Failed to get trasmit retrieve response, Error - " + (SmartcardError)ret);
225 respList = new byte[len];
226 for (int i = 0; i < len; i++)
228 respList[i] = Marshal.ReadByte(strAtr);
229 strAtr += sizeof(byte);
235 /// Performs a selection of the next Applet on the given channel that matches to the partial Application ID(AID).
237 /// <since_tizen> 3 </since_tizen>
238 /// <returns>True or false depending whether another applet with the partial Application ID(AID).</returns>
239 public bool SelectNext()
242 int ret = Interop.Smartcard.Channel.ChannelSelectNext(_channelHandle, out selectNext);
243 if (ret != (int)SmartcardError.None)
245 Log.Error(Globals.LogTag, "Failed to select next, Error - " + (SmartcardError)ret);