diff --git a/OF DL/CLI/SpectreProgressReporter.cs b/OF DL/CLI/SpectreProgressReporter.cs
index f6c65ab..49cf12b 100644
--- a/OF DL/CLI/SpectreProgressReporter.cs
+++ b/OF DL/CLI/SpectreProgressReporter.cs
@@ -4,21 +4,15 @@ using Spectre.Console;
namespace OF_DL.CLI;
///
-/// Implementation of IProgressReporter that uses Spectre.Console's ProgressTask for CLI output.
+/// Implementation of IProgressReporter that uses Spectre.Console's ProgressTask for CLI output.
///
public class SpectreProgressReporter : IProgressReporter
{
private readonly ProgressTask _task;
- public SpectreProgressReporter(ProgressTask task)
- {
- _task = task ?? throw new ArgumentNullException(nameof(task));
- }
+ public SpectreProgressReporter(ProgressTask task) => _task = task ?? throw new ArgumentNullException(nameof(task));
- public void ReportProgress(long increment)
- {
- _task.Increment(increment);
- }
+ public void ReportProgress(long increment) => _task.Increment(increment);
public void ReportStatus(string message)
{
diff --git a/OF DL/Crypto/CryptoUtils.cs b/OF DL/Crypto/CryptoUtils.cs
index 05f4c67..624dce0 100644
--- a/OF DL/Crypto/CryptoUtils.cs
+++ b/OF DL/Crypto/CryptoUtils.cs
@@ -4,30 +4,26 @@ using Org.BouncyCastle.Crypto.Engines;
using Org.BouncyCastle.Crypto.Macs;
using Org.BouncyCastle.Crypto.Parameters;
-namespace OF_DL.Crypto
+namespace OF_DL.Crypto;
+
+public class CryptoUtils
{
- public class CryptoUtils
+ public static byte[] GetHMACSHA256Digest(byte[] data, byte[] key) => new HMACSHA256(key).ComputeHash(data);
+
+ public static byte[] GetCMACDigest(byte[] data, byte[] key)
{
- public static byte[] GetHMACSHA256Digest(byte[] data, byte[] key)
- {
- return new HMACSHA256(key).ComputeHash(data);
- }
+ IBlockCipher cipher = new AesEngine();
+ IMac mac = new CMac(cipher, 128);
- public static byte[] GetCMACDigest(byte[] data, byte[] key)
- {
- IBlockCipher cipher = new AesEngine();
- IMac mac = new CMac(cipher, 128);
+ KeyParameter keyParam = new(key);
- KeyParameter keyParam = new KeyParameter(key);
+ mac.Init(keyParam);
- mac.Init(keyParam);
+ mac.BlockUpdate(data, 0, data.Length);
- mac.BlockUpdate(data, 0, data.Length);
+ byte[] outBytes = new byte[16];
- byte[] outBytes = new byte[16];
-
- mac.DoFinal(outBytes, 0);
- return outBytes;
- }
+ mac.DoFinal(outBytes, 0);
+ return outBytes;
}
}
diff --git a/OF DL/Crypto/Padding.cs b/OF DL/Crypto/Padding.cs
index f819ea8..e3075e4 100644
--- a/OF DL/Crypto/Padding.cs
+++ b/OF DL/Crypto/Padding.cs
@@ -1,118 +1,126 @@
using System.Security.Cryptography;
-namespace OF_DL.Crypto
+namespace OF_DL.Crypto;
+
+public class Padding
{
- public class Padding
+ public static byte[] AddPKCS7Padding(byte[] data, int k)
{
- public static byte[] AddPKCS7Padding(byte[] data, int k)
+ int m = k - data.Length % k;
+
+ byte[] padding = new byte[m];
+ Array.Fill(padding, (byte)m);
+
+ byte[] paddedBytes = new byte[data.Length + padding.Length];
+ Buffer.BlockCopy(data, 0, paddedBytes, 0, data.Length);
+ Buffer.BlockCopy(padding, 0, paddedBytes, data.Length, padding.Length);
+
+ return paddedBytes;
+ }
+
+ public static byte[] RemovePKCS7Padding(byte[] paddedByteArray)
+ {
+ byte last = paddedByteArray[^1];
+ if (paddedByteArray.Length <= last)
{
- int m = k - (data.Length % k);
-
- byte[] padding = new byte[m];
- Array.Fill(padding, (byte)m);
-
- byte[] paddedBytes = new byte[data.Length + padding.Length];
- Buffer.BlockCopy(data, 0, paddedBytes, 0, data.Length);
- Buffer.BlockCopy(padding, 0, paddedBytes, data.Length, padding.Length);
-
- return paddedBytes;
+ return paddedByteArray;
}
- public static byte[] RemovePKCS7Padding(byte[] paddedByteArray)
- {
- var last = paddedByteArray[^1];
- if (paddedByteArray.Length <= last)
- {
- return paddedByteArray;
- }
+ return SubArray(paddedByteArray, 0, paddedByteArray.Length - last);
+ }
- return SubArray(paddedByteArray, 0, (paddedByteArray.Length - last));
+ public static T[] SubArray(T[] arr, int start, int length)
+ {
+ T[] result = new T[length];
+ Buffer.BlockCopy(arr, start, result, 0, length);
+
+ return result;
+ }
+
+ public static byte[] AddPSSPadding(byte[] hash)
+ {
+ int modBits = 2048;
+ int hLen = 20;
+ int emLen = 256;
+
+ int lmask = 0;
+ for (int i = 0; i < 8 * emLen - (modBits - 1); i++)
+ {
+ lmask = (lmask >> 1) | 0x80;
}
- public static T[] SubArray(T[] arr, int start, int length)
+ if (emLen < hLen + hLen + 2)
{
- var result = new T[length];
- Buffer.BlockCopy(arr, start, result, 0, length);
-
- return result;
+ return null;
}
- public static byte[] AddPSSPadding(byte[] hash)
+ byte[] salt = new byte[hLen];
+ new Random().NextBytes(salt);
+
+ byte[] m_prime = Enumerable.Repeat((byte)0, 8).ToArray().Concat(hash).Concat(salt).ToArray();
+ byte[] h = SHA1.Create().ComputeHash(m_prime);
+
+ byte[] ps = Enumerable.Repeat((byte)0, emLen - hLen - hLen - 2).ToArray();
+ byte[] db = ps.Concat(new byte[] { 0x01 }).Concat(salt).ToArray();
+
+ byte[] dbMask = MGF1(h, emLen - hLen - 1);
+
+ byte[] maskedDb = new byte[dbMask.Length];
+ for (int i = 0; i < dbMask.Length; i++)
{
- int modBits = 2048;
- int hLen = 20;
- int emLen = 256;
-
- int lmask = 0;
- for (int i = 0; i < 8 * emLen - (modBits - 1); i++)
- lmask = lmask >> 1 | 0x80;
-
- if (emLen < hLen + hLen + 2)
- {
- return null;
- }
-
- byte[] salt = new byte[hLen];
- new Random().NextBytes(salt);
-
- byte[] m_prime = Enumerable.Repeat((byte)0, 8).ToArray().Concat(hash).Concat(salt).ToArray();
- byte[] h = SHA1.Create().ComputeHash(m_prime);
-
- byte[] ps = Enumerable.Repeat((byte)0, emLen - hLen - hLen - 2).ToArray();
- byte[] db = ps.Concat(new byte[] { 0x01 }).Concat(salt).ToArray();
-
- byte[] dbMask = MGF1(h, emLen - hLen - 1);
-
- byte[] maskedDb = new byte[dbMask.Length];
- for (int i = 0; i < dbMask.Length; i++)
- maskedDb[i] = (byte)(db[i] ^ dbMask[i]);
-
- maskedDb[0] = (byte)(maskedDb[0] & ~lmask);
-
- byte[] padded = maskedDb.Concat(h).Concat(new byte[] { 0xBC }).ToArray();
-
- return padded;
+ maskedDb[i] = (byte)(db[i] ^ dbMask[i]);
}
- public static byte[] RemoveOAEPPadding(byte[] data)
+ maskedDb[0] = (byte)(maskedDb[0] & ~lmask);
+
+ byte[] padded = maskedDb.Concat(h).Concat(new byte[] { 0xBC }).ToArray();
+
+ return padded;
+ }
+
+ public static byte[] RemoveOAEPPadding(byte[] data)
+ {
+ int k = 256;
+ int hLen = 20;
+
+ byte[] maskedSeed = data[1..(hLen + 1)];
+ byte[] maskedDB = data[(hLen + 1)..];
+
+ byte[] seedMask = MGF1(maskedDB, hLen);
+
+ byte[] seed = new byte[maskedSeed.Length];
+ for (int i = 0; i < maskedSeed.Length; i++)
{
- int k = 256;
- int hLen = 20;
-
- byte[] maskedSeed = data[1..(hLen + 1)];
- byte[] maskedDB = data[(hLen + 1)..];
-
- byte[] seedMask = MGF1(maskedDB, hLen);
-
- byte[] seed = new byte[maskedSeed.Length];
- for (int i = 0; i < maskedSeed.Length; i++)
- seed[i] = (byte)(maskedSeed[i] ^ seedMask[i]);
-
- byte[] dbMask = MGF1(seed, k - hLen - 1);
-
- byte[] db = new byte[maskedDB.Length];
- for (int i = 0; i < maskedDB.Length; i++)
- db[i] = (byte)(maskedDB[i] ^ dbMask[i]);
-
- int onePos = BitConverter.ToString(db[hLen..]).Replace("-", "").IndexOf("01") / 2;
- byte[] unpadded = db[(hLen + onePos + 1)..];
-
- return unpadded;
+ seed[i] = (byte)(maskedSeed[i] ^ seedMask[i]);
}
- static byte[] MGF1(byte[] seed, int maskLen)
+ byte[] dbMask = MGF1(seed, k - hLen - 1);
+
+ byte[] db = new byte[maskedDB.Length];
+ for (int i = 0; i < maskedDB.Length; i++)
{
- SHA1 hobj = SHA1.Create();
- int hLen = hobj.HashSize / 8;
- List T = new List();
- for (int i = 0; i < (int)Math.Ceiling(((double)maskLen / (double)hLen)); i++)
- {
- byte[] c = BitConverter.GetBytes(i);
- Array.Reverse(c);
- byte[] digest = hobj.ComputeHash(seed.Concat(c).ToArray());
- T.AddRange(digest);
- }
- return T.GetRange(0, maskLen).ToArray();
+ db[i] = (byte)(maskedDB[i] ^ dbMask[i]);
}
+
+ int onePos = BitConverter.ToString(db[hLen..]).Replace("-", "").IndexOf("01") / 2;
+ byte[] unpadded = db[(hLen + onePos + 1)..];
+
+ return unpadded;
+ }
+
+ private static byte[] MGF1(byte[] seed, int maskLen)
+ {
+ SHA1 hobj = SHA1.Create();
+ int hLen = hobj.HashSize / 8;
+ List T = new();
+ for (int i = 0; i < (int)Math.Ceiling(maskLen / (double)hLen); i++)
+ {
+ byte[] c = BitConverter.GetBytes(i);
+ Array.Reverse(c);
+ byte[] digest = hobj.ComputeHash(seed.Concat(c).ToArray());
+ T.AddRange(digest);
+ }
+
+ return T.GetRange(0, maskLen).ToArray();
}
}
diff --git a/OF DL/Entities/Archived/Archived.cs b/OF DL/Entities/Archived/Archived.cs
index 1231e1c..a8ff9dd 100644
--- a/OF DL/Entities/Archived/Archived.cs
+++ b/OF DL/Entities/Archived/Archived.cs
@@ -1,270 +1,262 @@
using Newtonsoft.Json;
using OF_DL.Utils;
-namespace OF_DL.Entities.Archived
+namespace OF_DL.Entities.Archived;
+
+public class Archived
{
- public class Archived
+ public List list { get; set; }
+ public bool hasMore { get; set; }
+ public string headMarker { get; set; }
+ public string tailMarker { get; set; }
+ public Counters counters { get; set; }
+
+ public class Author
{
- public List list { get; set; }
- public bool hasMore { get; set; }
- public string headMarker { get; set; }
- public string tailMarker { get; set; }
- public Counters counters { get; set; }
- public class Author
+ public long id { get; set; }
+ public string _view { get; set; }
+ }
+
+ public class Counters
+ {
+ public int? audiosCount { get; set; }
+ public int? photosCount { get; set; }
+ public int? videosCount { get; set; }
+ public int? mediasCount { get; set; }
+ public int? postsCount { get; set; }
+ public int? streamsCount { get; set; }
+ public int? archivedPostsCount { get; set; }
+ }
+
+ public class Dash
+ {
+ [JsonProperty("CloudFront-Policy")] public string CloudFrontPolicy { get; set; }
+
+ [JsonProperty("CloudFront-Signature")] public string CloudFrontSignature { get; set; }
+
+ [JsonProperty("CloudFront-Key-Pair-Id")]
+ public string CloudFrontKeyPairId { get; set; }
+ }
+
+ public class Drm
+ {
+ public Manifest manifest { get; set; }
+ public Signature signature { get; set; }
+ }
+
+ public class Files
+ {
+ public Full full { get; set; }
+ public Thumb thumb { get; set; }
+ public Preview preview { get; set; }
+ public SquarePreview squarePreview { get; set; }
+ public Drm drm { get; set; }
+ }
+
+ public class Full
+ {
+ public string url { get; set; }
+ public int width { get; set; }
+ public int height { get; set; }
+ public long size { get; set; }
+ public List