Ejemplo n.º 1
0
        /// <summary>
        /// Get security enum as integer value.
        /// </summary>
        /// <param name="security">Security level.</param>
        /// <returns>Integer value of security level.</returns>
        private static int GetSecurityValue(Gurux.DLMS.Enums.Security security)
        {
            int value = 0;

            switch (security)
            {
            case Gurux.DLMS.Enums.Security.None:
                value = 0;
                break;

            case Gurux.DLMS.Enums.Security.Authentication:
                value = 1;
                break;

            case Gurux.DLMS.Enums.Security.Encryption:
                value = 2;
                break;

            case Gurux.DLMS.Enums.Security.AuthenticationEncryption:
                value = 3;
                break;

            default:
                throw new ArgumentOutOfRangeException("Invalid Security enum.");
            }
            return(value);
        }
        /// <summary>
        /// Constructor.
        /// </summary>
        /// <param name="security">Used security level.</param>
        /// <param name="encrypt"></param>
        /// <param name="blockCipherKey"></param>
        /// <param name="aad"></param>
        /// <param name="iv"></param>
        /// <param name="tag"></param>
        public GXDLMSChipperingStream(Gurux.DLMS.Enums.Security security, bool encrypt, byte[] blockCipherKey, byte[] aad, byte[] iv, byte[] tag)
        {
            this.Security = security;
            const int TagSize = 0x10;

            this.Tag = tag;
            if (this.Tag == null)//Tag size is 12 bytes.
            {
                this.Tag = new byte[12];
            }
            else if (this.Tag.Length != 12)
            {
                throw new ArgumentOutOfRangeException("Invalid tag.");
            }
            Encrypt    = encrypt;
            WorkingKey = GenerateKey(encrypt, blockCipherKey);
            int bufLength = Encrypt ? BlockSize : (BlockSize + TagSize);

            this.bufBlock = new byte[bufLength];
            Aad           = aad;
            this.H        = new byte[BlockSize];
            ProcessBlock(H, 0, H, 0);
            Init(H);
            this.J0 = new byte[16];
            Array.Copy(iv, 0, J0, 0, iv.Length);
            this.J0[15]         = 0x01;
            this.S              = GetGHash(Aad);
            this.counter        = (byte[])J0.Clone();
            this.BytesRemaining = 0;
            this.totalLength    = 0;
        }
Ejemplo n.º 3
0
 /// <summary>
 /// Constructor.
 /// </summary>
 /// <param name="tag">Command.</param>
 /// <param name="security"></param>
 /// <param name="invocationCounter">Invocation counter.</param>
 /// <param name="systemTitle"></param>
 /// <param name="blockCipherKey"></param>
 /// <param name="authenticationKey"></param>
 public AesGcmParameter(
     byte tag,
     Gurux.DLMS.Enums.Security security,
     UInt32 invocationCounter,
     byte[] systemTitle,
     byte[] blockCipherKey,
     byte[] authenticationKey)
 {
     Tag               = tag;
     Security          = security;
     InvocationCounter = invocationCounter;
     SystemTitle       = systemTitle;
     BlockCipherKey    = blockCipherKey;
     AuthenticationKey = authenticationKey;
     Type              = CountType.Packet;
 }
Ejemplo n.º 4
0
 private static byte[] GetAuthenticatedData(Gurux.DLMS.Enums.Security security, byte[] AuthenticationKey, byte[] plainText)
 {
     if (security == Gurux.DLMS.Enums.Security.Authentication)
     {
         GXByteBuffer tmp2 = new GXByteBuffer();
         tmp2.SetUInt8((byte)security);
         tmp2.Set(AuthenticationKey);
         tmp2.Set(plainText);
         return(tmp2.Array());
     }
     else if (security == Gurux.DLMS.Enums.Security.Encryption)
     {
         return(AuthenticationKey);
     }
     else if (security == Gurux.DLMS.Enums.Security.AuthenticationEncryption)
     {
         GXByteBuffer tmp2 = new GXByteBuffer();
         tmp2.SetUInt8((byte)security);
         tmp2.Set(AuthenticationKey);
         return(tmp2.Array());
     }
     return(null);
 }
Ejemplo n.º 5
0
 /// <summary>
 /// Activates and strengthens the security policy.
 /// </summary>
 /// <param name="client">DLMS client that is used to generate action.</param>
 /// <param name="security">New security level.</param>
 /// <returns>Generated action.</returns>
 public byte[][] Activate(GXDLMSClient client, Gurux.DLMS.Enums.Security security)
 {
     return(client.Method(this, 1, GetSecurityValue(security), DataType.Enum));
 }
Ejemplo n.º 6
0
 /// <summary>
 /// Constructor.
 /// </summary>
 /// <param name="security">Used security level.</param>
 /// <param name="encrypt"></param>
 /// <param name="blockCipherKey"></param>
 /// <param name="aad"></param>
 /// <param name="iv"></param>
 /// <param name="tag"></param>
 public GXDLMSChipperingStream(Gurux.DLMS.Enums.Security security, bool encrypt, byte[] blockCipherKey, byte[] aad, byte[] iv, byte[] tag)
 {
     this.Security = security;
     const int TagSize = 0x10;
     this.Tag = tag;
     if (this.Tag == null)//Tag size is 12 bytes.
     {
         this.Tag = new byte[12];
     }
     else if (this.Tag.Length != 12)
     {
         throw new ArgumentOutOfRangeException("Invalid tag.");
     }
     Encrypt = encrypt;
     WorkingKey = GenerateKey(encrypt, blockCipherKey);
     int bufLength = Encrypt ? BlockSize : (BlockSize + TagSize);
     this.bufBlock = new byte[bufLength];
     Aad = aad;
     this.H = new byte[BlockSize];
     ProcessBlock(H, 0, H, 0);
     Init(H);
     this.J0 = new byte[16];
     Array.Copy(iv, 0, J0, 0, iv.Length);
     this.J0[15] = 0x01;
     this.S = GetGHash(Aad);
     this.counter = (byte[])J0.Clone();
     this.BytesRemaining = 0;
     this.totalLength = 0;
 }