/// <summary> /// Encode the desired access for the full sector including the block tailer /// </summary> /// <param name="accessSector">The access desired</param> /// <param name="accessTypes">An array of 3 AccessType determining access of each block</param> /// <returns>The 3 bytes encoding the rights</returns> public (byte b6, byte b7, byte b8) EncodeSectorAndClockTailer(AccessSector accessSector, AccessType[] accessTypes) { if (accessTypes.Length != 3) { throw new ArgumentException($"{nameof(accessTypes)} can only be array of 3"); } var tupleRes = EncodeSectorTailer(accessSector); byte b6 = tupleRes.Item1; byte b7 = tupleRes.Item2; byte b8 = tupleRes.Item3; for (byte i = 0; i < 3; i++) { tupleRes = EncodeSectorTailer(i, accessTypes[i]); b6 |= tupleRes.Item1; b7 |= tupleRes.Item2; b8 |= tupleRes.Item3; } return(b6, b7, b8); }
/// <summary> /// Encode the desired access for the full sector including the block tailer /// </summary> /// <param name="accessSector">The access desired</param> /// <param name="accessTypes">An array of 3 AccessType determining access of each block</param> /// <returns>The 3 bytes encoding the rights</returns> public (byte B6, byte B7, byte B8) EncodeSectorAndClockTailer(AccessSector accessSector, AccessType[] accessTypes) { if (accessTypes.Length != 3) { throw new ArgumentException("Array must have 3 elements.", nameof(accessTypes)); } var tupleRes = EncodeSectorTailer(accessSector); byte b6 = tupleRes.B6; byte b7 = tupleRes.B7; byte b8 = tupleRes.B8; for (byte i = 0; i < 3; i++) { tupleRes = EncodeSectorTailer(i, accessTypes[i]); b6 |= tupleRes.B6; b7 |= tupleRes.B7; b8 |= tupleRes.B8; } return(b6, b7, b8); }
/// <summary> /// Get the sector tailer bytes for a specific access sector configuration /// </summary> /// <param name="accessSector">the access sector</param> /// <returns>the 3 bytes for configuration</returns> public (byte B6, byte B7, byte B8) EncodeSectorTailer(AccessSector accessSector) { byte c1 = 0; byte c2 = 0; byte c3 = 0; // Ignore AccessSector.KeyBRead accessSector = accessSector & ~AccessSector.ReadKeyB; // Find the table of truth and the core Access Bits if (accessSector == (AccessSector.WriteKeyAWithKeyA | AccessSector.ReadAccessBitsWithKeyA | AccessSector.ReadKeyBWithKeyA | AccessSector.WriteKeyBWithKeyA)) { c1 = 0; c2 = 0; c3 = 0; } if (accessSector == (AccessSector.ReadAccessBitsWithKeyA | AccessSector.ReadKeyBWithKeyA)) { c1 = 0; c2 = 1; c3 = 0; } if (accessSector == (AccessSector.WriteKeyAWithKeyB | AccessSector.ReadAccessBitsWithKeyA | AccessSector.ReadAccessBitsWithKeyB | AccessSector.WriteKeyBWithKeyB)) { c1 = 1; c2 = 0; c3 = 0; } if (accessSector == (AccessSector.ReadAccessBitsWithKeyA | AccessSector.ReadAccessBitsWithKeyB)) { c1 = 1; c2 = 1; c3 = 0; } if (accessSector == (AccessSector.WriteKeyAWithKeyA | AccessSector.ReadAccessBitsWithKeyA | AccessSector.WriteAccessBitsWithKeyA | AccessSector.ReadKeyBWithKeyA | AccessSector.WriteKeyBWithKeyA)) { c1 = 0; c2 = 0; c3 = 1; } if (accessSector == (AccessSector.WriteKeyAWithKeyB | AccessSector.ReadAccessBitsWithKeyA | AccessSector.ReadAccessBitsWithKeyB | AccessSector.WriteAccessBitsWithKeyB | AccessSector.WriteKeyBWithKeyB)) { c1 = 0; c2 = 1; c3 = 1; } if (accessSector == (AccessSector.ReadAccessBitsWithKeyA | AccessSector.ReadAccessBitsWithKeyB | AccessSector.WriteAccessBitsWithKeyB)) { c1 = 1; c2 = 0; c3 = 1; } if (accessSector == (AccessSector.ReadAccessBitsWithKeyA | AccessSector.ReadAccessBitsWithKeyB)) { c1 = 1; c2 = 1; c3 = 1; } // Encode the into the 3 bytes byte b6 = (byte)((((~c2) & 0x01) << 7) | (((~c1) & 0x01) << 3)); byte b7 = (byte)(((c1) << 7) | (((~c3) & 0x01) << 3)); byte b8 = (byte)(((c3) << 7) | ((c2) << 3)); return(b6, b7, b8); }