11using System . Security . Cryptography . X509Certificates ;
2+ using Google . Protobuf ;
23using LanguageExt ;
34using LanguageExt . Common ;
45using Microsoft . Extensions . DependencyInjection ;
5- using TIKSN . Serialization . Bond ;
66using static LanguageExt . Prelude ;
77
88namespace TIKSN . Licensing ;
99
10- public class LicenseFactory < TEntitlements , TEntitlementsData > : ILicenseFactory < TEntitlements , TEntitlementsData >
10+ public class LicenseFactory < TEntitlements , TEntitlementsData > : ILicenseFactory < TEntitlements , TEntitlementsData > where TEntitlementsData : IMessage < TEntitlementsData >
1111{
12- private readonly CompactBinaryBondDeserializer deserializer ;
1312 private readonly IEntitlementsConverter < TEntitlements , TEntitlementsData > entitlementsConverter ;
1413 private readonly ILicenseDescriptor < TEntitlements > licenseDescriptor ;
15- private readonly CompactBinaryBondSerializer serializer ;
1614 private readonly IServiceProvider serviceProvider ;
1715 private readonly TimeProvider timeProvider ;
1816
1917 public LicenseFactory (
20- CompactBinaryBondSerializer serializer ,
21- CompactBinaryBondDeserializer deserializer ,
2218 ILicenseDescriptor < TEntitlements > licenseDescriptor ,
2319 IEntitlementsConverter < TEntitlements , TEntitlementsData > entitlementsConverter ,
2420 TimeProvider timeProvider ,
2521 IServiceProvider serviceProvider )
2622 {
27- this . serializer = serializer ?? throw new ArgumentNullException ( nameof ( serializer ) ) ;
28- this . deserializer = deserializer ?? throw new ArgumentNullException ( nameof ( deserializer ) ) ;
2923 this . licenseDescriptor = licenseDescriptor ?? throw new ArgumentNullException ( nameof ( licenseDescriptor ) ) ;
3024 this . entitlementsConverter = entitlementsConverter ?? throw new ArgumentNullException ( nameof ( entitlementsConverter ) ) ;
3125 this . timeProvider = timeProvider ?? throw new ArgumentNullException ( nameof ( timeProvider ) ) ;
@@ -49,8 +43,7 @@ public Validation<Error, License<TEntitlements>> Create(
4943
5044 _ = this . entitlementsConverter . Convert ( entitlements )
5145 . Match (
52- succ => envelope . Message . Entitlements =
53- new ArraySegment < byte > ( this . serializer . Serialize ( succ ) ) ,
46+ succ => envelope . Message . Entitlements = succ . ToByteString ( ) ,
5447 fail => errors . AddRange ( fail ) ) ;
5548
5649 if ( ! privateCertificate . HasPrivateKey )
@@ -63,15 +56,15 @@ public Validation<Error, License<TEntitlements>> Create(
6356 return errors . ToSeq ( ) ;
6457 }
6558
66- var messageData = this . serializer . Serialize ( envelope . Message ) ;
59+ var messageData = envelope . Message . ToByteString ( ) ;
6760
6861 var keyAlgorithm = privateCertificate . GetKeyAlgorithm ( ) ;
6962 envelope . SignatureAlgorithm = keyAlgorithm ;
7063 var signatureService = this . serviceProvider . GetRequiredKeyedService < ICertificateSignatureService > ( keyAlgorithm ) ;
71- var signature = signatureService . Sign ( messageData , privateCertificate ) ;
72- envelope . Signature = new ArraySegment < byte > ( signature ) ;
64+ var signature = signatureService . Sign ( messageData . ToByteArray ( ) , privateCertificate ) ;
65+ envelope . Signature = ByteString . CopyFrom ( signature ) ;
7366
74- var envelopeData = this . serializer . Serialize ( envelope ) ;
67+ var envelopeData = envelope . ToByteString ( ) ;
7568
7669 return new License < TEntitlements > (
7770 terms ,
@@ -93,10 +86,14 @@ public Validation<Error, License<TEntitlements>> Create(
9386 return errors . ToSeq ( ) ;
9487 }
9588
96- var envelope = this . deserializer . Deserialize < LicenseEnvelope > ( [ .. data ] ) ;
89+ var envelope = LicenseEnvelope . Parser . ParseFrom ( [ .. data ] ) ;
9790
9891 var licenseTermsValidation = this . GetTerms ( envelope , this . timeProvider ) ;
99- var entitlementsValidation = this . entitlementsConverter . Convert ( this . deserializer . Deserialize < TEntitlementsData > ( [ .. envelope . Message . Entitlements ] ) ) ;
92+
93+ var entitlementsData = Activator . CreateInstance < TEntitlementsData > ( ) ;
94+ entitlementsData . MergeFrom ( envelope . Message . Entitlements . CreateCodedInput ( ) ) ;
95+
96+ var entitlementsValidation = this . entitlementsConverter . Convert ( entitlementsData ) ;
10097
10198 var keyAlgorithm = publicCertificate . GetKeyAlgorithm ( ) ;
10299
@@ -107,9 +104,9 @@ public Validation<Error, License<TEntitlements>> Create(
107104
108105 var signatureService = this . serviceProvider . GetRequiredKeyedService < ICertificateSignatureService > ( keyAlgorithm ) ;
109106
110- var messageData = this . serializer . Serialize ( envelope . Message ) ;
107+ var messageData = envelope . Message . ToByteArray ( ) ;
111108
112- if ( ! signatureService . Verify ( messageData , [ .. envelope . Signature ] , publicCertificate ) )
109+ if ( ! signatureService . Verify ( messageData , envelope . Signature . ToByteArray ( ) , publicCertificate ) )
113110 {
114111 errors . Add ( Error . New ( 1311896038 , "License signature is invalid" ) ) ;
115112 }
@@ -133,12 +130,7 @@ private Validation<Error, LicenseTerms> GetTerms(
133130 {
134131 ArgumentNullException . ThrowIfNull ( envelope ) ;
135132
136- if ( envelope . Message . VersionNumber != 1 )
137- {
138- return Error . New ( 2129266854 , "License version is invalid" ) ;
139- }
140-
141- if ( envelope . Message . Discriminator . Count != Guid . Empty . ToByteArray ( ) . Length ||
133+ if ( envelope . Message . Discriminator . Count ( ) != Guid . Empty . ToByteArray ( ) . Length ||
142134 envelope . Message . Discriminator . All ( x => x == byte . MinValue ) ||
143135 ! envelope . Message . Discriminator . SequenceEqual ( this . licenseDescriptor . Discriminator . ToByteArray ( ) ) )
144136 {
@@ -193,14 +185,15 @@ private Validation<Error, LicenseEnvelope> Populate(
193185
194186 var errors = new List < Error > ( ) ;
195187
196- envelope . Message . VersionNumber = 1 ;
197-
198188 if ( this . licenseDescriptor . Discriminator == Guid . Empty )
199189 {
200190 errors . Add ( Error . New ( 13127674 , "'Discriminator' should not be empty GUID" ) ) ;
201191 }
202192
203- envelope . Message . Discriminator = new ArraySegment < byte > ( this . licenseDescriptor . Discriminator . ToByteArray ( ) ) ;
193+ envelope . Message = new LicenseMessage
194+ {
195+ Discriminator = ByteString . CopyFrom ( this . licenseDescriptor . Discriminator . ToByteArray ( ) ) ,
196+ } ;
204197
205198 if ( terms . NotAfter < terms . NotBefore )
206199 {
0 commit comments