< Summary

Class:Microsoft.Azure.KeyVault.Cryptography.ByteExtensions
Assembly:Microsoft.Azure.KeyVault.Cryptography
File(s):C:\Git\azure-sdk-for-net\sdk\keyvault\Microsoft.Azure.KeyVault.Cryptography\src\ByteExtensions.cs
Covered lines:25
Uncovered lines:25
Coverable lines:50
Total lines:128
Line coverage:50% (25 of 50)
Covered branches:17
Total branches:38
Branch coverage:44.7% (17 of 38)

Metrics

MethodCyclomatic complexity Line coverage Branch coverage
SequenceEqualConstantTime(...)-75%75%
Or(...)-0%100%
Or(...)-0%0%
Xor(...)-100%100%
Xor(...)-50%50%
Take(...)-100%100%
Take(...)-63.64%50%
Zero(...)-75%50%

File(s)

C:\Git\azure-sdk-for-net\sdk\keyvault\Microsoft.Azure.KeyVault.Cryptography\src\ByteExtensions.cs

#LineLine coverage
 1// Copyright (c) Microsoft Corporation. All rights reserved.
 2// Licensed under the MIT License. See License.txt in the project root for
 3// license information.
 4
 5using System;
 6
 7namespace Microsoft.Azure.KeyVault.Cryptography
 8{
 9    internal static class ByteExtensions
 10    {
 11        internal static bool SequenceEqualConstantTime( this byte[] self, byte[] other )
 12        {
 3013            if ( self == null )
 014                throw new ArgumentNullException( "self" );
 15
 3016            if ( other == null )
 017                throw new ArgumentNullException( "other" );
 18
 19            // Constant time comparison of two byte arrays
 3020            uint difference = (uint)self.Length ^ (uint)other.Length;
 21
 73222            for ( var i = 0; i < self.Length && i < other.Length; i++ )
 23            {
 33624                difference |= (uint)( self[i] ^ other[i] );
 25            }
 26
 3027            return difference == 0;
 28        }
 29
 30        internal static byte[] Or( this byte[] self, byte[] other )
 31        {
 032            return Or( self, other, 0 );
 33        }
 34
 35        internal static byte[] Or( this byte[] self, byte[] other, int offset )
 36        {
 037            if ( self == null )
 038                throw new ArgumentNullException( "self" );
 39
 040            if ( other == null )
 041                throw new ArgumentNullException( "other" );
 42
 043            if ( self.Length > other.Length - offset )
 044                throw new ArgumentException( "self and other lengths do not match" );
 45
 046            var result = new byte[self.Length];
 47
 048            for ( var i = 0; i < self.Length; i++ )
 49            {
 050                result[i] = (byte)( self[i] | other[offset + i] );
 51            }
 52
 053            return result;
 54        }
 55
 56        internal static byte[] Xor( this byte[] self, byte[] other, bool inPlace = false )
 57        {
 57658            return Xor( self, other, 0, inPlace );
 59        }
 60
 61        internal static byte[] Xor( this byte[] self, byte[] other, int offset, bool inPlace = false )
 62        {
 57663            if ( self == null )
 064                throw new ArgumentNullException( "self" );
 65
 57666            if ( other == null )
 067                throw new ArgumentNullException( "other" );
 68
 57669            if ( self.Length > other.Length - offset )
 070                throw new ArgumentException( "self and other lengths do not match" );
 71
 57672            if ( inPlace )
 73            {
 1036874                for ( var i = 0; i < self.Length; i++ )
 75                {
 460876                    self[i] = (byte)( self[i] ^ other[offset + i] );
 77                }
 78
 57679                return self;
 80            }
 81            else
 82            {
 083                var result = new byte[self.Length];
 84
 085                for ( var i = 0; i < self.Length; i++ )
 86                {
 087                    result[i] = (byte)( self[i] ^ other[offset + i] );
 88                }
 89
 090                return result;
 91            }
 92        }
 93
 94        internal static byte[] Take( this byte[] self, int count )
 95        {
 7696            return ByteExtensions.Take( self, 0, count );
 97        }
 98
 99        internal static byte[] Take( this byte[] self, int offset, int count )
 100        {
 82101            if ( self == null )
 0102                throw new ArgumentNullException( "self" );
 103
 82104            if ( offset < 0 )
 0105                throw new ArgumentException( "offset cannot be < 0", "offset" );
 106
 82107            if ( count <= 0 )
 0108                throw new ArgumentException( "count cannot be <= 0", "count" );
 109
 82110            if ( offset + count > self.Length )
 0111                throw new ArgumentException( "offset + count cannot be > self.Length", "count" );
 112
 82113            var result = new byte[count];
 114
 82115            Array.Copy( self, offset, result, 0, count );
 116
 82117            return result;
 118        }
 119
 120        internal static void Zero( this byte[] self )
 121        {
 60122            if ( self == null )
 0123                throw new ArgumentNullException( "self" );
 124
 60125            Array.Clear( self, 0, self.Length );
 60126        }
 127    }
 128}