From f62f74fa44bf0f72736c3db5e76567c0e98eb987 Mon Sep 17 00:00:00 2001 From: SHM Date: Tue, 29 Apr 2025 15:31:31 +0900 Subject: [PATCH] =?UTF-8?q?[=EC=84=B1=ED=98=84=EB=AA=A8]=20VPKI=20?= =?UTF-8?q?=EB=B0=98=EB=B3=B5=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Projects/DLL/SystemX.Core.dll | Bin 34816 -> 34816 bytes .../SystemX.Core/Communication/Http.cs | 2 +- .../DBPatch/sqlScripts/VPKI.DataDB_Create.sql | 61 ++++++++-------- .../sqlScripts/dacpac/VPKI.DataDB.dacpac | Bin 3959 -> 4011 bytes .../VPKI.DataDB/dbo/Tables/tTbscsr.sql | 3 +- .../VPKI/VPKI/Config/VPKI.WebApiConfig.json | 2 +- .../VPKI_DataDB/Context/VpkiDataDbContext.cs | 9 +-- .../DB/VPKI_DataDB/Tables/TTbscsr.cs | 2 + .../Services/CertificateService.cs | 56 ++++++++++----- .../Services/ISO15118_02Service.cs | 21 ++++-- .../Services/ISO15118_20Service.cs | 19 ++++- .../VPKI.Web.Api/appsettings.Development.json | 3 +- .../VPKI/VPKI/VPKI.Web.Api/appsettings.json | 3 +- .../Module/VPKIApiCertificate.razor | 16 +++-- .../Components/Module/VPKIApiTbscsr.razor | 18 +++-- .../Components/Pages/Utils.razor | 66 ++++++++++++++++++ .../Components/Pages/VPKIApi.razor | 28 ++++---- 17 files changed, 219 insertions(+), 90 deletions(-) create mode 100644 Projects/VPKI/VPKI/VPKI.Web.Client/Components/Pages/Utils.razor diff --git a/Projects/DLL/SystemX.Core.dll b/Projects/DLL/SystemX.Core.dll index 769ebfca20ac543c61006a3d38c45e8753d39992..0fc5670d4db76921b350f3a8700153955edac653 100644 GIT binary patch delta 2384 zcmYL~3v5$m6vxkZ`?|NiV=ZOtbU@mSIiPHG>$(l+U~?OU*MJ}*0;XNN5}2Z9@-Sf9 zZeuWD!1#zrBElSoATvfQ1~L-5@DenJM}Q#`Hpdh&G9pCc0>Sg0UG+BicmL=AKj*uT zw7t!F3LlQWiO_+c-=E8Hbb;EPxm8^L2N!Ui~#?1qZh z0T_413gdI7k22WD@w=Ia^egX~UX7+%1?|HH2UWp6NrD?C!OO&l#BO8(Y?SUJFB2aU zyOB1yWc?Gl$od!ZOT!?tQC-Sx@XWB0F>n~4ns&Nhv=5pXRHZPP!F`7jdDfcDXS*G4 z;dJO7*x6}ypq`$Tjyz}?jl7=fMozI8A>XhU@$GKkvJ%+{en%xTk~{kSQdQ9KTGN_qDohQ^wvI3{HO0{i4kZn4P}L-#w`D5NL!VY%v5k)ha=dJsM;Qb0 zabmnFt#CMlOgK)}88)c%DVg9LFS0Z24_$>a9@bOU2qm_8N)8;?D&|2$oZt)aii*# zmtkw3@M7?;gFywn<{heRhB_X}-GeJUmzT~u;=a7!<;X848BW7Fa!WkC=|t2tnS zBc>d%!!5k|bhv}e0FyZf++am|p$b_Heq=e+B4@%{Qy=F4s$zQ+-Kw;Lcdr&NzOUcm1-a9 zyQt@>z-qByhis8`Ok9MHi5pW`CoEQ-Fmt#+(8l|*>R&JoQ8U12)e}sZ|3fd_+Kx2n6ZdDVM zo}@)jQrg4B1MH=qKJxp>2TAx&N!+W8v`cD$if&cX(uN^X&31(8aqk4N7@26`CBE9q>Gk5azM8QM)B4XN93YKr=trZ zx-^OlDkWW}Q8)q80iDoM(lL#~*-yGnqi_|J|sili_k2#JP-AkHTM30MDY7u^bbd0#4oG#L!ir7(IM*QD7AYDRd zz#=-I5O1ekMg1t{YJ7WXYo7JfH8YQd^}eaQHnWP6-SVoqr>@TwPhGc98e0%9^c01B zzHlg57|!?AR0nGcf}uceK`4;t^HzKE^TWA?p^!Iz^Ml9CQ(v_m*zCCy{v*DJyYmy= zqvG#zXk&P=<1Su0yD;0u4bcqimAQW}am>Tai^ delta 2384 zcmYL~3v5$m6vxkZ`?|OHjRMxLllr#fOQ=ZL_mdr2DB}M z4cLT^OK=#`4N!yAETob^Ag;?08BsD}1P~+}1LYy2nT9|hc)r6$Z}R>6KmY$Z-+g4e zHyjnhQ6ainzqZ0pbN@5!4BPADn zIAi$-ImdDz*=Bfz+^EcFR(NcvV+xe zcVOpH%MjF)6P`tWA-j+l?Rm&Cw$aE1w$bYLZ10j%(Fm1}Nyt!Q1^QEg?>vF=sUwW< zbAfF!GN^)A(WzkFdIoVe7yH*s4rYWMmWBWAa4TUc_RIsmPZg{Xi(s+vj%WuntXH#h z&ig+`f4>v(XiO>*Cce@kRaTSQTp3JpGqgy+9Rps-tsLC$@=t*qToL@W6B! z&)Te2yB*((Cb*_my{6Nm2ujA2&UWRTD8X^9QY@F$J-Mmus(K`M`pjFR6%J=U>6?&v zPqe`Wt@0*=Bc(%Z z1Rt+W@g*_HfMZmhU=MVoqzrIo@$3Yk{@s?9xq=KGQlF6Z!$TJg_hUZvzx1(|~w_+Y12mFw#;JE>LM zq&jI7Jf!MZc-_$;`S}nYCk$oDyVS4Uscf&>g=|o-yT>OsOQoQ9^Sl-|8+WPx{1L;} zNMoU)fO`>m%fVnA%=SE~tcEpeD1SHZ@JvA}Ym0dcZi}JoCK0}aE@T(nFl9mzTuL6u zaLAMgHn@s6p9;5;X<#}Z>yXpQpNI6oDrhqoBBSDXKO{KW!SGnMnxUt7olVP#w2zW7AQ{gLrzu?hs;iAOlL`IY1ZNe8K?8rf!Eiam8on9>^BxrWj$=$9zXAqw_Uu#bZMGv zol2b2PTI7S(q6_NU?27LliyE12;6rH{9aw8T|y1?$mv2W$Vxf+Y-O%UhGKdk^9L3T|GF}#$rdPN7m`+ zf`~4S{DMkJmuciqfOJ5|b(nNSBX^ofw`k-}oOFjq?(~udJ)MzL%`6#~ZCB#t^b)~9 zDbZzUgy+_mmpzVWC`VACg7yl8{kx{XXbcEPKj8khL=`u5& zm>4m)0w^7%d(APt=swa+<~=TAsm%QV=?JlzoDR~U@c$EcnZgGu6>23NA+`|X`BFUGc)HWpa6G54x|6EnoD>so~2RYmTi zYLDOR^96$W)qbDfH!4^V^aj1vzTjeaVg4e&C+P9}y|JI)yT|e`Z=Uiyu!?B{z7$vE zO8*2`7=?B){I%iY-<>ARnp74}vs}q>j<|p2^w=iVlw9}2tgUKccu9d~zWvn1t>4&C za(3wa*<16rudY1!8;(Cc*r%wRjV?PIh+PXm$6|vvJP=;4f+BF^s>XM!AH4Ws@Ie6I x!TIR;QS&tl>jGR}TGi+TVKGh>V%H+<@L7X!pOw3w)mo>Ug{{l)TPl*5k diff --git a/Projects/SystemX.Core/SystemX.Core/Communication/Http.cs b/Projects/SystemX.Core/SystemX.Core/Communication/Http.cs index 230f721..4bd12ad 100644 --- a/Projects/SystemX.Core/SystemX.Core/Communication/Http.cs +++ b/Projects/SystemX.Core/SystemX.Core/Communication/Http.cs @@ -15,7 +15,7 @@ namespace SystemX.Core.Communication /// /// https://127.0.0.1:443 /// Range 5~30 secconds - public virtual async Task PostJsonAsync(string url, REQUEST request, string bearerToken = "", short timeOutSeconds = 5) where REQUEST : class where RESPONSE : class + public virtual async Task PostJsonAsync(string url, REQUEST request, string bearerToken = "", short timeOutSeconds = 10) where REQUEST : class where RESPONSE : class { RESPONSE? response = default(RESPONSE); Guid guid = Guid.NewGuid(); diff --git a/Projects/VPKI/VPKI.DB/DBPatch/sqlScripts/VPKI.DataDB_Create.sql b/Projects/VPKI/VPKI.DB/DBPatch/sqlScripts/VPKI.DataDB_Create.sql index 933880d..eaab889 100644 --- a/Projects/VPKI/VPKI.DB/DBPatch/sqlScripts/VPKI.DataDB_Create.sql +++ b/Projects/VPKI/VPKI.DB/DBPatch/sqlScripts/VPKI.DataDB_Create.sql @@ -242,18 +242,6 @@ IF fulltextserviceproperty(N'IsFulltextInstalled') = 1 EXECUTE sp_fulltext_database 'enable'; -GO -PRINT N'테이블 [dbo].[tVerifyResult]을(를) 만드는 중...'; - - -GO -CREATE TABLE [dbo].[tVerifyResult] ( - [cCuid] BIGINT NOT NULL, - [cResult] NCHAR (20) NOT NULL, - PRIMARY KEY CLUSTERED ([cCuid] ASC) -); - - GO PRINT N'테이블 [dbo].[tOcsp]을(를) 만드는 중...'; @@ -270,27 +258,13 @@ CREATE TABLE [dbo].[tOcsp] ( GO -PRINT N'테이블 [dbo].[tTbscsr]을(를) 만드는 중...'; +PRINT N'테이블 [dbo].[tVerifyResult]을(를) 만드는 중...'; GO -CREATE TABLE [dbo].[tTbscsr] ( - [cCuid] BIGINT IDENTITY (1, 1) NOT NULL, - [cIftid] NVARCHAR (100) NOT NULL, - [cMacaddr] NVARCHAR (100) NOT NULL, - [cWmi] NVARCHAR (20) NOT NULL, - [cIdType] NVARCHAR (10) NOT NULL, - [cSupplierId] NVARCHAR (10) NOT NULL, - [cDc] NVARCHAR (20) NOT NULL, - [cTierCode] NVARCHAR (20) NOT NULL, - [cUnitCode] NVARCHAR (20) NOT NULL, - [cPublickey] NVARCHAR (1024) NOT NULL, - [cCertType] NVARCHAR (20) NOT NULL, - [cOriginTbscsr] NVARCHAR (4000) NOT NULL, - [cHashedTbscsr] NVARCHAR (1024) NOT NULL, - [cPcid] NVARCHAR (50) NOT NULL, - [cDn] NVARCHAR (250) NOT NULL, - [cDateTime] DATETIME2 (7) NOT NULL, +CREATE TABLE [dbo].[tVerifyResult] ( + [cCuid] BIGINT NOT NULL, + [cResult] NCHAR (20) NOT NULL, PRIMARY KEY CLUSTERED ([cCuid] ASC) ); @@ -317,6 +291,33 @@ CREATE TABLE [dbo].[tCertificate] ( ); +GO +PRINT N'테이블 [dbo].[tTbscsr]을(를) 만드는 중...'; + + +GO +CREATE TABLE [dbo].[tTbscsr] ( + [cCuid] BIGINT IDENTITY (1, 1) NOT NULL, + [cIftid] NVARCHAR (100) NOT NULL, + [cMacaddr] NVARCHAR (100) NOT NULL, + [cWmi] NVARCHAR (20) NOT NULL, + [cIdType] NVARCHAR (10) NOT NULL, + [cSupplierId] NVARCHAR (10) NOT NULL, + [cDc] NVARCHAR (20) NOT NULL, + [cTierCode] NVARCHAR (20) NOT NULL, + [cUnitCode] NVARCHAR (20) NOT NULL, + [cPublickey] NVARCHAR (1024) NOT NULL, + [cCertType] NVARCHAR (20) NOT NULL, + [cOriginTbscsr] NVARCHAR (4000) NOT NULL, + [cHashedTbscsr] NVARCHAR (1024) NOT NULL, + [cPcid] NVARCHAR (50) NOT NULL, + [cDn] NVARCHAR (250) NOT NULL, + [cHasCertificate] TINYINT NOT NULL, + [cDateTime] DATETIME2 (7) NOT NULL, + PRIMARY KEY CLUSTERED ([cCuid] ASC) +); + + GO -- 배포된 트랜잭션 로그를 사용하여 대상 서버를 업데이트하는 리팩터링 단계 diff --git a/Projects/VPKI/VPKI.DB/DBPatch/sqlScripts/dacpac/VPKI.DataDB.dacpac b/Projects/VPKI/VPKI.DB/DBPatch/sqlScripts/dacpac/VPKI.DataDB.dacpac index 3e648c892ea1655258044014354611e1b28bb8fd..7cda93dfc511ed1c89346a2de935f59d64c41c03 100644 GIT binary patch delta 2462 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 Y9q{k;qMQ+sU?WrP1Qa+Uz<>Yz4@^pj#sB~S delta 2438 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 => { - entity.HasKey(e => e.CCuid).HasName("PK__tCertifi__2AA00D94B11718A8"); + entity.HasKey(e => e.CCuid).HasName("PK__tCertifi__2AA00D94094D05AF"); entity.ToTable("tCertificate"); @@ -71,7 +71,7 @@ public partial class VpkiDataDbContext : DbContext modelBuilder.Entity(entity => { - entity.HasKey(e => e.CCuid).HasName("PK__tOcsp__2AA00D941E2BA200"); + entity.HasKey(e => e.CCuid).HasName("PK__tOcsp__2AA00D942266A4EC"); entity.ToTable("tOcsp"); @@ -90,7 +90,7 @@ public partial class VpkiDataDbContext : DbContext modelBuilder.Entity(entity => { - entity.HasKey(e => e.CCuid).HasName("PK__tTbscsr__2AA00D94155F4FC3"); + entity.HasKey(e => e.CCuid).HasName("PK__tTbscsr__2AA00D94D6B62535"); entity.ToTable("tTbscsr"); @@ -105,6 +105,7 @@ public partial class VpkiDataDbContext : DbContext entity.Property(e => e.CDn) .HasMaxLength(250) .HasColumnName("cDn"); + entity.Property(e => e.CHasCertificate).HasColumnName("cHasCertificate"); entity.Property(e => e.CHashedTbscsr) .HasMaxLength(1024) .HasColumnName("cHashedTbscsr"); @@ -142,7 +143,7 @@ public partial class VpkiDataDbContext : DbContext modelBuilder.Entity(entity => { - entity.HasKey(e => e.CCuid).HasName("PK__tVerifyR__2AA00D94A7EE4DE6"); + entity.HasKey(e => e.CCuid).HasName("PK__tVerifyR__2AA00D94F7E2869E"); entity.ToTable("tVerifyResult"); diff --git a/Projects/VPKI/VPKI/VPKI.Library.DB/DB/VPKI_DataDB/Tables/TTbscsr.cs b/Projects/VPKI/VPKI/VPKI.Library.DB/DB/VPKI_DataDB/Tables/TTbscsr.cs index e3c5cd2..2326a51 100644 --- a/Projects/VPKI/VPKI/VPKI.Library.DB/DB/VPKI_DataDB/Tables/TTbscsr.cs +++ b/Projects/VPKI/VPKI/VPKI.Library.DB/DB/VPKI_DataDB/Tables/TTbscsr.cs @@ -35,5 +35,7 @@ public partial class TTbscsr public string CDn { get; set; } = null!; + public byte CHasCertificate { get; set; } + public DateTime CDateTime { get; set; } } diff --git a/Projects/VPKI/VPKI/VPKI.Library/Services/CertificateService.cs b/Projects/VPKI/VPKI/VPKI.Library/Services/CertificateService.cs index 0d9f51a..dfc7e3b 100644 --- a/Projects/VPKI/VPKI/VPKI.Library/Services/CertificateService.cs +++ b/Projects/VPKI/VPKI/VPKI.Library/Services/CertificateService.cs @@ -558,42 +558,60 @@ namespace VPKI.Library.Services return derDecStr; } - public CsrHashedModel SignHashed02(string? csr, AsymmetricCipherKeyPair? keyPair) + public async Task SignHashed02(string? csr, AsymmetricCipherKeyPair? keyPair) { CsrHashedModel hashedCsr = new CsrHashedModel(); if (string.IsNullOrWhiteSpace(csr)) return hashedCsr; - List vnRHashVal = Convert.FromBase64String(csr).ToList(); - List vnSignedHash = GetBouncyCastleECDSASignedHashKey(vnRHashVal, GetPrivateKeyBC(keyPair), ECDSAType.SHA256WITHECDSA); - List vnDEREncVal = EncodeDERSignature_02(vnSignedHash); - bool bVerfRst = VerifyHashBC(vnSignedHash, vnRHashVal, GetPublicKeyBC(keyPair), ECDSAType.SHA256WITHECDSA); + await Task.Run(async () => { + List vnRHashVal = Convert.FromBase64String(csr).ToList(); + List vnSignedHash = GetBouncyCastleECDSASignedHashKey(vnRHashVal, GetPrivateKeyBC(keyPair), ECDSAType.SHA256WITHECDSA); + List vnDEREncVal = EncodeDERSignature_02(vnSignedHash); + bool bVerfRst = VerifyHashBC(vnSignedHash, vnRHashVal, GetPublicKeyBC(keyPair), ECDSAType.SHA256WITHECDSA); - hashedCsr.SignedCsr = GetKeyBase64Encrypted(vnSignedHash); - hashedCsr.EncodedSignedCsr = GetKeyBase64Encrypted(vnDEREncVal); - hashedCsr.Verify = bVerfRst; + hashedCsr.SignedCsr = GetKeyBase64Encrypted(vnSignedHash); + hashedCsr.EncodedSignedCsr = GetKeyBase64Encrypted(vnDEREncVal); + hashedCsr.Verify = bVerfRst; - var decoded = DecodeDERSignature_02(vnDEREncVal); + Log4net.WriteLine($"SignHashed02 csr::{csr}", LogType.Fatal); + Log4net.WriteLine($"SignHashed02 Public Key::{GetKeyBase64Encrypted(GetPublicKeyBC(keyPair)!.Q.GetEncoded()!.ToList())}", LogType.Fatal); + Log4net.WriteLine($"SignHashed02 SignedCsr::{hashedCsr.SignedCsr}", LogType.Fatal); + Log4net.WriteLine($"SignHashed02 EncodedSignedCsr::{hashedCsr.EncodedSignedCsr}", LogType.Fatal); + + var decoded = DecodeDERSignature_02(vnDEREncVal); + + await Task.CompletedTask; + }); return hashedCsr; } - public CsrHashedModel SignHashed20(string? csr, AsymmetricCipherKeyPair? keyPair) + public async Task SignHashed20(string? csr, AsymmetricCipherKeyPair? keyPair) { CsrHashedModel hashedCsr = new CsrHashedModel(); if (string.IsNullOrWhiteSpace(csr)) - return hashedCsr; + return hashedCsr; - List vnRHashVal = Convert.FromBase64String(csr).ToList(); - List vnSignedHash = GetBouncyCastleECDSASignedHashKey(vnRHashVal, GetPrivateKeyBC(keyPair), ECDSAType.NONEWITHECDSA); - List vnDEREncVal = EncodeDERSignature_20(vnSignedHash); - bool bVerfRst = VerifyHashBC(vnSignedHash, vnRHashVal, GetPublicKeyBC(keyPair), ECDSAType.NONEWITHECDSA); + await Task.Run(async () => + { + List vnRHashVal = Convert.FromBase64String(csr).ToList(); + List vnSignedHash = GetBouncyCastleECDSASignedHashKey(vnRHashVal, GetPrivateKeyBC(keyPair), ECDSAType.NONEWITHECDSA); + List vnDEREncVal = EncodeDERSignature_20(vnSignedHash); + bool bVerfRst = VerifyHashBC(vnSignedHash, vnRHashVal, GetPublicKeyBC(keyPair), ECDSAType.NONEWITHECDSA); - hashedCsr.SignedCsr = GetKeyBase64Encrypted(vnSignedHash); - hashedCsr.EncodedSignedCsr = GetKeyBase64Encrypted(vnDEREncVal); - hashedCsr.Verify = bVerfRst; + Log4net.WriteLine($"SignHashed20 csr::{csr}", LogType.Fatal); + Log4net.WriteLine($"SignHashed20 Public Key::{GetKeyBase64Encrypted(GetPublicKeyBC(keyPair)!.Q.GetEncoded()!.ToList())}", LogType.Fatal); + Log4net.WriteLine($"SignHashed20 bVerfRst::{bVerfRst}", LogType.Fatal); + + hashedCsr.SignedCsr = GetKeyBase64Encrypted(vnSignedHash); + hashedCsr.EncodedSignedCsr = GetKeyBase64Encrypted(vnDEREncVal); + hashedCsr.Verify = bVerfRst; + + await Task.CompletedTask; + }); return hashedCsr; } @@ -602,7 +620,7 @@ namespace VPKI.Library.Services { var signer = new ECDsaSigner(); - signer.Init(true, priKey); + signer.Init(true, priKey); var anSign = signer.GenerateSignature(vnRHashVal.ToArray()); byte[] signatureBytes = ConvertSignatureToByteArray(anSign); diff --git a/Projects/VPKI/VPKI/VPKI.Web.Api/Services/ISO15118_02Service.cs b/Projects/VPKI/VPKI/VPKI.Web.Api/Services/ISO15118_02Service.cs index 7f5f547..ba845df 100644 --- a/Projects/VPKI/VPKI/VPKI.Web.Api/Services/ISO15118_02Service.cs +++ b/Projects/VPKI/VPKI/VPKI.Web.Api/Services/ISO15118_02Service.cs @@ -82,6 +82,7 @@ namespace VPKI.Web.Api.Services COriginTbscsr = csrOrigin, CHashedTbscsr = tbaCsrHashed, CPcid = pcid, + CHasCertificate = 0, CDn = $"{dn}", CDateTime = DateTime.Now @@ -159,7 +160,7 @@ namespace VPKI.Web.Api.Services string cCertType = "prov_v1"; TTbscsr tbscsr = new TTbscsr(); - foreach (var csr in await context.TTbscsrs.AsNoTracking().Where(x => x.CCertType == cCertType).OrderByDescending(x => x.CCuid).ToListAsync()) + foreach (var csr in await context.TTbscsrs.Where(x => x.CCertType == cCertType && x.CHasCertificate == 0).Take(1000).OrderByDescending(x => x.CCuid).ToListAsync()) { try { @@ -177,10 +178,19 @@ namespace VPKI.Web.Api.Services tbscsr = csr; break; } + else + { + var publicKeyPem = $"{_certificateService.ConvertToPEM(Convert.FromBase64String(csr.CPublickey))}"; + Log4net.WriteLine($"Failed HashedTbscsr::{csr.CHashedTbscsr}", LogType.Fatal); + Log4net.WriteLine($"Failed Signature::{request.csrsignature}", LogType.Fatal); + Log4net.WriteLine($"Failed PublicKey::{csr.CPublickey}", LogType.Fatal); + Log4net.WriteLine($"Failed PublicKey::{publicKeyPem}", LogType.Fatal); + } } catch (Exception e) - { - e.ToString(); + { + Log4net.WriteLine($"RequestCertificate Exception::{csr.CHashedTbscsr}", LogType.Error); + Log4net.WriteLine(e); } } @@ -239,6 +249,9 @@ namespace VPKI.Web.Api.Services CDateTime = DateTime.Now }; await context.AddAsync(certificate); + + tbscsr.CHasCertificate = 1; + context.Update(tbscsr); } transactionResult = await context.CloseTransactionAsync(transaction); } @@ -266,7 +279,7 @@ namespace VPKI.Web.Api.Services else { response.status = Status.error.ToString(); - response.message += "verify fialed"; + response.message += "verify failed"; } //db error diff --git a/Projects/VPKI/VPKI/VPKI.Web.Api/Services/ISO15118_20Service.cs b/Projects/VPKI/VPKI/VPKI.Web.Api/Services/ISO15118_20Service.cs index 6348886..155a49f 100644 --- a/Projects/VPKI/VPKI/VPKI.Web.Api/Services/ISO15118_20Service.cs +++ b/Projects/VPKI/VPKI/VPKI.Web.Api/Services/ISO15118_20Service.cs @@ -89,6 +89,7 @@ namespace VPKI.Web.Api.Services COriginTbscsr = csrOrigin, CHashedTbscsr = tbaCsrHashed, CPcid = pcid, + CHasCertificate = 0, CDn = $"{dn}", CDateTime = DateTime.Now @@ -170,7 +171,7 @@ namespace VPKI.Web.Api.Services string cCertType = vpkiType.ToString(); TTbscsr tbscsr = new TTbscsr(); - foreach (var csr in await context.TTbscsrs.AsNoTracking().Where(x => x.CCertType == cCertType).OrderByDescending(x => x.CCuid).ToListAsync()) + foreach (var csr in await context.TTbscsrs.Where(x => x.CCertType == cCertType && x.CHasCertificate == 0).Take(1000).OrderByDescending(x => x.CCuid).ToListAsync()) { try { @@ -188,10 +189,19 @@ namespace VPKI.Web.Api.Services tbscsr = csr; break; } + else + { + var publicKeyPem = $"{_certificateService.ConvertToPEM(Convert.FromBase64String(csr.CPublickey))}"; + Log4net.WriteLine($"Failed HashedTbscsr::{csr.CHashedTbscsr}", LogType.Fatal); + Log4net.WriteLine($"Failed Signature::{request.csrsignature}", LogType.Fatal); + Log4net.WriteLine($"Failed PublicKey::{csr.CPublickey}", LogType.Fatal); + Log4net.WriteLine($"Failed PublicKey::{publicKeyPem}", LogType.Fatal); + } } catch (Exception e) { - e.ToString(); + Log4net.WriteLine($"RequestCertificate Exception::{csr.CHashedTbscsr}", LogType.Error); + Log4net.WriteLine(e); } } @@ -249,6 +259,9 @@ namespace VPKI.Web.Api.Services CDateTime = DateTime.Now }; await context.AddAsync(certificate); + + tbscsr.CHasCertificate = 1; + context.Update(tbscsr); } transactionResult = await context.CloseTransactionAsync(transaction); } @@ -257,7 +270,7 @@ namespace VPKI.Web.Api.Services else { response.status = Status.error.ToString(); - response.message += "verify fialed"; + response.message += "verify failed"; } //db error diff --git a/Projects/VPKI/VPKI/VPKI.Web.Api/appsettings.Development.json b/Projects/VPKI/VPKI/VPKI.Web.Api/appsettings.Development.json index 0c208ae..e98bffb 100644 --- a/Projects/VPKI/VPKI/VPKI.Web.Api/appsettings.Development.json +++ b/Projects/VPKI/VPKI/VPKI.Web.Api/appsettings.Development.json @@ -2,7 +2,8 @@ "Logging": { "LogLevel": { "Default": "Information", - "Microsoft.AspNetCore": "Warning" + "Microsoft.AspNetCore": "Warning", + "Microsoft.EntityFrameworkCore.Database": "None" } } } diff --git a/Projects/VPKI/VPKI/VPKI.Web.Api/appsettings.json b/Projects/VPKI/VPKI/VPKI.Web.Api/appsettings.json index 10f68b8..449fbf5 100644 --- a/Projects/VPKI/VPKI/VPKI.Web.Api/appsettings.json +++ b/Projects/VPKI/VPKI/VPKI.Web.Api/appsettings.json @@ -2,7 +2,8 @@ "Logging": { "LogLevel": { "Default": "Information", - "Microsoft.AspNetCore": "Warning" + "Microsoft.AspNetCore": "Warning", + "Microsoft.EntityFrameworkCore.Database": "None" } }, "AllowedHosts": "*" diff --git a/Projects/VPKI/VPKI/VPKI.Web.Client/Components/Module/VPKIApiCertificate.razor b/Projects/VPKI/VPKI/VPKI.Web.Client/Components/Module/VPKIApiCertificate.razor index 4b0f43b..0eb820a 100644 --- a/Projects/VPKI/VPKI/VPKI.Web.Client/Components/Module/VPKIApiCertificate.razor +++ b/Projects/VPKI/VPKI/VPKI.Web.Client/Components/Module/VPKIApiCertificate.razor @@ -113,12 +113,13 @@ CreateCsrHash(ecdsa); } - public void OnClickSignedHash() + public async Task OnClickSignedHash() { - SignedHash(); + await SignedHash(); + await InvokeAsync(StateHasChanged); } - private void SignedHash() + private async Task SignedHash() { if (TbscsrContainer.KeyPair != null && TbscsrContainer.ResponseTbscsr.data != null) { @@ -129,12 +130,12 @@ { ecdsa = ECDSAType.SHA256WITHECDSA.ToString(); var pKey = TbscsrContainer.PublicKey; - CertificateContainer.CsrHashed = CertificateService.SignHashed02(TbscsrContainer.ResponseTbscsr.data.hashedtbscsr, TbscsrContainer.KeyPair); + CertificateContainer.CsrHashed = await CertificateService.SignHashed02(TbscsrContainer.ResponseTbscsr.data.hashedtbscsr, TbscsrContainer.KeyPair); } else if (TbscsrContainer.VpkiType == VpkiType.prov_cert || TbscsrContainer.VpkiType == VpkiType.vehicle_cert) { ecdsa = ECDSAType.NONEWITHECDSA.ToString(); - CertificateContainer.CsrHashed = CertificateService.SignHashed20(TbscsrContainer.ResponseTbscsr.data.hashedtbscsr, TbscsrContainer.KeyPair); + CertificateContainer.CsrHashed = await CertificateService.SignHashed20(TbscsrContainer.ResponseTbscsr.data.hashedtbscsr, TbscsrContainer.KeyPair); } CreateCsrHash(ecdsa); @@ -161,7 +162,7 @@ } } - public void OnClickGenerateCertificate() + public async Task OnClickGenerateCertificate() { CertificateContainer.RequestCertificate.csrsignature = CertificateContainer.CsrHashed.EncodedSignedCsr; if (TbscsrContainer.VpkiType == VpkiType.prov_cert || TbscsrContainer.VpkiType == VpkiType.vehicle_cert) @@ -170,6 +171,8 @@ } CertificateContainer.StrRequest = $"{CertificateContainer.RequestCertificate.ToJson()}"; + + await InvokeAsync(StateHasChanged); } public async Task OnClickSendCertificate() @@ -210,6 +213,7 @@ TbscsrContainer.StrResponse = $"Request Context Error{Environment.NewLine}{ex.Message}"; } + await InvokeAsync(StateHasChanged); DialogService.CloseIndicator(); } } diff --git a/Projects/VPKI/VPKI/VPKI.Web.Client/Components/Module/VPKIApiTbscsr.razor b/Projects/VPKI/VPKI/VPKI.Web.Client/Components/Module/VPKIApiTbscsr.razor index e332d97..ccf1009 100644 --- a/Projects/VPKI/VPKI/VPKI.Web.Client/Components/Module/VPKIApiTbscsr.razor +++ b/Projects/VPKI/VPKI/VPKI.Web.Client/Components/Module/VPKIApiTbscsr.razor @@ -112,10 +112,12 @@ } //mac address - public void OnClickRandomMacaddresss() + public async Task OnClickRandomMacaddresss() { var randomMac = CreateRandomMacAddress(); TbscsrContainer.RequestTbscsr.cnInfo.macaddr = randomMac; + + await InvokeAsync(StateHasChanged); } private string CreateRandomMacAddress() @@ -127,12 +129,13 @@ } //generate key - public void OnClickGenerateKey() + public async Task OnClickGenerateKey() { - GenerateKey(); + await GenerateKey(); + await InvokeAsync(StateHasChanged); } - private void GenerateKey() + private async Task GenerateKey() { if (TbscsrContainer.ISOType == VpkiIsoType.ISO15118_02) { @@ -159,6 +162,8 @@ var publicKey = (ECPublicKeyParameters)TbscsrContainer.KeyPair.Public; SetKeyPairString(); + + await Task.CompletedTask; } private void SetKeyPairString() @@ -170,10 +175,12 @@ } //request tbscsr - public void OnClickGenerateTbscsr() + public async Task OnClickGenerateTbscsr() { TbscsrContainer.RequestTbscsr.publickey = TbscsrContainer.PublicKey; TbscsrContainer.StrRequest = $"{TbscsrContainer.RequestTbscsr.ToJson()}"; + + await InvokeAsync(StateHasChanged); } public async Task OnClickSendTbscsr() @@ -215,6 +222,7 @@ Log4net.WriteLine(ex); TbscsrContainer.StrResponse = $"Request Context Error{Environment.NewLine}{ex.Message}"; } + await InvokeAsync(StateHasChanged); DialogService.CloseIndicator(); } } diff --git a/Projects/VPKI/VPKI/VPKI.Web.Client/Components/Pages/Utils.razor b/Projects/VPKI/VPKI/VPKI.Web.Client/Components/Pages/Utils.razor new file mode 100644 index 0000000..7285205 --- /dev/null +++ b/Projects/VPKI/VPKI/VPKI.Web.Client/Components/Pages/Utils.razor @@ -0,0 +1,66 @@ +@page "/vpki/utils" +@using System.Security.Cryptography + +

Utils

+ + + +
+
+ + +
+
+ +
+
+ +
+
+ + +
+
+
+ + + +
+ +@code { + private string PubicKey = string.Empty; + private string HashdCsr = string.Empty; + private string Signature = string.Empty; + private bool IsVerify = false; + + private async Task OnClickVerify02() + { + using (ECDsa ecdsa = ECDsa.Create(ECCurve.NamedCurves.nistP256)) + { + //var publicKeyPem = $"{_certificateService.ConvertToPEM(Convert.FromBase64String(csr.CPublickey))}"; + ecdsa.ImportSubjectPublicKeyInfo(Convert.FromBase64String(PubicKey), out _); + + var hachedTbsCsr = Convert.FromBase64String(HashdCsr); + IsVerify = ecdsa.VerifyHash(hachedTbsCsr, Convert.FromBase64String($"{Signature}")); + } + + await Task.Delay(1); + } + + private async Task OnClickVerify20() + { + using (ECDsa ecdsa = ECDsa.Create(ECCurve.NamedCurves.nistP521)) + { + //var publicKeyPem = $"{_certificateService.ConvertToPEM(Convert.FromBase64String(csr.CPublickey))}"; + ecdsa.ImportSubjectPublicKeyInfo(Convert.FromBase64String(PubicKey), out _); + + var hachedTbsCsr = Convert.FromBase64String(HashdCsr); + IsVerify = ecdsa.VerifyHash(hachedTbsCsr, Convert.FromBase64String($"{Signature}")); + } + + await Task.Delay(1); + } +} diff --git a/Projects/VPKI/VPKI/VPKI.Web.Client/Components/Pages/VPKIApi.razor b/Projects/VPKI/VPKI/VPKI.Web.Client/Components/Pages/VPKIApi.razor index b5205a3..776d678 100644 --- a/Projects/VPKI/VPKI/VPKI.Web.Client/Components/Pages/VPKIApi.razor +++ b/Projects/VPKI/VPKI/VPKI.Web.Client/Components/Pages/VPKIApi.razor @@ -23,11 +23,11 @@ @foreach (var vpkiType in Enum.GetValues(typeof(VpkiType))) - { + { if (DicTbscsrContainer.TryGetValue((VpkiType)vpkiType, out var outTbscsr) == true && DicCertificateContainer.TryGetValue((VpkiType)vpkiType, out var outCertificate) == true && DicVerifyResultContainer.TryGetValue((VpkiType)vpkiType, out var outVeryfiResult) == true) - { + {
@@ -73,25 +73,25 @@ while (true) { //tbscsr - await Task.Delay(3000); + await Task.Delay(10000); if (isAutoRun == false) continue; - await InvokeAsync(() => refVPKIApiTbscsr.OnClickRandomMacaddresss()); - await Task.Delay(100); - await InvokeAsync(() => refVPKIApiTbscsr.OnClickGenerateKey()); - await Task.Delay(100); - await InvokeAsync(() => refVPKIApiTbscsr.OnClickGenerateTbscsr()); - await Task.Delay(100); + await InvokeAsync(async() => await refVPKIApiTbscsr.OnClickRandomMacaddresss()); + await Task.Delay(300); + await InvokeAsync(async() => await refVPKIApiTbscsr.OnClickGenerateKey()); + await Task.Delay(300); + await InvokeAsync(async() => await refVPKIApiTbscsr.OnClickGenerateTbscsr()); + await Task.Delay(300); await InvokeAsync(async () => await refVPKIApiTbscsr.OnClickSendTbscsr()); - await Task.Delay(2000); + await Task.Delay(10000); //certificate - await InvokeAsync(() => refVPKIApiCertificate.OnClickSignedHash()); - await Task.Delay(100); - await InvokeAsync(() => refVPKIApiCertificate.OnClickGenerateCertificate()); - await Task.Delay(100); + await InvokeAsync(async() => await refVPKIApiCertificate.OnClickSignedHash()); + await Task.Delay(300); + await InvokeAsync(async() => await refVPKIApiCertificate.OnClickGenerateCertificate()); + await Task.Delay(300); await InvokeAsync(async () => await refVPKIApiCertificate.OnClickSendCertificate()); cnt += 1;