예제 #1
0
        public byte[] EncryptSessionInfo(ReadOnlySpan <byte> sessionInfo)
        {
            var publicKeyParams = ecdh.PublicKey.ExportParameters();

            // Generate the ephemeral key pair
            var ephemeralEcDh = CreateECDiffieHellman(publicKeyParams.Curve);
            var derivedKey    = ephemeralEcDh.DeriveKeyFromHash(
                ecdh.PublicKey,
                PgpUtilities.GetHashAlgorithmName(this.hashAlgorithm),
                new byte[] { 0, 0, 0, 1 },
                CreateUserKeyingMaterial(publicKeyParams.Curve.Oid));

            derivedKey = derivedKey.AsSpan(0, PgpUtilities.GetKeySize(symmetricAlgorithm) / 8).ToArray();

            byte[] paddedSessionData = PadSessionData(sessionInfo);
            byte[] C  = SymmetricKeyWrap.AESKeyWrapEncrypt(derivedKey, paddedSessionData);
            var    ep = ephemeralEcDh.PublicKey.ExportParameters();

            byte[] VB = EncodePoint(ep.Q, publicKeyParams.Curve.Oid);
            byte[] rv = new byte[VB.Length + 2 + 1 + C.Length];
            MPInteger.TryWriteInteger(VB, rv, out _);
            //Array.Copy(VB, 0, rv, 0, VB.Length);
            rv[VB.Length + 2] = (byte)C.Length;
            Array.Copy(C, 0, rv, VB.Length + 3, C.Length);

            return(rv);
        }
예제 #2
0
파일: DsaKey.cs 프로젝트: 1hub/springburg
 private static void WriteOpenPgpPublicKey(DSAParameters dsaParameters, Span <byte> destination)
 {
     MPInteger.TryWriteInteger(dsaParameters.P, destination, out int pWritten);
     MPInteger.TryWriteInteger(dsaParameters.Q, destination.Slice(pWritten), out int qWritten);
     MPInteger.TryWriteInteger(dsaParameters.G, destination.Slice(pWritten + qWritten), out int gWritten);
     MPInteger.TryWriteInteger(dsaParameters.Y, destination.Slice(pWritten + qWritten + gWritten), out int yWritten);
 }
예제 #3
0
파일: DsaKey.cs 프로젝트: 1hub/springburg
        public byte[] ExportPrivateKey(
            ReadOnlySpan <byte> passwordBytes,
            S2kParameters s2kParameters)
        {
            DSAParameters dsaParameters = new DSAParameters();

            byte[] secretPart = Array.Empty <byte>();

            try
            {
                dsaParameters = dsa.ExportParameters(true);
                secretPart    = CryptoPool.Rent(MPInteger.GetMPEncodedLength(dsaParameters.X !));
                MPInteger.TryWriteInteger(dsaParameters.X, secretPart, out var secretSize);
                int publicKeySize       = MPInteger.GetMPEncodedLength(dsaParameters.P !, dsaParameters.Q !, dsaParameters.G !, dsaParameters.Y !);
                int encryptedSecretSize = S2kBasedEncryption.GetEncryptedLength(s2kParameters, secretSize);
                int expectedLength      = publicKeySize + encryptedSecretSize;
                var destination         = new byte[expectedLength];
                WriteOpenPgpPublicKey(dsaParameters, destination);
                S2kBasedEncryption.EncryptSecretKey(passwordBytes, s2kParameters, secretPart.AsSpan(0, secretSize), destination.AsSpan(publicKeySize));
                return(destination);
            }
            finally
            {
                CryptoPool.Return(secretPart);
                CryptographicOperations.ZeroMemory(dsaParameters.X);
            }
        }
예제 #4
0
        public byte[] EncryptSessionInfo(ReadOnlySpan <byte> sessionInfo)
        {
            var encryptedSessionInfo = rsa.Encrypt(sessionInfo.ToArray(), RSAEncryptionPadding.Pkcs1);
            var mp = new byte[MPInteger.GetMPEncodedLength(encryptedSessionInfo)];

            MPInteger.TryWriteInteger(encryptedSessionInfo, mp, out var _);
            return(mp);
        }
예제 #5
0
 public byte[] CreateSignature(ReadOnlySpan <byte> rgbHash, PgpHashAlgorithm hashAlgorithm)
 {
     byte[] ieeeSignature = ecdsa.SignHash(rgbHash.ToArray(), DSASignatureFormat.IeeeP1363FixedFieldConcatenation);
     byte[] pgpSignature  = new byte[ieeeSignature.Length + 4]; // Maximum possible length
     MPInteger.TryWriteInteger(ieeeSignature.AsSpan(0, ieeeSignature.Length / 2), pgpSignature, out int rWritten);
     MPInteger.TryWriteInteger(ieeeSignature.AsSpan(ieeeSignature.Length / 2), pgpSignature.AsSpan(rWritten), out int sWritten);
     return(pgpSignature.AsSpan(0, rWritten + sWritten).ToArray());
 }
예제 #6
0
        public byte[] CreateSignature(
            ReadOnlySpan <byte> rgbHash,
            PgpHashAlgorithm hashAlgorithm)
        {
            var signature      = rsa.SignHash(rgbHash.ToArray(), PgpUtilities.GetHashAlgorithmName(hashAlgorithm), RSASignaturePadding.Pkcs1);
            var signatureBytes = new byte[MPInteger.GetMPEncodedLength(signature)];

            MPInteger.TryWriteInteger(signature, signatureBytes, out var _);
            return(signatureBytes);
        }
예제 #7
0
        public byte[] ExportPublicKey()
        {
            var rsaParameters  = rsa.ExportParameters(false);
            int expectedLength = MPInteger.GetMPEncodedLength(rsaParameters.Modulus !, rsaParameters.Exponent !);
            var destination    = new byte[expectedLength];

            MPInteger.TryWriteInteger(rsaParameters.Modulus, destination, out int modulusWritten);
            MPInteger.TryWriteInteger(rsaParameters.Exponent, destination.AsSpan(modulusWritten), out int exponentWritten);
            return(destination.AsSpan(0, modulusWritten + exponentWritten).ToArray());
        }
예제 #8
0
파일: DsaKey.cs 프로젝트: 1hub/springburg
        public byte[] CreateSignature(ReadOnlySpan <byte> rgbHash, PgpHashAlgorithm hashAlgorithm)
        {
            byte[] ieeeSignature = dsa.CreateSignature(rgbHash.ToArray(), DSASignatureFormat.IeeeP1363FixedFieldConcatenation);
            var    r             = ieeeSignature.AsSpan(0, ieeeSignature.Length / 2);
            var    s             = ieeeSignature.AsSpan(ieeeSignature.Length / 2);

            byte[] pgpSignature = new byte[MPInteger.GetMPEncodedLength(r) + MPInteger.GetMPEncodedLength(s)];
            MPInteger.TryWriteInteger(r, pgpSignature, out int rWritten);
            MPInteger.TryWriteInteger(s, pgpSignature.AsSpan(rWritten), out int _);
            return(pgpSignature);
        }
예제 #9
0
        public byte[] EncryptSessionInfo(ReadOnlySpan <byte> sessionInfo)
        {
            var encryptedData = elGamal.Encrypt(sessionInfo, RSAEncryptionPadding.Pkcs1);
            var g             = encryptedData.Slice(0, encryptedData.Length / 2);
            var p             = encryptedData.Slice(encryptedData.Length / 2);
            var mp            = new byte[MPInteger.GetMPEncodedLength(g) + MPInteger.GetMPEncodedLength(p)];

            MPInteger.TryWriteInteger(g, mp, out var gWritten);
            MPInteger.TryWriteInteger(p, mp.AsSpan(gWritten), out var _);
            return(mp);
        }
예제 #10
0
파일: ECKey.cs 프로젝트: 1hub/springburg
        protected void WriteOpenPgpECParameters(ECParameters ecParameters, Span <byte> destination, out int bytesWritten)
        {
            var writer = new AsnWriter(AsnEncodingRules.DER);

            writer.WriteObjectIdentifier(ecParameters.Curve.Oid.Value !);
            var encodedPoint = EncodePoint(ecParameters.Q, ecParameters.Curve.Oid);
            var encodedOid   = writer.Encode();

            encodedOid.AsSpan(1).CopyTo(destination);
            MPInteger.TryWriteInteger(encodedPoint, destination.Slice(encodedOid.Length - 1), out bytesWritten);
            bytesWritten += encodedOid.Length - 1;
        }
예제 #11
0
        public byte[] ExportPrivateKey(
            ReadOnlySpan <byte> passwordBytes,
            S2kParameters s2kParameters)
        {
            RSAParameters rsaParameters = new RSAParameters();

            byte[] secretPart = Array.Empty <byte>();

            try
            {
                rsaParameters = rsa.ExportParameters(true);

                secretPart = CryptoPool.Rent(MPInteger.GetMPEncodedLength(rsaParameters.D !, rsaParameters.P !, rsaParameters.Q !, rsaParameters.InverseQ !));
                MPInteger.TryWriteInteger(rsaParameters.D, secretPart, out var dBytesWritten);
                MPInteger.TryWriteInteger(rsaParameters.P, secretPart.AsSpan(dBytesWritten), out var pBytesWritten);
                MPInteger.TryWriteInteger(rsaParameters.Q, secretPart.AsSpan(dBytesWritten + pBytesWritten), out var qBytesWritten);
                MPInteger.TryWriteInteger(rsaParameters.InverseQ, secretPart.AsSpan(dBytesWritten + pBytesWritten + qBytesWritten), out var iqBytesWritten);
                int secretSize = dBytesWritten + pBytesWritten + qBytesWritten + iqBytesWritten;

                int encryptedSecretSize = S2kBasedEncryption.GetEncryptedLength(s2kParameters, secretSize);
                int expectedLength      =
                    MPInteger.GetMPEncodedLength(rsaParameters.Modulus !, rsaParameters.Exponent !) +
                    encryptedSecretSize;
                var destination = new byte[expectedLength];

                MPInteger.TryWriteInteger(rsaParameters.Modulus, destination, out int modulusWritten);
                MPInteger.TryWriteInteger(rsaParameters.Exponent, destination.AsSpan(modulusWritten), out int exponentWritten);

                S2kBasedEncryption.EncryptSecretKey(passwordBytes, s2kParameters, secretPart.AsSpan(0, secretSize), destination.AsSpan(modulusWritten + exponentWritten));

                return(destination.AsSpan(0, modulusWritten + exponentWritten + encryptedSecretSize).ToArray());
            }
            finally
            {
                CryptoPool.Return(secretPart);
                CryptographicOperations.ZeroMemory(rsaParameters.D);
                CryptographicOperations.ZeroMemory(rsaParameters.P);
                CryptographicOperations.ZeroMemory(rsaParameters.Q);
                CryptographicOperations.ZeroMemory(rsaParameters.InverseQ);
                CryptographicOperations.ZeroMemory(rsaParameters.DP);
                CryptographicOperations.ZeroMemory(rsaParameters.DQ);
            }
        }
예제 #12
0
        public byte[] ExportPrivateKey(
            ReadOnlySpan <byte> passwordBytes,
            S2kParameters s2kParameters)
        {
            ECParameters ecParameters = new ECParameters();

            byte[] secretPart = Array.Empty <byte>();

            try
            {
                ecParameters = ecdh.ExportParameters(true);
                if (ecdh is X25519)
                {
                    Array.Reverse(ecParameters.D !);
                }

                int secretSize = MPInteger.GetMPEncodedLength(ecParameters.D !);
                secretPart = CryptoPool.Rent(secretSize);
                MPInteger.TryWriteInteger(ecParameters.D, secretPart, out var _);

                int encryptedSecretLength = S2kBasedEncryption.GetEncryptedLength(s2kParameters, secretSize);
                int estimatedLength       =
                    32 /* OID */ +
                    MPInteger.GetMPEncodedLength(ecParameters.Q.X !, ecParameters.Q.Y !) + 1 /* EC Point type */ +
                    4 /* KDF Parameters */ +
                    encryptedSecretLength;
                var destination = new byte[estimatedLength];
                WriteOpenPgpECParameters(ecParameters, destination, out int bytesWritten);
                WriteKDFParameters(destination.AsSpan(bytesWritten));

                S2kBasedEncryption.EncryptSecretKey(passwordBytes, s2kParameters, secretPart.AsSpan(0, secretSize), destination.AsSpan(bytesWritten + 4));
                return(destination.AsSpan(0, bytesWritten + 4 + encryptedSecretLength).ToArray());
            }
            finally
            {
                CryptoPool.Return(secretPart);
                if (ecParameters.D != null)
                {
                    CryptographicOperations.ZeroMemory(ecParameters.D);
                }
            }
        }
예제 #13
0
 private static void WriteOpenPgpPublicKey(ElGamalParameters elgamalParameters, Span <byte> destination)
 {
     MPInteger.TryWriteInteger(elgamalParameters.P, destination, out int pWritten);
     MPInteger.TryWriteInteger(elgamalParameters.G, destination.Slice(pWritten), out int gWritten);
     MPInteger.TryWriteInteger(elgamalParameters.Y, destination.Slice(pWritten + gWritten), out int yWritten);
 }