예제 #1
0
        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);
            }
        }
예제 #2
0
 internal static void DecryptRsaKey(JToken key, Keychain keychain)
 {
     keychain.Add(RsaKey.Parse(Decrypt(key, keychain)));
 }