예제 #1
0
        private static byte[] DecryptKey(KeyStoreV3 <ScryptParams> keystore, string password)
        {
            if (ReferenceEquals(keystore, null))
            {
                throw new ArgumentNullException(nameof(keystore));
            }
            if (password.IsNullOrEmpty())
            {
                throw new ArgumentNullException(nameof(password));
            }

            var crypto    = keystore.crypto;
            var kdfparams = crypto.kdfparams;

            // unsupported cipher
            if (crypto.cipher != CIPHER)
            {
                throw new ArgumentException("unsupported cipher");
            }

            // decrypt
            return(PbkdfCrypt.DecryptScrypt(password, HexToByteArray(crypto.mac),
                                            HexToByteArray(crypto.cipherparams.iv),
                                            HexToByteArray(crypto.ciphertext),
                                            kdfparams.n, kdfparams.p, kdfparams.r,
                                            HexToByteArray(kdfparams.salt), kdfparams.dklen));
        }
        internal static PrivateKey DecryptKey(KeyStoreV3 <ScryptParams> keyStore, string password)
        {
            if (string.IsNullOrEmpty(password))
            {
                throw new KdfException(ErrorCode.BAD_ARGUMENT, "empty password");
            }
            if (ReferenceEquals(keyStore, null))
            {
                throw new KdfException(ErrorCode.BAD_ARGUMENT, "keyStore is null");
            }

            var crypto    = keyStore.crypto;
            var kdfparams = keyStore.crypto.kdfparams;

            // unsupported cipher
            if (crypto.cipher != CIPHER)
            {
                throw new KdfException(ErrorCode.UNSUPPORTED, $"unsupported cipher:{crypto.cipher}");
            }

            var key = PbkdfCrypt.DecryptScrypt(password, crypto.mac.HexToBytes(),
                                               crypto.cipherparams.iv.HexToBytes(),
                                               crypto.ciphertext.HexToBytes(),
                                               kdfparams.n, kdfparams.p, kdfparams.r,
                                               kdfparams.salt.HexToBytes(), kdfparams.dklen);

            return(new PrivateKey(key));
        }