private BlobParser SendMessage(BlobBuilder aBuilder) { byte[] reply; using (var message = aBuilder.GetBlobAsPinnedByteArray()) { reply = SendMessage(message.Data); } try { return(new BlobParser(reply)); } catch (Exception) { return(null); } }
public override void Serialize(Stream aStream, object aObject) { /* check for required parameters */ if (aStream == null) { throw new ArgumentNullException("aStream"); } if (aObject == null) { throw new ArgumentNullException("aObject"); } PasswordFinder pwFinder = null; if (GetPassphraseCallbackMethod != null) { pwFinder = new PasswordFinder(GetPassphraseCallbackMethod); } PinnedArray<char> passphrase = null; if (pwFinder != null) { passphrase = new PinnedArray<char>(0); passphrase.Data = pwFinder.GetPassword(); } byte cipherType; if (passphrase == null || passphrase.Data.Length == 0) { cipherType = SSH_CIPHER_NONE; } else { cipherType = SSH_CIPHER_3DES; } BlobBuilder builder = new BlobBuilder(); ISshKey sshKey = aObject as ISshKey; RsaKeyParameters publicKeyParams = sshKey.GetPublicKeyParameters() as RsaKeyParameters; RsaPrivateCrtKeyParameters privateKeyParams = sshKey.GetPrivateKeyParameters() as RsaPrivateCrtKeyParameters; /* writing info headers */ builder.AddBytes(Encoding.ASCII.GetBytes(FILE_HEADER_LINE + "\n")); builder.AddByte(0); //end of string builder.AddByte(cipherType); //cipher builder.AddInt(0); //reserved /* writing public key */ builder.AddInt(sshKey.Size); builder.AddSsh1BigIntBlob(publicKeyParams.Modulus); builder.AddSsh1BigIntBlob(publicKeyParams.Exponent); builder.AddStringBlob(sshKey.Comment); /* writing private key */ BlobBuilder privateKeyBuilder = new BlobBuilder(); /* adding some control values */ Random random = new Random(); byte[] resultCheck = new byte[2]; random.NextBytes(resultCheck); privateKeyBuilder.AddByte(resultCheck[0]); privateKeyBuilder.AddByte(resultCheck[1]); privateKeyBuilder.AddByte(resultCheck[0]); privateKeyBuilder.AddByte(resultCheck[1]); privateKeyBuilder.AddSsh1BigIntBlob(privateKeyParams.Exponent); privateKeyBuilder.AddSsh1BigIntBlob(privateKeyParams.DQ); privateKeyBuilder.AddSsh1BigIntBlob(privateKeyParams.P); privateKeyBuilder.AddSsh1BigIntBlob(privateKeyParams.Q); if (cipherType == SSH_CIPHER_NONE) { /* plain-text */ builder.AddBytes(privateKeyBuilder.GetBlobAsPinnedByteArray().Data); } else { byte[] keydata; using (MD5 md5 = MD5.Create()) { keydata = md5.ComputeHash(Encoding.ASCII.GetBytes(passphrase.Data)); } /* encryption */ DesSsh1Engine desEngine = new DesSsh1Engine(); desEngine.Init(true, new KeyParameter(keydata)); BufferedBlockCipher bufferedBlockCipher = new BufferedBlockCipher(desEngine); byte[] ouputBuffer = bufferedBlockCipher.ProcessBytes( privateKeyBuilder.GetBlobAsPinnedByteArray().Data); builder.AddBytes(ouputBuffer); passphrase.Dispose(); } /* writing result to file */ var builderOutput = builder.GetBlobAsPinnedByteArray(); aStream.Write(builderOutput.Data, 0, builderOutput.Data.Length); aStream.Close(); }
public override void Serialize(Stream stream, object obj) { /* check for required parameters */ if (stream == null) { throw new ArgumentNullException("stream"); } if (obj == null) { throw new ArgumentNullException("obj"); } PinnedArray <char> passphrase = null; string ciphername; if (passphrase == null || passphrase.Data.Length == 0) { ciphername = KDFNAME_NONE; } else { ciphername = KDFNAME_BCRYPT; } var builder = new BlobBuilder(); ISshKey sshKey = obj as ISshKey; if (sshKey == null) { throw new ArgumentException("Expected ISshKey", "obj"); } var publicKeyParams = sshKey.GetPublicKeyParameters() as Ed25519PublicKeyParameter; var privateKeyParams = sshKey.GetPrivateKeyParameters() as Ed25519PrivateKeyParameter; /* writing info headers */ builder.AddBytes(Encoding.ASCII.GetBytes(AUTH_MAGIC)); builder.AddStringBlob(ciphername); builder.AddStringBlob(ciphername); //kdfname builder.AddBlob(new byte[0]); // kdfoptions /* writing public key */ builder.AddInt(1); // number of keys N var publicKeyBuilder = new BlobBuilder(); publicKeyBuilder.AddStringBlob(PublicKeyAlgorithm.ED25519.GetIdentifierString()); publicKeyBuilder.AddBlob(publicKeyParams.Key); builder.AddBlob(publicKeyBuilder.GetBlob()); /* writing private key */ BlobBuilder privateKeyBuilder = new BlobBuilder(); var checkint = new SecureRandom().NextInt(); privateKeyBuilder.AddInt(checkint); privateKeyBuilder.AddInt(checkint); privateKeyBuilder.AddStringBlob(PublicKeyAlgorithm.ED25519.GetIdentifierString()); privateKeyBuilder.AddBlob(publicKeyParams.Key); privateKeyBuilder.AddBlob(privateKeyParams.Signature); privateKeyBuilder.AddStringBlob(sshKey.Comment); if (ciphername == KDFNAME_NONE) { /* plain-text */ builder.AddBlob(privateKeyBuilder.GetBlobAsPinnedByteArray().Data); } else { byte[] keydata; using (MD5 md5 = MD5.Create()) { keydata = md5.ComputeHash(Encoding.ASCII.GetBytes(passphrase.Data)); } passphrase.Dispose(); } /* writing result to file */ var builderOutput = builder.GetBlobAsPinnedByteArray(); using (var writer = new StreamWriter(stream)) { writer.NewLine = "\n"; writer.WriteLine(MARK_BEGIN); var base64Data = Util.ToBase64(builderOutput.Data); var base64String = Encoding.UTF8.GetString(base64Data); var offset = 0; while (offset < base64String.Length) { const int maxLineLength = 70; if (offset + maxLineLength > base64String.Length) { writer.WriteLine(base64String.Substring(offset)); } else { writer.WriteLine(base64String.Substring(offset, maxLineLength)); } offset += maxLineLength; } writer.WriteLine(MARK_END); } }
public override void Serialize(Stream stream, object obj) { /* check for required parameters */ if (stream == null) { throw new ArgumentNullException("stream"); } if (obj == null) { throw new ArgumentNullException("obj"); } PinnedArray<char> passphrase = null; string ciphername; if (passphrase == null || passphrase.Data.Length == 0) { ciphername = KDFNAME_NONE; } else { ciphername = KDFNAME_BCRYPT; } var builder = new BlobBuilder(); ISshKey sshKey = obj as ISshKey; if (sshKey == null) { throw new ArgumentException("Expected ISshKey", "obj"); } var publicKeyParams = sshKey.GetPublicKeyParameters() as Ed25519PublicKeyParameter; var privateKeyParams = sshKey.GetPrivateKeyParameters() as Ed25519PrivateKeyParameter; /* writing info headers */ builder.AddBytes(Encoding.ASCII.GetBytes(AUTH_MAGIC)); builder.AddStringBlob(ciphername); builder.AddStringBlob(ciphername); //kdfname builder.AddBlob(new byte[0]); // kdfoptions /* writing public key */ builder.AddInt(1); // number of keys N var publicKeyBuilder = new BlobBuilder(); publicKeyBuilder.AddStringBlob(PublicKeyAlgorithm.ED25519.GetIdentifierString()); publicKeyBuilder.AddBlob(publicKeyParams.Key); builder.AddBlob(publicKeyBuilder.GetBlob()); /* writing private key */ BlobBuilder privateKeyBuilder = new BlobBuilder(); var checkint = new SecureRandom().NextInt(); privateKeyBuilder.AddInt(checkint); privateKeyBuilder.AddInt(checkint); privateKeyBuilder.AddStringBlob(PublicKeyAlgorithm.ED25519.GetIdentifierString()); privateKeyBuilder.AddBlob(publicKeyParams.Key); privateKeyBuilder.AddBlob(privateKeyParams.Signature); privateKeyBuilder.AddStringBlob(sshKey.Comment); if (ciphername == KDFNAME_NONE) { /* plain-text */ builder.AddBlob(privateKeyBuilder.GetBlobAsPinnedByteArray().Data); } else { byte[] keydata; using (MD5 md5 = MD5.Create()) { keydata = md5.ComputeHash(Encoding.ASCII.GetBytes(passphrase.Data)); } passphrase.Dispose(); } /* writing result to file */ var builderOutput = builder.GetBlobAsPinnedByteArray(); using (var writer = new StreamWriter(stream)) { writer.NewLine = "\n"; writer.WriteLine(MARK_BEGIN); var base64Data = Util.ToBase64(builderOutput.Data); var base64String = Encoding.UTF8.GetString(base64Data); var offset = 0; while (offset < base64String.Length) { const int maxLineLength = 70; if (offset + maxLineLength > base64String.Length) { writer.WriteLine(base64String.Substring(offset)); } else { writer.WriteLine(base64String.Substring(offset, maxLineLength)); } offset += maxLineLength; } writer.WriteLine(MARK_END); } }
public override void Serialize(Stream aStream, object aObject) { /* check for required parameters */ if (aStream == null) { throw new ArgumentNullException("aStream"); } if (aObject == null) { throw new ArgumentNullException("aObject"); } PasswordFinder pwFinder = null; if (GetPassphraseCallbackMethod != null) { pwFinder = new PasswordFinder(GetPassphraseCallbackMethod); } PinnedArray <char> passphrase = null; if (pwFinder != null) { passphrase = new PinnedArray <char>(0); passphrase.Data = pwFinder.GetPassword(); } byte cipherType; if (passphrase == null || passphrase.Data.Length == 0) { cipherType = SSH_CIPHER_NONE; } else { cipherType = SSH_CIPHER_3DES; } BlobBuilder builder = new BlobBuilder(); ISshKey sshKey = aObject as ISshKey; RsaKeyParameters publicKeyParams = sshKey.GetPublicKeyParameters() as RsaKeyParameters; RsaPrivateCrtKeyParameters privateKeyParams = sshKey.GetPrivateKeyParameters() as RsaPrivateCrtKeyParameters; /* writing info headers */ builder.AddBytes(Encoding.ASCII.GetBytes(FILE_HEADER_LINE + "\n")); builder.AddUInt8(0); //end of string builder.AddUInt8(cipherType); //cipher builder.AddInt(0); //reserved /* writing public key */ builder.AddInt(sshKey.Size); builder.AddSsh1BigIntBlob(publicKeyParams.Modulus); builder.AddSsh1BigIntBlob(publicKeyParams.Exponent); builder.AddStringBlob(sshKey.Comment); /* writing private key */ BlobBuilder privateKeyBuilder = new BlobBuilder(); /* adding some control values */ Random random = new Random(); byte[] resultCheck = new byte[2]; random.NextBytes(resultCheck); privateKeyBuilder.AddUInt8(resultCheck[0]); privateKeyBuilder.AddUInt8(resultCheck[1]); privateKeyBuilder.AddUInt8(resultCheck[0]); privateKeyBuilder.AddUInt8(resultCheck[1]); privateKeyBuilder.AddSsh1BigIntBlob(privateKeyParams.Exponent); privateKeyBuilder.AddSsh1BigIntBlob(privateKeyParams.DQ); privateKeyBuilder.AddSsh1BigIntBlob(privateKeyParams.P); privateKeyBuilder.AddSsh1BigIntBlob(privateKeyParams.Q); if (cipherType == SSH_CIPHER_NONE) { /* plain-text */ builder.AddBytes(privateKeyBuilder.GetBlobAsPinnedByteArray().Data); } else { byte[] keydata; using (MD5 md5 = MD5.Create()) { keydata = md5.ComputeHash(Encoding.ASCII.GetBytes(passphrase.Data)); } /* encryption */ DesSsh1Engine desEngine = new DesSsh1Engine(); desEngine.Init(true, new KeyParameter(keydata)); BufferedBlockCipher bufferedBlockCipher = new BufferedBlockCipher(desEngine); byte[] ouputBuffer = bufferedBlockCipher.ProcessBytes( privateKeyBuilder.GetBlobAsPinnedByteArray().Data); builder.AddBytes(ouputBuffer); passphrase.Dispose(); } /* writing result to file */ var builderOutput = builder.GetBlobAsPinnedByteArray(); aStream.Write(builderOutput.Data, 0, builderOutput.Data.Length); aStream.Close(); }
private BlobParser SendMessage(BlobBuilder aBuilder) { byte[] reply; using (var message = aBuilder.GetBlobAsPinnedByteArray()) { reply = SendMessage(message.Data); } try { return new BlobParser(reply); } catch (Exception) { return null; } }