internal static void DecryptKeysets(JToken keysets, ClientInfo clientInfo, Keychain keychain) { var sorted = keysets .OrderByDescending(i => i.StringAt("encryptedBy") == MasterKeyId) // everything with "mp" goes first .ThenByDescending(i => i.IntAt("sn")) // and then is sorted by "sn" .ToArray(); if (sorted[0].StringAt("encryptedBy") != MasterKeyId) { throw ExceptionFactory.MakeInvalidOperation( string.Format("Invalid keyset (key must be encrypted by '{0}')", MasterKeyId)); } var keyInfo = sorted[0].At("encSymKey"); var masterKey = DeriveMasterKey(algorithm: keyInfo.StringAt("alg"), iterations: keyInfo.IntAt("p2c"), salt: keyInfo.StringAt("p2s").Decode64(), clientInfo: clientInfo); keychain.Add(masterKey); foreach (var i in sorted) { DecryptKeyset(i, keychain); } }
internal static void DecryptRsaKey(JToken key, Keychain keychain) { keychain.Add(RsaKey.Parse(Decrypt(key, keychain))); }