Beispiel #1
0
        protected string DecryptUnderZMK(string clearZMK, string cryptData, KeySchemeTable.KeyScheme ZMK_KeyScheme, string AtallaVariant)
        {
            string result = "";

            clearZMK = Utility.TransformUsingAtallaVariant(clearZMK, AtallaVariant);

            switch (ZMK_KeyScheme)
            {
            case KeySchemeTable.KeyScheme.SingleDESKey:
            case KeySchemeTable.KeyScheme.DoubleLengthKeyAnsi:
            case KeySchemeTable.KeyScheme.TripleLengthKeyAnsi:
            case KeySchemeTable.KeyScheme.Unspecified:
                result = ThalesCore.Cryptography.TripleDES.TripleDESDecrypt(new ThalesCore.Cryptography.HexKey(clearZMK), cryptData);
                break;

            case KeySchemeTable.KeyScheme.DoubleLengthKeyVariant:
            case KeySchemeTable.KeyScheme.TripleLengthKeyVariant:
                result = ThalesCore.Cryptography.TripleDES.TripleDESDecryptVariant(new ThalesCore.Cryptography.HexKey(clearZMK), cryptData);
                break;
            }
            switch (ZMK_KeyScheme)
            {
            case KeySchemeTable.KeyScheme.DoubleLengthKeyAnsi:
            case KeySchemeTable.KeyScheme.DoubleLengthKeyVariant:
            case KeySchemeTable.KeyScheme.TripleLengthKeyAnsi:
            case KeySchemeTable.KeyScheme.TripleLengthKeyVariant:
                result = KeySchemeTable.GetKeySchemeValue(ZMK_KeyScheme) + result;
                break;
            }
            return(result);
        }
Beispiel #2
0
        public override string ProcessMessage()
        {
            LMKPairs.LMKPair         LMKKeyPair; string var = "";
            KeySchemeTable.KeyScheme ks;
            HexKey.KeyLength         kl;
            KeySchemeTable.KeyScheme zmkKS;
            HexKey.KeyLength         zmkKL;

            string cryptKey  = m_inStack.PopFromStack().ConsoleMessageProperty;
            string cryptZMK  = m_inStack.PopFromStack().ConsoleMessageProperty;
            string keyScheme = m_inStack.PopFromStack().ConsoleMessageProperty;
            string keyType   = m_inStack.PopFromStack().ConsoleMessageProperty;

            ExtractKeySchemeAndLength(cryptZMK, out zmkKL, out zmkKS);
            ExtractKeySchemeAndLength(cryptKey, out kl, out ks);
            ValidateKeyTypeCode(keyType, out LMKKeyPair, out var);

            if ((ks == KeySchemeTable.KeyScheme.DoubleLengthKeyVariant) || (ks == KeySchemeTable.KeyScheme.TripleLengthKeyVariant))
            {
                return("INVALID KEY SCHEME FOR ENCRYPTED KEY - MUST BE ANSI");
            }


            string clearZMK      = Utility.DecryptZMKEncryptedUnderLMK(new HexKey(cryptZMK).ToString(), zmkKS, 0);
            string clearKey      = TripleDES.TripleDESDecrypt(new HexKey(clearZMK), new HexKey(cryptKey).ToString());
            string cryptUnderLMK = Utility.EncryptUnderLMK(clearKey, KeySchemeTable.GetKeySchemeFromValue(keyScheme), LMKKeyPair, var);
            string chkVal        = TripleDES.TripleDESEncrypt(new HexKey(clearKey), ZEROES);

            return("Key under LMK: " + MakeKeyPresentable(cryptUnderLMK) + System.Environment.NewLine +
                   "Key Check Value: " + MakeCheckValuePresentable(chkVal));
        }
Beispiel #3
0
 protected bool ValidateKeySchemeCode(string ksc, ref KeySchemeTable.KeyScheme KS, ref ThalesCore.Message.MessageResponse MR)
 {
     try
     {
         KS = KeySchemeTable.GetKeySchemeFromValue(ksc);
         return(true);
     }
     catch (ThalesCore.Exceptions.XInvalidKeyType ex)
     {
         MR.AddElement(ErrorCodes.ER_26_INVALID_KEY_SCHEME);
         return(false);
     }
 }
Beispiel #4
0
        public HexKey(string key)
        {
            if ((key == null) || (key == ""))
            {
                throw new Exceptions.XInvalidKey("Invalid key data: " + key);
            }

            if ((key.Length == 17) || (key.Length == 33) || (key.Length == 49))
            {
                _scheme = KeySchemeTable.GetKeySchemeFromValue(key.Substring(0, 1));
                if ((_scheme != KeySchemeTable.KeyScheme.DoubleLengthKeyAnsi) &&
                    (_scheme != KeySchemeTable.KeyScheme.DoubleLengthKeyVariant) &&
                    (_scheme != KeySchemeTable.KeyScheme.SingleDESKey) &&
                    (_scheme != KeySchemeTable.KeyScheme.TripleLengthKeyAnsi) &&
                    (_scheme != KeySchemeTable.KeyScheme.TripleLengthKeyVariant))
                {
                    throw new Exceptions.XInvalidKeyScheme("Invalid key scheme " + key.Substring(0, 1));
                }
                else
                {
                    key = key.Substring(1);
                }
            }
            else
            {
                if (key.Length == 16)
                {
                    _scheme = KeySchemeTable.KeyScheme.SingleDESKey;
                }
                else if (key.Length == 32)
                {
                    _scheme = KeySchemeTable.KeyScheme.DoubleLengthKeyAnsi;
                }
                else
                {
                    _scheme = KeySchemeTable.KeyScheme.TripleLengthKeyAnsi;
                }
            }

            if (Utility.IsHexString(key) == false)
            {
                throw new Exceptions.XInvalidKey("Invalid key data: " + key);
            }

            if (key.Length == 16)
            {
                _partA     = key;
                _partB     = key;
                _partC     = key;
                _keyLength = KeyLength.SingleLength;
            }
            else if (key.Length == 32)
            {
                _partA     = key.Substring(0, 16);
                _partB     = key.Substring(16);
                _partC     = _partA;
                _keyLength = KeyLength.DoubleLength;
            }
            else if (key.Length == 48)
            {
                _partA     = key.Substring(0, 16);
                _partB     = key.Substring(16, 16);
                _partC     = key.Substring(32);
                _keyLength = KeyLength.TripleLength;
            }
            else
            {
                throw new Exceptions.XInvalidKey("Invalid key length: " + key);
            }
        }
 protected void ValidateKeySchemeCode(string ksc, KeySchemeTable.KeyScheme KS)
 {
     KS = KeySchemeTable.GetKeySchemeFromValue(ksc);
 }
Beispiel #6
0
        public override string ProcessMessage()
        {
            LMKPairs.LMKPair LMKKeyPair = LMKPairs.LMKPair.Null;
            string           var        = "";

            KeySchemeTable.KeyScheme ks    = KeySchemeTable.KeyScheme.Unspecified;
            HexKey.KeyLength         kl    = HexKey.KeyLength.SingleLength;
            KeySchemeTable.KeyScheme zmkKS = KeySchemeTable.KeyScheme.Unspecified;
            HexKey.KeyLength         zmkKL;

            string cryptKey  = m_inStack.PopFromStack().ConsoleMessageProperty;
            string cryptZMK  = m_inStack.PopFromStack().ConsoleMessageProperty;
            string keyScheme = m_inStack.PopFromStack().ConsoleMessageProperty;
            string keyType   = m_inStack.PopFromStack().ConsoleMessageProperty;

            ExtractKeySchemeAndLength(cryptZMK, out zmkKL, out zmkKS);
            ExtractKeySchemeAndLength(cryptKey, out kl, out ks);
            ValidateKeyTypeCode(keyType, out LMKKeyPair, out var);

            string clearZMK = Utility.DecryptZMKEncryptedUnderLMK(new HexKey(cryptZMK).ToString(), zmkKS, 0);
            string clearKey = Utility.DecryptUnderLMK(new HexKey(cryptKey).ToString(), ks, LMKKeyPair, var);

            string cryptUnderZMK = Utility.EncryptUnderZMK(clearZMK, new HexKey(clearKey).ToString(), KeySchemeTable.GetKeySchemeFromValue(keyScheme));
            string chkVal        = TripleDES.TripleDESEncrypt(new HexKey(clearKey), ZEROES);

            return("Key encrypted under ZMK: " + MakeKeyPresentable(cryptUnderZMK) + System.Environment.NewLine +
                   "Key Check Value: " + MakeCheckValuePresentable(chkVal));
        }