mirror of
https://github.com/wismna/ModernKeePass.git
synced 2025-10-03 23:50:18 -04:00
Write-mode is finally working!!!
Lib uses BouncyCastle crypto
This commit is contained in:
@@ -43,6 +43,12 @@ using Org.BouncyCastle.Crypto.Parameters;
|
||||
#endif
|
||||
|
||||
using ModernKeePassLibPCL.Resources;
|
||||
using Org.BouncyCastle.Crypto;
|
||||
using Org.BouncyCastle.Crypto.Engines;
|
||||
using Org.BouncyCastle.Crypto.IO;
|
||||
using Org.BouncyCastle.Crypto.Modes;
|
||||
using Org.BouncyCastle.Crypto.Paddings;
|
||||
using Org.BouncyCastle.Crypto.Parameters;
|
||||
|
||||
namespace ModernKeePassLibPCL.Cryptography.Cipher
|
||||
{
|
||||
@@ -123,8 +129,8 @@ namespace ModernKeePassLibPCL.Cryptography.Cipher
|
||||
|
||||
byte[] pbLocalKey = new byte[32];
|
||||
Array.Copy(pbKey, pbLocalKey, 32);
|
||||
|
||||
#if ModernKeePassLibPCL
|
||||
#if !ModernKeePassLibPCL
|
||||
//#if ModernKeePassLibPCL
|
||||
/*var provider = WinRTCrypto.SymmetricKeyAlgorithmProvider.
|
||||
OpenAlgorithm(SymmetricAlgorithm.AesCbcPkcs7);
|
||||
var key = provider.CreateSymmetricKey(pbLocalKey);
|
||||
@@ -140,9 +146,11 @@ namespace ModernKeePassLibPCL.Cryptography.Cipher
|
||||
return new CryptoStream(s, decryptor, CryptoStreamMode.Read);
|
||||
}
|
||||
*/
|
||||
|
||||
var provider = SymmetricKeyAlgorithmProvider.
|
||||
OpenAlgorithm(SymmetricAlgorithmNames.AesCbcPkcs7);
|
||||
var key = provider.CreateSymmetricKey(CryptographicBuffer.CreateFromByteArray(pbLocalKey));
|
||||
|
||||
using (var ms = new MemoryStream())
|
||||
{
|
||||
s.CopyTo(ms);
|
||||
@@ -152,18 +160,21 @@ namespace ModernKeePassLibPCL.Cryptography.Cipher
|
||||
{
|
||||
var encrypted = CryptographicEngine.Encrypt(key, data, CryptographicBuffer.CreateFromByteArray(pbLocalIV));
|
||||
CryptographicBuffer.CopyToByteArray(encrypted, out resultByteArray);
|
||||
return new MemoryStream(resultByteArray);
|
||||
}
|
||||
else
|
||||
{
|
||||
var decrypted = CryptographicEngine.Decrypt(key, data, CryptographicBuffer.CreateFromByteArray(pbLocalIV));
|
||||
CryptographicBuffer.CopyToByteArray(decrypted, out resultByteArray);
|
||||
}
|
||||
return new MemoryStream(resultByteArray, true);
|
||||
}
|
||||
}
|
||||
#else
|
||||
|
||||
//#else
|
||||
|
||||
#if !KeePassRT
|
||||
RijndaelManaged r = new RijndaelManaged();
|
||||
//#if !KeePassRT
|
||||
//#if !ModernKeePassLibPCL
|
||||
RijndaelManaged r = new RijndaelManaged();
|
||||
if(r.BlockSize != 128) // AES block size
|
||||
{
|
||||
Debug.Assert(false);
|
||||
@@ -183,6 +194,7 @@ namespace ModernKeePassLibPCL.Cryptography.Cipher
|
||||
return new CryptoStream(s, iTransform, bEncrypt ? CryptoStreamMode.Write :
|
||||
CryptoStreamMode.Read);
|
||||
#else
|
||||
|
||||
AesEngine aes = new AesEngine();
|
||||
CbcBlockCipher cbc = new CbcBlockCipher(aes);
|
||||
PaddedBufferedBlockCipher bc = new PaddedBufferedBlockCipher(cbc,
|
||||
@@ -196,7 +208,7 @@ namespace ModernKeePassLibPCL.Cryptography.Cipher
|
||||
return new CipherStream(s, cpRead, cpWrite);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
//#endif
|
||||
}
|
||||
|
||||
public Stream EncryptStream(Stream sPlainText, byte[] pbKey, byte[] pbIV)
|
||||
|
@@ -23,13 +23,16 @@ using System.Text;
|
||||
using System.IO;
|
||||
#if ModernKeePassLibPCL
|
||||
using Windows.Security.Cryptography;
|
||||
using Windows.Security.Cryptography.Core;
|
||||
using Org.BouncyCastle.Crypto;
|
||||
using Org.BouncyCastle.Crypto.Digests;
|
||||
#else
|
||||
using System.Security.Cryptography;
|
||||
#endif
|
||||
using System.Diagnostics;
|
||||
|
||||
using System.Runtime.InteropServices.ComTypes;
|
||||
using ModernKeePassLibPCL.Utility;
|
||||
using Windows.Security.Cryptography.Core;
|
||||
using Org.BouncyCastle.Crypto.Tls;
|
||||
|
||||
namespace ModernKeePassLibPCL.Cryptography
|
||||
{
|
||||
@@ -39,7 +42,8 @@ namespace ModernKeePassLibPCL.Cryptography
|
||||
private bool m_bWriting;
|
||||
#if ModernKeePassLibPCL
|
||||
//private ICryptoTransform m_hash;
|
||||
private CryptographicHash m_hash;
|
||||
//private CryptographicHash m_hash;
|
||||
private IDigest m_hash;
|
||||
#else
|
||||
private HashAlgorithm m_hash;
|
||||
#endif
|
||||
@@ -53,7 +57,7 @@ namespace ModernKeePassLibPCL.Cryptography
|
||||
|
||||
public override bool CanRead
|
||||
{
|
||||
get { return /*!m_bWriting;*/true; }
|
||||
get { return !m_bWriting; }
|
||||
}
|
||||
|
||||
public override bool CanSeek
|
||||
@@ -91,7 +95,8 @@ namespace ModernKeePassLibPCL.Cryptography
|
||||
m_bWriting = bWriting;
|
||||
#if ModernKeePassLibPCL
|
||||
//m_hash = WinRTCrypto.HashAlgorithmProvider.OpenAlgorithm(hashAlgorithm ?? HashAlgorithm.Sha256).CreateHash();
|
||||
m_hash = HashAlgorithmProvider.OpenAlgorithm(hashAlgorithm ?? HashAlgorithmNames.Sha256).CreateHash();
|
||||
//m_hash = HashAlgorithmProvider.OpenAlgorithm(hashAlgorithm ?? HashAlgorithmNames.Sha256).CreateHash();
|
||||
m_hash = new Sha256Digest();
|
||||
#elif !KeePassLibSD
|
||||
m_hash = (hashAlgorithm ?? new SHA256Managed());
|
||||
#else // KeePassLibSD
|
||||
@@ -135,7 +140,10 @@ namespace ModernKeePassLibPCL.Cryptography
|
||||
//m_hash.TransformFinalBlock(new byte[0], 0, 0);
|
||||
#if ModernKeePassLibPCL
|
||||
//m_pbFinalHash = (m_hash as CryptographicHash).GetValueAndReset ();
|
||||
CryptographicBuffer.CopyToByteArray(m_hash.GetValueAndReset(), out m_pbFinalHash);
|
||||
//CryptographicBuffer.CopyToByteArray(m_hash.GetValueAndReset(), out m_pbFinalHash);
|
||||
m_pbFinalHash = new byte[32];
|
||||
m_hash.DoFinal(m_pbFinalHash, 0);
|
||||
m_hash.Reset();
|
||||
#else
|
||||
m_pbFinalHash = m_hash.Hash;
|
||||
#endif
|
||||
@@ -160,7 +168,7 @@ namespace ModernKeePassLibPCL.Cryptography
|
||||
|
||||
public override int Read(byte[] pbBuffer, int nOffset, int nCount)
|
||||
{
|
||||
//if(m_bWriting) throw new InvalidOperationException();
|
||||
if(m_bWriting) throw new InvalidOperationException();
|
||||
|
||||
int nRead = m_sBaseStream.Read(pbBuffer, nOffset, nCount);
|
||||
int nPartialRead = nRead;
|
||||
@@ -178,7 +186,8 @@ namespace ModernKeePassLibPCL.Cryptography
|
||||
|
||||
if((m_hash != null) && (nRead > 0))
|
||||
//m_hash.TransformBlock(pbBuffer, nOffset, nRead, pbBuffer, nOffset);
|
||||
m_hash.Append(CryptographicBuffer.CreateFromByteArray(pbBuffer));
|
||||
//m_hash.Append(CryptographicBuffer.CreateFromByteArray(pbBuffer));
|
||||
m_hash.BlockUpdate(pbBuffer, nOffset, nRead);
|
||||
|
||||
#if DEBUG
|
||||
Debug.Assert(MemUtil.ArraysEqual(pbBuffer, pbOrg));
|
||||
@@ -198,10 +207,10 @@ namespace ModernKeePassLibPCL.Cryptography
|
||||
|
||||
if ((m_hash != null) && (nCount > 0))
|
||||
//m_hash.TransformBlock(pbBuffer, nOffset, nCount, pbBuffer, nOffset);
|
||||
m_hash.Append(CryptographicBuffer.CreateFromByteArray(pbBuffer));
|
||||
|
||||
//m_hash.Append(CryptographicBuffer.CreateFromByteArray(pbBuffer));
|
||||
m_hash.BlockUpdate(pbBuffer, nOffset, nCount);
|
||||
#if DEBUG
|
||||
Debug.Assert(MemUtil.ArraysEqual(pbBuffer, pbOrg));
|
||||
Debug.Assert(MemUtil.ArraysEqual(pbBuffer, pbOrg));
|
||||
#endif
|
||||
|
||||
m_sBaseStream.Write(pbBuffer, nOffset, nCount);
|
||||
|
@@ -322,7 +322,7 @@ namespace ModernKeePassLibPCL.Keys
|
||||
|
||||
#if ModernKeePassLibPCL
|
||||
var settings = new XmlWriterSettings() { Encoding = StrUtil.Utf8 };
|
||||
var xtw = XmlWriter.Create(sOut.AsStream(), settings);
|
||||
var xtw = XmlWriter.Create(sOut, settings);
|
||||
#else
|
||||
XmlTextWriter xtw = new XmlTextWriter(sOut, StrUtil.Utf8);
|
||||
#endif
|
||||
|
@@ -1,9 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup Condition="'$(NuGetPackageRoot)' == ''">
|
||||
<NuGetPackageRoot>$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
|
||||
</PropertyGroup>
|
||||
<ImportGroup>
|
||||
<Import Project="$(NuGetPackageRoot)\Microsoft.Bcl.Build\1.0.21\build\Microsoft.Bcl.Build.targets" Condition="Exists('$(NuGetPackageRoot)\Microsoft.Bcl.Build\1.0.21\build\Microsoft.Bcl.Build.targets')" />
|
||||
</ImportGroup>
|
||||
</Project>
|
@@ -129,7 +129,7 @@ namespace ModernKeePassLibPCL.Serialization
|
||||
try
|
||||
{
|
||||
if(s == null) return null;
|
||||
using (var sr = new StreamReader(s.AsStream(), StrUtil.Utf8))
|
||||
using (var sr = new StreamReader(s, StrUtil.Utf8))
|
||||
{
|
||||
string str = sr.ReadToEnd();
|
||||
if (str == null)
|
||||
@@ -179,7 +179,7 @@ namespace ModernKeePassLibPCL.Serialization
|
||||
{
|
||||
byte[] pbFile = StrUtil.Utf8.GetBytes(sb.ToString());
|
||||
if (s == null) throw new IOException(iocLockFile.GetDisplayName());
|
||||
s.WriteAsync(pbFile.AsBuffer()).GetAwaiter().GetResult();
|
||||
s.WriteAsync(pbFile, 0, pbFile.Length).GetAwaiter().GetResult();
|
||||
}
|
||||
|
||||
return lfi;
|
||||
|
@@ -79,7 +79,7 @@ namespace ModernKeePassLibPCL.Serialization
|
||||
else m_iocTemp = m_iocBase;
|
||||
}
|
||||
|
||||
public IRandomAccessStream OpenWrite()
|
||||
public Stream OpenWrite()
|
||||
{
|
||||
if(!m_bTransacted) m_bMadeUnhidden = UrlUtil.UnhideFile(m_iocTemp.Path);
|
||||
else // m_bTransacted
|
||||
@@ -100,7 +100,7 @@ namespace ModernKeePassLibPCL.Serialization
|
||||
}
|
||||
}
|
||||
|
||||
private async void CommitWriteTransaction()
|
||||
private void CommitWriteTransaction()
|
||||
{
|
||||
bool bMadeUnhidden = UrlUtil.UnhideFile(m_iocBase.Path);
|
||||
|
||||
|
@@ -422,7 +422,7 @@ namespace ModernKeePassLibPCL.Serialization
|
||||
new Uri(ioc.Path)));
|
||||
}
|
||||
#else
|
||||
public static IRandomAccessStream OpenRead(IOConnectionInfo ioc)
|
||||
public static Stream OpenRead(IOConnectionInfo ioc)
|
||||
{
|
||||
RaiseIOAccessPreEvent(ioc, IOAccessType.Read);
|
||||
|
||||
@@ -430,9 +430,9 @@ namespace ModernKeePassLibPCL.Serialization
|
||||
}
|
||||
#endif
|
||||
|
||||
private static IRandomAccessStream OpenReadLocal(IOConnectionInfo ioc)
|
||||
private static Stream OpenReadLocal(IOConnectionInfo ioc)
|
||||
{
|
||||
return ioc.StorageFile.OpenAsync(FileAccessMode.Read).GetAwaiter().GetResult();
|
||||
return ioc.StorageFile.OpenAsync(FileAccessMode.Read).GetAwaiter().GetResult().AsStream();
|
||||
}
|
||||
|
||||
#if (!ModernKeePassLibPCL && !KeePassLibSD && !KeePassRT)
|
||||
@@ -458,7 +458,7 @@ namespace ModernKeePassLibPCL.Serialization
|
||||
return IocStream.WrapIfRequired(s);
|
||||
}
|
||||
#else
|
||||
public static IRandomAccessStream OpenWrite(IOConnectionInfo ioc)
|
||||
public static Stream OpenWrite(IOConnectionInfo ioc)
|
||||
{
|
||||
RaiseIOAccessPreEvent(ioc, IOAccessType.Write);
|
||||
|
||||
@@ -466,9 +466,9 @@ namespace ModernKeePassLibPCL.Serialization
|
||||
}
|
||||
#endif
|
||||
|
||||
private static IRandomAccessStream OpenWriteLocal(IOConnectionInfo ioc)
|
||||
private static Stream OpenWriteLocal(IOConnectionInfo ioc)
|
||||
{
|
||||
return ioc.StorageFile.OpenAsync(FileAccessMode.ReadWrite).GetAwaiter().GetResult();
|
||||
return ioc.StorageFile.OpenAsync(FileAccessMode.ReadWrite).GetAwaiter().GetResult().AsStream();
|
||||
}
|
||||
|
||||
public static bool FileExists(IOConnectionInfo ioc)
|
||||
@@ -546,7 +546,7 @@ namespace ModernKeePassLibPCL.Serialization
|
||||
#endif
|
||||
public static byte[] ReadFile(IOConnectionInfo ioc)
|
||||
{
|
||||
IRandomAccessStream sIn = null;
|
||||
Stream sIn = null;
|
||||
MemoryStream ms = null;
|
||||
try
|
||||
{
|
||||
@@ -555,7 +555,7 @@ namespace ModernKeePassLibPCL.Serialization
|
||||
|
||||
ms = new MemoryStream();
|
||||
|
||||
MemUtil.CopyStream(sIn.AsStream(), ms);
|
||||
MemUtil.CopyStream(sIn, ms);
|
||||
|
||||
return ms.ToArray();
|
||||
}
|
||||
|
@@ -71,7 +71,7 @@ namespace ModernKeePassLibPCL.Serialization
|
||||
/// a KDBX stream.</param>
|
||||
/// <param name="kdbFormat">Format specifier.</param>
|
||||
/// <param name="slLogger">Status logger (optional).</param>
|
||||
public void Load(IRandomAccessStream sSource, KdbxFormat kdbFormat, IStatusLogger slLogger)
|
||||
public void Load(Stream sSource, KdbxFormat kdbFormat, IStatusLogger slLogger)
|
||||
{
|
||||
Debug.Assert(sSource != null);
|
||||
if(sSource == null) throw new ArgumentNullException("sSource");
|
||||
@@ -79,7 +79,7 @@ namespace ModernKeePassLibPCL.Serialization
|
||||
m_format = kdbFormat;
|
||||
m_slLogger = slLogger;
|
||||
|
||||
HashingStreamEx hashedStream = new HashingStreamEx(sSource.AsStream(), false, null);
|
||||
HashingStreamEx hashedStream = new HashingStreamEx(sSource, false, null);
|
||||
|
||||
UTF8Encoding encNoBom = StrUtil.Utf8;
|
||||
try
|
||||
@@ -165,7 +165,7 @@ namespace ModernKeePassLibPCL.Serialization
|
||||
finally { CommonCleanUpRead(sSource, hashedStream); }
|
||||
}
|
||||
|
||||
private void CommonCleanUpRead(IRandomAccessStream sSource, HashingStreamEx hashedStream)
|
||||
private void CommonCleanUpRead(Stream sSource, HashingStreamEx hashedStream)
|
||||
{
|
||||
hashedStream.Dispose();
|
||||
m_pbHashOfFileOnDisk = hashedStream.Hash;
|
||||
@@ -376,7 +376,7 @@ namespace ModernKeePassLibPCL.Serialization
|
||||
}
|
||||
|
||||
[Obsolete]
|
||||
public static List<PwEntry> ReadEntries(PwDatabase pwDatabase, IRandomAccessStream msData)
|
||||
public static List<PwEntry> ReadEntries(PwDatabase pwDatabase, Stream msData)
|
||||
{
|
||||
return ReadEntries(msData);
|
||||
}
|
||||
@@ -386,7 +386,7 @@ namespace ModernKeePassLibPCL.Serialization
|
||||
/// </summary>
|
||||
/// <param name="msData">Input stream to read the entries from.</param>
|
||||
/// <returns>Extracted entries.</returns>
|
||||
public static List<PwEntry> ReadEntries(IRandomAccessStream msData)
|
||||
public static List<PwEntry> ReadEntries(Stream msData)
|
||||
{
|
||||
/* KdbxFile f = new KdbxFile(pwDatabase);
|
||||
f.m_format = KdbxFormat.PlainXml;
|
||||
|
@@ -77,7 +77,7 @@ namespace ModernKeePassLibPCL.Serialization
|
||||
/// be written.</param>
|
||||
/// <param name="format">Format of the file to create.</param>
|
||||
/// <param name="slLogger">Logger that recieves status information.</param>
|
||||
public void Save(IRandomAccessStream sSaveTo, PwGroup pgDataSource, KdbxFormat format,
|
||||
public void Save(Stream sSaveTo, PwGroup pgDataSource, KdbxFormat format,
|
||||
IStatusLogger slLogger)
|
||||
{
|
||||
Debug.Assert(sSaveTo != null);
|
||||
@@ -86,7 +86,7 @@ namespace ModernKeePassLibPCL.Serialization
|
||||
m_format = format;
|
||||
m_slLogger = slLogger;
|
||||
|
||||
HashingStreamEx hashedStream = new HashingStreamEx(sSaveTo.AsStream(), true, null);
|
||||
HashingStreamEx hashedStream = new HashingStreamEx(sSaveTo, true, null);
|
||||
|
||||
UTF8Encoding encNoBom = StrUtil.Utf8;
|
||||
CryptoRandom cr = CryptoRandom.Instance;
|
||||
@@ -146,7 +146,7 @@ namespace ModernKeePassLibPCL.Serialization
|
||||
finally { CommonCleanUpWrite(sSaveTo, hashedStream); }
|
||||
}
|
||||
|
||||
private void CommonCleanUpWrite(IRandomAccessStream sSaveTo, HashingStreamEx hashedStream)
|
||||
private void CommonCleanUpWrite(Stream sSaveTo, HashingStreamEx hashedStream)
|
||||
{
|
||||
hashedStream.Dispose();
|
||||
m_pbHashOfFileOnDisk = hashedStream.Hash;
|
||||
@@ -836,7 +836,7 @@ namespace ModernKeePassLibPCL.Serialization
|
||||
}
|
||||
|
||||
[Obsolete]
|
||||
public static bool WriteEntries(IRandomAccessStream msOutput, PwDatabase pwDatabase,
|
||||
public static bool WriteEntries(Stream msOutput, PwDatabase pwDatabase,
|
||||
PwEntry[] vEntries)
|
||||
{
|
||||
return WriteEntries(msOutput, vEntries);
|
||||
@@ -849,7 +849,7 @@ namespace ModernKeePassLibPCL.Serialization
|
||||
/// <param name="vEntries">Entries to serialize.</param>
|
||||
/// <returns>Returns <c>true</c>, if the entries were written successfully
|
||||
/// to the stream.</returns>
|
||||
public static bool WriteEntries(IRandomAccessStream msOutput, PwEntry[] vEntries)
|
||||
public static bool WriteEntries(Stream msOutput, PwEntry[] vEntries)
|
||||
{
|
||||
/* KdbxFile f = new KdbxFile(pwDatabase);
|
||||
f.m_format = KdbxFormat.PlainXml;
|
||||
|
@@ -2,6 +2,10 @@
|
||||
<configuration>
|
||||
<runtime>
|
||||
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.Runtime.WindowsRuntime" publicKeyToken="B77A5C561934E089" culture="neutral"/>
|
||||
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0"/>
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.Xml.XmlSerializer" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
|
||||
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0"/>
|
||||
|
@@ -1,7 +1,6 @@
|
||||
{
|
||||
"supports": {},
|
||||
"dependencies": {
|
||||
"Microsoft.Bcl.Build": "1.0.21",
|
||||
"Microsoft.NETCore.Portable.Compatibility": "1.0.1",
|
||||
"NETStandard.Library": "1.6.0",
|
||||
"PInvoke.Windows.Core": "0.5.97",
|
||||
|
@@ -3,9 +3,6 @@
|
||||
"version": 2,
|
||||
"targets": {
|
||||
".NETStandard,Version=v1.2": {
|
||||
"Microsoft.Bcl.Build/1.0.21": {
|
||||
"type": "package"
|
||||
},
|
||||
"Microsoft.NETCore.Jit/1.0.2": {
|
||||
"type": "package"
|
||||
},
|
||||
@@ -545,17 +542,6 @@
|
||||
}
|
||||
},
|
||||
"libraries": {
|
||||
"Microsoft.Bcl.Build/1.0.21": {
|
||||
"sha512": "sgHu4mIt0+NVGyI12Bj4hLPypNK55UOH+ologj2LqDCjxq3EbIxe/uAtHjY+fEwbE1dtsAHG8SXHf+V/EYbKTg==",
|
||||
"type": "package",
|
||||
"files": [
|
||||
"License-Stable.rtf",
|
||||
"Microsoft.Bcl.Build.1.0.21.nupkg.sha512",
|
||||
"Microsoft.Bcl.Build.nuspec",
|
||||
"build/Microsoft.Bcl.Build.Tasks.dll",
|
||||
"build/Microsoft.Bcl.Build.targets"
|
||||
]
|
||||
},
|
||||
"Microsoft.NETCore.Jit/1.0.2": {
|
||||
"sha512": "Ok2vWofa6X8WD9vc4pfLHwvJz1/B6t3gOAoZcjrjrQf7lQOlNIuZIZtLn3wnWX28DuQGpPJkRlBxFj7Z5txNqw==",
|
||||
"type": "package",
|
||||
@@ -2959,7 +2945,6 @@
|
||||
},
|
||||
"projectFileDependencyGroups": {
|
||||
"": [
|
||||
"Microsoft.Bcl.Build >= 1.0.21",
|
||||
"Microsoft.NETCore.Portable.Compatibility >= 1.0.1",
|
||||
"NETStandard.Library >= 1.6.0",
|
||||
"PInvoke.Windows.Core >= 0.5.97",
|
||||
|
Reference in New Issue
Block a user