Skip to content

Commit

Permalink
Merge pull request #117 from fiskaltrust/SCU-Spain-Tbai
Browse files Browse the repository at this point in the history
First draft of the TicketBAI SCU for Spain
  • Loading branch information
StefanKert authored Aug 1, 2023
2 parents d30c691 + e10ba65 commit f074b9a
Show file tree
Hide file tree
Showing 51 changed files with 11,775 additions and 0 deletions.
33 changes: 33 additions & 0 deletions azure-pipelines/fiskaltrust.Middleware.SCU.ES-Release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
resources:
pipelines:
- pipeline: build
source: fiskaltrust.Middleware.SCU.ES
trigger:
branches:
include:
- refs/tags/scu-es/*

trigger: none
pr: none

stages:
- template: templates/release.yml
parameters:
type: fiskaltrust.Middleware.SCU.ES
artifact: build
projects:
- TicketBai
stages:
- stage: Release_Sandbox
dependsOn: []
templateContext:
environment: sandbox
storage: stdevwesteuropepackages
serviceConnection: rg-dev-westeurope-packages

# - stage: Release_Production
# templateContext:
# environment: production
# storage: stprodwesteuropepackages
# serviceConnection: rg-prod-westeurope-packages
# dependsOnPrefix: Release_Sandbox
65 changes: 65 additions & 0 deletions azure-pipelines/fiskaltrust.Middleware.SCU.ES.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
resources:
- repo: self

trigger:
batch: true
branches:
include:
- main
- refs/tags/scu-es/*
paths:
include:
- scu-es

pr:
branches:
include:
- main
- refs/tags/scu-es/*
paths:
include:
- scu-es

variables:
- group: "Code Signing Certificates"
- name: BuildConfiguration
value: release
- name: Solution
value: "fiskaltrust.Middleware.SCU.ES.sln"
- name: vmImageName
value: "windows-2022"
- name: WorkingDirectory
value: "scu-es"

stages:
- stage: Test
jobs:
- job: Test
displayName: Unit and integration tests
pool:
vmImage: $(vmImageName)
steps:
- template: templates/scu-es/test.template.yml

- stage: Build
dependsOn: Test
jobs:
- job: BuildNugetPackages
displayName: Build v1 NuGet packages
dependsOn: []
pool:
vmImage: $(vmImageName)
steps:
- template: templates/scu-es/build-nuget.template.yml

- job: BuildZipPackages
displayName: Build v2 zip packages
dependsOn: []
pool:
vmImage: $(vmImageName)
steps:
- template: templates/build-zip.yml
parameters:
workingDirectory: scu-es
projects:
- fiskaltrust.Middleware.SCU.ES.TicketBai
52 changes: 52 additions & 0 deletions azure-pipelines/templates/scu-es/build-nuget.template.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
steps:
- task: yavt@1
inputs:
mode: 'Multi'
semverVersion: 'v1'

- powershell: |
$nugetFeed = if ($Env:BUILD_SOURCEBRANCH.StartsWith("refs/heads/release/") -or $Env:BUILD_SOURCEBRANCH.StartsWith("refs/heads/main") -or $Env:BUILD_SOURCEBRANCH.StartsWith("refs/tags/")) { "release" } else { "dev" }
Write-Host "##vso[task.setvariable variable=NuGetFeed;]$nugetFeed"
displayName: Set NuGet feed

- task: Cache@2
inputs:
key: 'nuget | "$(Agent.OS)" | scu-es/**/*.csproj'
restoreKeys: |
nuget | "$(Agent.OS)"
nuget
path: $(UserProfile)/.nuget/packages
displayName: Cache NuGet packages

- task: DotNetCoreCLI@2
inputs:
command: 'restore'
projects: '$(WorkingDirectory)/$(Solution)'
vstsFeed: $(NuGetFeed)
arguments: '--configuration $(BuildConfiguration)'
displayName: 'Restore'

- task: DotNetCoreCLI@2
displayName: Build
inputs:
projects: '$(WorkingDirectory)/$(Solution)'
arguments: '--configuration $(BuildConfiguration)'

- task: codesigning@2
displayName: 'Code Signing'
inputs:
secureFileId: 'codesigning.pfx'
signCertPassword: '$(Code_Signing_Password)'
filePaths: |
$(WorkingDirectory)/src/**/*fiskaltrust*.dll
$(WorkingDirectory)/src/**/*fiskaltrust*.exe
- script: dotnet pack --output $(Build.ArtifactStagingDirectory) --no-restore --configuration $(buildConfiguration)
displayName: 'dotnet pack fiskaltrust.Middleware.SCU.ES.TicketBai'
workingDirectory: '$(WorkingDirectory)/src/fiskaltrust.Middleware.SCU.ES.TicketBai'

- task: PublishBuildArtifacts@1
displayName: 'Publish Artifact: drop'
inputs:
PathtoPublish: '$(build.artifactstagingdirectory)'
artifactName: packages-v1
37 changes: 37 additions & 0 deletions azure-pipelines/templates/scu-es/test.template.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
steps:
- powershell: |
$nugetFeed = if ($Env:BUILD_SOURCEBRANCH.StartsWith("refs/heads/release/") -or $Env:BUILD_SOURCEBRANCH.StartsWith("refs/heads/main") -or $Env:BUILD_SOURCEBRANCH.StartsWith("refs/tags/")) { "release" } else { "dev" }
Write-Host "##vso[task.setvariable variable=NuGetFeed;]$nugetFeed"
displayName: Set NuGet feed

- task: Cache@2
inputs:
key: 'nuget | "$(Agent.OS)" | scu-es/**/*.csproj'
restoreKeys: |
nuget | "$(Agent.OS)"
nuget
path: $(UserProfile)/.nuget/packages
displayName: Cache NuGet packages

- task: DotNetCoreCLI@2
inputs:
command: 'restore'
projects: '$(WorkingDirectory)/$(Solution)'
vstsFeed: $(NuGetFeed)
arguments: '--configuration $(BuildConfiguration)'
displayName: 'Restore'

- task: DotNetCoreCLI@2
displayName: Build
inputs:
projects: '$(WorkingDirectory)/$(Solution)'
arguments: '--configuration $(BuildConfiguration)'

- task: DotNetCoreCLI@2
inputs:
command: 'test'
projects: |
$(WorkingDirectory)/**/*.UnitTest.csproj
arguments: '--configuration $(BuildConfiguration) --no-restore --collect "Code coverage"'
nobuild: true
displayName: 'Run unit tests'
18 changes: 18 additions & 0 deletions scu-es/Directory.Build.props
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<Project>

<PropertyGroup>
<Version>1.3.0-local</Version>
<AssemblyVersion>1.3.0.0</AssemblyVersion>
<FileVersion>1.3.0.0</FileVersion>
<Authors>fiskaltrust</Authors>
<Company>fiskaltrust</Company>
<Copyright>Copyright 2022</Copyright>
<PackageTags>fiskaltrust signing</PackageTags>
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
<AssemblyCompany>fiskaltrust</AssemblyCompany>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<Deterministic>true</Deterministic>
<LangVersion>11.0</LangVersion>
</PropertyGroup>

</Project>
39 changes: 39 additions & 0 deletions scu-es/fiskaltrust.Middleware.SCU.ES.sln
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.4.33205.214
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A053DEC3-4CA1-4312-8799-7EE53BB09C15}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{24EBAB5D-64B6-431D-B557-241FB778B87E}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "fiskaltrust.Middleware.SCU.ES.UnitTest", "test\fiskaltrust.Middleware.SCU.ES.UnitTest\fiskaltrust.Middleware.SCU.ES.UnitTest.csproj", "{3BE93F7F-01C4-4D40-9FA9-D21ED3D865F9}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "fiskaltrust.Middleware.SCU.ES.TicketBAI", "src\fiskaltrust.Middleware.SCU.ES.TicketBAI\fiskaltrust.Middleware.SCU.ES.TicketBAI.csproj", "{3F25D98C-93D7-4D1F-8A4A-5DCEA1EC8D95}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{3BE93F7F-01C4-4D40-9FA9-D21ED3D865F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3BE93F7F-01C4-4D40-9FA9-D21ED3D865F9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3BE93F7F-01C4-4D40-9FA9-D21ED3D865F9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3BE93F7F-01C4-4D40-9FA9-D21ED3D865F9}.Release|Any CPU.Build.0 = Release|Any CPU
{3F25D98C-93D7-4D1F-8A4A-5DCEA1EC8D95}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3F25D98C-93D7-4D1F-8A4A-5DCEA1EC8D95}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3F25D98C-93D7-4D1F-8A4A-5DCEA1EC8D95}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3F25D98C-93D7-4D1F-8A4A-5DCEA1EC8D95}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{3BE93F7F-01C4-4D40-9FA9-D21ED3D865F9} = {24EBAB5D-64B6-431D-B557-241FB778B87E}
{3F25D98C-93D7-4D1F-8A4A-5DCEA1EC8D95} = {A053DEC3-4CA1-4312-8799-7EE53BB09C15}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {A26D59AC-A4D4-454A-BD07-30BB2A11DD58}
EndGlobalSection
EndGlobal
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<Project>

<Import Project="$([MSBuild]::GetPathOfFileAbove('Directory.Build.props', '$(MSBuildThisFileDirectory)../'))" />

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
using System.Text;

namespace fiskaltrust.Middleware.SCU.ES.TicketBAI.Helpers;

public class CRC8Calculator
{
private readonly byte[] table = new byte[256];

public CRC8Calculator()
{
GenerateTable();
}

public byte ComputeChecksum(string input)
{
var data = Encoding.UTF8.GetBytes(input);
byte crc = 0;
foreach (var b in data)
{
crc = table[crc ^ b];
}
return crc;
}

private void GenerateTable()
{
byte polynomial = 0x07;
for (var i = 0; i < 256; i++)
{
var temp = (byte) i;
for (byte j = 0; j < 8; j++)
{
if ((temp & 0x80) != 0)
{
temp = (byte) ((temp << 1) ^ polynomial);
}
else
{
temp <<= 1;
}
}
table[i] = temp;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
using FirmaXadesNetCore.Crypto;
using FirmaXadesNetCore.Signature.Parameters;
using FirmaXadesNetCore;
using System.Security.Cryptography.X509Certificates;

namespace fiskaltrust.Middleware.SCU.ES.TicketBAI.Helpers
{
public static class XmlHelpers
{
public static Stream ToStream(this string content)
{
var stream = new MemoryStream();
var writer = new StreamWriter(stream);
writer.Write(content);
writer.Flush();
stream.Position = 0;
return stream;
}

public static T? ParseXML<T>(this string content) where T : class
{
var reader = XmlReader.Create(content.Trim().ToStream(), new XmlReaderSettings() { ConformanceLevel = ConformanceLevel.Document });
return new XmlSerializer(typeof(T)).Deserialize(reader) as T;
}
public static string GetXMLIncludingNamespace<T>(T request)
{
var namespaceUri = "urn:ticketbai:emision";
var prefix = "t";
var doc = new XmlDocument();
var nav = doc.CreateNavigator();
using (var w = nav!.AppendChild())
{
var namespaces = new XmlSerializerNamespaces();
namespaces.Add(prefix, namespaceUri);
var ser = new XmlSerializer(typeof(T));
ser.Serialize(w, request, namespaces);
}
return doc.OuterXml;
}

public static string SignXmlContentWithXades(string xml, string policyIdentifier, string policyDigest, X509Certificate2 certificate)
{
var xadesService = new XadesService();
var parameters = new SignatureParameters
{
SignaturePolicyInfo = new SignaturePolicyInfo
{
PolicyIdentifier = policyIdentifier,
PolicyHash = policyDigest,
PolicyUri = policyIdentifier // The URI in our case matches the policyidentifier
},
SignaturePackaging = SignaturePackaging.ENVELOPED,
DataFormat = new DataFormat
{
MimeType = "text/xml"
},
DigestMethod = DigestMethod.SHA256,
Signer = new Signer(certificate)
};

var byteArray = Encoding.ASCII.GetBytes(xml);
var stream = new MemoryStream(byteArray);
var signedXmlBytes = xadesService.Sign(stream, parameters).GetDocumentBytes();
return Encoding.UTF8.GetString(signedXmlBytes, 0, signedXmlBytes.Length);
}
}
}
Loading

0 comments on commit f074b9a

Please sign in to comment.