コード例 #1
0
        /// <summary>
        ///     Load a single maFile with the security credentials
        /// </summary>
        /// <param name="mafile">filename</param>
        /// <param name="password">optional password</param>
        /// <param name="steamid">steamid if known</param>
        /// <param name="iv">optional iv for decryption</param>
        /// <param name="salt">optional salt</param>
        private void LoadSDAFile(string mafile, string password = null, string steamid = null, string iv = null,
                                 string salt = null)
        {
            string data;

            if (File.Exists(mafile) == false || (data = File.ReadAllText(mafile)) == null)
            {
                throw new ApplicationException("Cannot read file " + mafile);
            }

            // decrypt
            if (string.IsNullOrEmpty(password) == false)
            {
                var ciphertext = Convert.FromBase64String(data);

#if NETFX_4
                using (var pbkdf2 = new Rfc2898DeriveBytes(password, Convert.FromBase64String(salt),
                                                           ImportedSDAEntry.PBKDF2_ITERATIONS))
#endif
                {
                    var key = pbkdf2.GetBytes(ImportedSDAEntry.KEY_SIZE_BYTES);

                    using (var aes256 = new RijndaelManaged())
                    {
                        aes256.IV      = Convert.FromBase64String(iv);
                        aes256.Key     = key;
                        aes256.Padding = PaddingMode.PKCS7;
                        aes256.Mode    = CipherMode.CBC;

                        try
                        {
                            using (var decryptor = aes256.CreateDecryptor(aes256.Key, aes256.IV))
                            {
                                using (var ms = new MemoryStream(ciphertext))
                                {
                                    using (var cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))
                                    {
                                        using (var sr = new StreamReader(cs))
                                        {
                                            data = sr.ReadToEnd();
                                        }
                                    }
                                }
                            }
                        }
                        catch (CryptographicException)
                        {
                            throw new ApplicationException("Invalid password");
                        }
                    }
                }
            }

            var token    = JObject.Parse(data);
            var sdaentry = new ImportedSDAEntry();
            sdaentry.Username = token.SelectToken("account_name") != null
                ? token.SelectToken("account_name").Value <string>()
                : null;

            sdaentry.SteamId = steamid;
            if (string.IsNullOrEmpty(sdaentry.SteamId))
            {
                sdaentry.SteamId = token.SelectToken("Session.SteamID") != null
                    ? token.SelectToken("Session.SteamID").Value <string>()
                    : null;
            }
            if (string.IsNullOrEmpty(sdaentry.SteamId))
            {
                sdaentry.SteamId = mafile.Split('.')[0];
            }
            sdaentry.json = data;

            importSDAList.Items.Add(sdaentry);
        }
コード例 #2
0
		/// <summary>
		/// Load a single maFile with the security credentials
		/// </summary>
		/// <param name="mafile">filename</param>
		/// <param name="password">optional password</param>
		/// <param name="steamid">steamid if known</param>
		/// <param name="iv">optional iv for decryption</param>
		/// <param name="salt">optional salt</param>
		private void LoadSDAFile(string mafile, string password = null, string steamid = null, string iv = null, string salt = null)
		{
			string data;
			if (File.Exists(mafile) == false || (data = File.ReadAllText(mafile)) == null)
			{
				throw new ApplicationException("Cannot read file " + mafile);
			}

			// decrypt
			if (string.IsNullOrEmpty(password) == false)
			{
				byte[] ciphertext = Convert.FromBase64String(data);

#if NETFX_4
				using (Rfc2898DeriveBytes pbkdf2 = new Rfc2898DeriveBytes(password, Convert.FromBase64String(salt), ImportedSDAEntry.PBKDF2_ITERATIONS))
#endif
#if NETFX_3
				Rfc2898DeriveBytes pbkdf2 = new Rfc2898DeriveBytes(password, Convert.FromBase64String(salt), ImportedSDAEntry.PBKDF2_ITERATIONS);
#endif
				{
					byte[] key = pbkdf2.GetBytes(ImportedSDAEntry.KEY_SIZE_BYTES);

					using (RijndaelManaged aes256 = new RijndaelManaged())
					{
						aes256.IV = Convert.FromBase64String(iv);
						aes256.Key = key;
						aes256.Padding = PaddingMode.PKCS7;
						aes256.Mode = CipherMode.CBC;

						try
						{
							using (ICryptoTransform decryptor = aes256.CreateDecryptor(aes256.Key, aes256.IV))
							{
								using (MemoryStream ms = new MemoryStream(ciphertext))
								{
									using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))
									{
										using (StreamReader sr = new StreamReader(cs))
										{
											data = sr.ReadToEnd();
										}
									}
								}
							}
						}
						catch (CryptographicException )
						{
							throw new ApplicationException("Invalid password");
						}
					}
				}
			}

			var token = JObject.Parse(data);
			var sdaentry = new ImportedSDAEntry();
			sdaentry.Username = token.SelectToken("account_name") != null ? token.SelectToken("account_name").Value<string>() : null;
			sdaentry.SteamId = steamid;
			if (string.IsNullOrEmpty(sdaentry.SteamId) == true)
			{
				sdaentry.SteamId = token.SelectToken("Session.SteamID") != null ? token.SelectToken("Session.SteamID").Value<string>() : null;
			}
			if (string.IsNullOrEmpty(sdaentry.SteamId) == true)
			{
				sdaentry.SteamId = mafile.Split('.')[0];
			}
			sdaentry.json = data;

			importSDAList.Items.Add(sdaentry);
		}