public static string PrintAllSeeds(KeySet keySet) { var sb = new StringBuilder(); PrintKeys(keySet, sb, DefaultKeySet.CreateKeyList(), Type.Common | Type.Seed, false); if (keySet.CurrentMode == KeySet.Mode.Prod) { sb.AppendLine(); keySet.SetMode(KeySet.Mode.Dev); PrintKeys(keySet, sb, DefaultKeySet.CreateKeyList(), Type.Common | Type.Seed | Type.DifferentDev, true); keySet.SetMode(KeySet.Mode.Prod); } return(sb.ToString()); }
public static string PrintCommonKeysWithDev(KeySet keySet) { KeySet.Mode originalMode = keySet.CurrentMode; var sb = new StringBuilder(); keySet.SetMode(KeySet.Mode.Prod); PrintKeys(keySet, sb, DefaultKeySet.CreateKeyList(), Type.Common | Type.Root | Type.Seed | Type.Derived, false); sb.AppendLine(); keySet.SetMode(KeySet.Mode.Dev); PrintKeys(keySet, sb, DefaultKeySet.CreateKeyList(), Type.Common | Type.Root | Type.Derived, true); keySet.SetMode(originalMode); return(sb.ToString()); }
/// <summary> /// Loads keys from key files into an existing <see cref="KeySet"/>. Missing keys will be /// derived from existing keys if possible. Any <see langword="null"/> file names will be skipped. /// </summary> /// <param name="keySet">The <see cref="KeySet"/> where the loaded keys will be placed.</param> /// <param name="prodKeysFilename">The path of the file containing common prod keys. Can be <see langword="null"/>.</param> /// <param name="devKeysFilename">The path of the file containing common dev keys. Can be <see langword="null"/>.</param> /// <param name="titleKeysFilename">The path of the file containing title keys. Can be <see langword="null"/>.</param> /// <param name="consoleKeysFilename">The path of the file containing device-unique keys. Can be <see langword="null"/>.</param> /// <param name="logger">An optional logger that key-parsing errors will be written to.</param> public static void ReadKeyFile(KeySet keySet, string prodKeysFilename = null, string devKeysFilename = null, string titleKeysFilename = null, string consoleKeysFilename = null, IProgressReport logger = null) { KeySet.Mode originalMode = keySet.CurrentMode; List <KeyInfo> keyInfos = DefaultKeySet.CreateKeyList(); if (prodKeysFilename != null) { keySet.SetMode(KeySet.Mode.Prod); using var storage = new FileStream(prodKeysFilename, FileMode.Open, FileAccess.Read); ReadMainKeys(keySet, storage, keyInfos, logger); } if (devKeysFilename != null) { keySet.SetMode(KeySet.Mode.Dev); using var storage = new FileStream(devKeysFilename, FileMode.Open, FileAccess.Read); ReadMainKeys(keySet, storage, keyInfos, logger); } keySet.SetMode(originalMode); if (consoleKeysFilename != null) { using var storage = new FileStream(consoleKeysFilename, FileMode.Open, FileAccess.Read); ReadMainKeys(keySet, storage, keyInfos, logger); } if (titleKeysFilename != null) { using var storage = new FileStream(titleKeysFilename, FileMode.Open, FileAccess.Read); ReadTitleKeys(keySet, storage, logger); } keySet.DeriveKeys(logger); }
/// <summary> /// Loads non-title keys from a <see cref="TextReader"/> into an existing <see cref="KeySet"/>. /// Missing keys will not be derived. /// </summary> /// <param name="keySet">The <see cref="KeySet"/> where the loaded keys will be placed.</param> /// <param name="reader">A <see cref="Stream"/> containing the keys to load.</param> /// <param name="keyList">A list of all the keys that will be loaded into the key set. /// <see cref="DefaultKeySet.CreateKeyList"/> will create a list containing all loadable keys.</param> /// <param name="logger">An optional logger that key-parsing errors will be written to.</param> public static void ReadMainKeys(KeySet keySet, Stream reader, List <KeyInfo> keyList, IProgressReport logger = null) { if (reader == null) { return; } using var streamReader = new StreamReader(reader); Span <char> buffer = stackalloc char[ReadBufferSize]; var ctx = new KvPairReaderContext(streamReader, buffer); while (true) { ReaderStatus status = GetKeyValuePair(ref ctx); if (status == ReaderStatus.Error) { logger?.LogMessage($"Invalid line in key data: \"{ctx.CurrentKey.ToString()}\""); } else if (status == ReaderStatus.ReadKey) { if (!TryGetKeyInfo(out SpecificKeyInfo info, keyList, ctx.CurrentKey)) { logger?.LogMessage($"Failed to match key {ctx.CurrentKey.ToString()}"); continue; } Span <byte> key; // Get the dev key in the key set if needed. if (info.IsDev && keySet.CurrentMode == KeySet.Mode.Prod) { keySet.SetMode(KeySet.Mode.Dev); key = info.Key.Getter(keySet, info.Index); keySet.SetMode(KeySet.Mode.Prod); } else { key = info.Key.Getter(keySet, info.Index); } if (ctx.CurrentValue.Length != key.Length * 2) { logger?.LogMessage($"Key {ctx.CurrentKey.ToString()} has incorrect size {ctx.CurrentValue.Length}. Must be {key.Length * 2} hex digits."); continue; } if (!StringUtils.TryFromHexString(ctx.CurrentValue, key)) { key.Clear(); logger?.LogMessage($"Key {ctx.CurrentKey.ToString()} has an invalid value. Must be {key.Length * 2} hex digits."); } } else if (status == ReaderStatus.Finished) { break; } } }