/// <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; }
/// <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; }
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); }
/// <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)); }