Skip to content

Commit

Permalink
Merge branch 'main' into main
Browse files Browse the repository at this point in the history
  • Loading branch information
malieskimi authored Sep 26, 2022
2 parents c121fa1 + e49fc2d commit a8809db
Show file tree
Hide file tree
Showing 16 changed files with 295 additions and 43 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
using PCSC.Iso7816;
using PCSC;
using PCSC.Monitoring;
using SecureElementReader.App.Proxies;

namespace SecureElementReader.App.DependencyInjection
{
Expand Down Expand Up @@ -48,6 +49,7 @@ public static void RegisterServices(IMutableDependencyResolver services, IReadon
));
services.RegisterLazySingleton<IMainWindowProvider>(() => new MainWindowProvider());
services.RegisterLazySingleton<IApduCommandService>(() => new ApduCommandService());
services.RegisterLazySingleton<ITaxCoreApiProxy>(() => new TaxCoreApiProxy());
services.RegisterLazySingleton<ICardReaderService>(() => new CardReaderService(
resolver.GetRequiredService<IApduCommandService>(),
resolver.GetRequiredService<ILogger>(),
Expand All @@ -68,7 +70,8 @@ public static void RegisterServices(IMutableDependencyResolver services, IReadon
resolver.GetRequiredService<ITopLanguageViewModel>(),
resolver.GetRequiredService<IMonitorFactory>(),
resolver.GetRequiredService<IApplicationDispatcher>(),
resolver.GetRequiredService<IMainWindowProvider>()
resolver.GetRequiredService<IMainWindowProvider>(),
resolver.GetRequiredService<ITaxCoreApiProxy>()
));
services.RegisterLazySingleton<IApplicationCloser>(() => new ApplicationCloser());

Expand Down
14 changes: 13 additions & 1 deletion src/SecureElementReader.App/Enums/ApduInstructions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,18 @@ namespace SecureElementReader.App.Enums
public enum ApduInstructions : byte
{
ExportCert = 0x04,
PinVerify = 0x11
PinVerify = 0x11,

/// <summary>
/// EXPORT INTERNAL DATA – exports encrypted Internal Data structure
/// </summary>
/// <remarks>Fiscalization</remarks>
ExportInternalData = 0x12,

/// <summary>
/// AMOUNT STATUS – 16 bytes long data structure ( 8 bytes for sum SALE and REFUND, and 8 bytes for MAXIMAL sum amount )
/// </summary>
/// <remarks>Fiscalization</remarks>
AmountStatus = 0x14,
}
}
4 changes: 4 additions & 0 deletions src/SecureElementReader.App/Interfaces/IApduCommandService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,9 @@ public interface IApduCommandService
CommandApdu GetPKICert();
CommandApdu VerifyPkiPin(byte[] pin);
CommandApdu VerifySEPin(byte[] pin);

CommandApdu AmountStatus();

CommandApdu GetExportInternalData();
}
}
4 changes: 4 additions & 0 deletions src/SecureElementReader.App/Interfaces/ICardReaderService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,9 @@ public interface ICardReaderService
IEnumerable<string> LoadReaders();
CertDetailsModel GetCertDetails();
VerifyPinModel VerifyPin(string pin);
byte[] GetInternalData();

byte[] GetAmountStatus();

}
}
14 changes: 14 additions & 0 deletions src/SecureElementReader.App/Interfaces/ITaxCoreApiProxy.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
using SecureElementReader.App.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SecureElementReader.App.Interfaces
{
public interface ITaxCoreApiProxy
{
bool SendInternalData(SecureElementAuditRequest request, string commonName, string apiUrl);
}
}
14 changes: 14 additions & 0 deletions src/SecureElementReader.App/Models/SecureElementAuditRequest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SecureElementReader.App.Models
{
public class SecureElementAuditRequest
{
public byte[] AuditData { get; set; }
public byte[] LimitData { get; set; }
}
}
18 changes: 18 additions & 0 deletions src/SecureElementReader.App/Properties/Resources.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions src/SecureElementReader.App/Properties/Resources.resx
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,9 @@
<data name="NoCardReadesFounded" xml:space="preserve">
<value>No card readers found!</value>
</data>
<data name="Options" xml:space="preserve">
<value>Options</value>
</data>
<data name="Organization" xml:space="preserve">
<value>Taxpayer:</value>
</data>
Expand Down Expand Up @@ -288,6 +291,9 @@
<data name="Subject" xml:space="preserve">
<value>Subject:</value>
</data>
<data name="SubmitInternalData" xml:space="preserve">
<value>Submit Internal Data</value>
</data>
<data name="Support" xml:space="preserve">
<value>Support:</value>
</data>
Expand Down
82 changes: 82 additions & 0 deletions src/SecureElementReader.App/Proxies/TaxCoreApiProxy.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
using SecureElementReader.App.Interfaces;
using SecureElementReader.App.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;

namespace SecureElementReader.App.Proxies
{
public class TaxCoreApiProxy : ITaxCoreApiProxy
{

private static string? CommonName;
private static string? ApiUrl;

public bool SendInternalData(SecureElementAuditRequest request, string commonName, string apiUrl)
{

CommonName = commonName;
ApiUrl = apiUrl;

try
{
var httpContent = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(request), Encoding.UTF8, "application/json");
HttpClient client;
HttpClientHandler handler;

GetClientAndHandler(out handler, out client);

var response = client.PostAsync($"/api/SecureElements/Audit", httpContent).Result;

if (response.StatusCode == HttpStatusCode.OK)
{
var jsonString = response.Content.ReadAsStringAsync();
jsonString.Wait();
var invoiceResponse = jsonString.Result;
return true;
}
else
{
return false;
}
}
catch (Exception)
{

return false;
}
}

static void GetClientAndHandler(out HttpClientHandler handler, out HttpClient client)
{
handler = CreateWebRequestHandler();
client = new HttpClient(handler);

client.BaseAddress = new Uri(ApiUrl);
client.DefaultRequestHeaders.Accept.Clear();
}

static HttpClientHandler CreateWebRequestHandler()
{
var handler = new HttpClientHandler();
var cert = GetClientCertificate();

handler.ClientCertificateOptions = ClientCertificateOption.Manual;
handler.ClientCertificates.Add(cert);
return handler;
}

static X509Certificate2 GetClientCertificate()
{
var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);

store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly);
return store.Certificates.Find(X509FindType.FindBySubjectName, CommonName, false)[0];
}
}
}
1 change: 1 addition & 0 deletions src/SecureElementReader.App/SecureElementReader.App.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.PlatformAbstractions" Version="1.1.0" />
<PackageReference Include="Microsoft.Net.Http" Version="2.2.29" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
<PackageReference Include="PCSC" Version="6.0.0" />
<PackageReference Include="PCSC.Iso7816" Version="6.0.0" />
Expand Down
26 changes: 26 additions & 0 deletions src/SecureElementReader.App/Services/ApduCommandService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -77,5 +77,31 @@ public CommandApdu VerifySEPin(byte[] pin)
Data = pin
};
}

public CommandApdu AmountStatus()
{
return new CommandApdu(IsoCase.Case2Short, SCardProtocol.T1)
{
CLA = (byte)ApduClasses.SelectCommand,
INS = (byte)ApduInstructions.AmountStatus,
P1 = (byte)ApduP1.Default,
P2 = (byte)ApduP2.Default
};
}

/// <summary>
/// Exports encrypted Internal Data structure only.
/// </summary>
/// <returns></returns>
public CommandApdu GetExportInternalData()
{
return new CommandApdu(IsoCase.Case2Extended, SCardProtocol.T1)
{
CLA = (byte)ApduClasses.SelectCommand,
INS = (byte)ApduInstructions.ExportInternalData,
P1 = (byte)ApduP1.Default,
P2 = (byte)ApduP2.Default
};
}
}
}
Loading

0 comments on commit a8809db

Please sign in to comment.