Commits

Devin Martin  committed 2c8ffea

Switch the subrepo (OtpSharp) to NuGet

  • Participants
  • Parent commits 3141005

Comments (0)

Files changed (10)

File .hgsub

-OtpSharp=https://bitbucket.org/devinmartin/otp-sharp

File .hgsubstate

-65e874104390cfea3de65f0a9e6027564c8dc54b OtpSharp
 
 Microsoft Visual Studio Solution File, Format Version 12.00
 # Visual Studio 2012
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OtpSharp", "OtpSharp\OtpSharp\OtpSharp.csproj", "{DF432B25-4EBE-4C89-B7BD-0553CB6301B9}"
-EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KeeOtp", "KeeOtp\KeeOtp.csproj", "{4C1BB6F8-D2CD-49C2-9053-21705681356C}"
 EndProject
 Global
 		Release|Any CPU = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{DF432B25-4EBE-4C89-B7BD-0553CB6301B9}.Debug|Any CPU.ActiveCfg = Release35Client|Any CPU
-		{DF432B25-4EBE-4C89-B7BD-0553CB6301B9}.Debug|Any CPU.Build.0 = Release35Client|Any CPU
-		{DF432B25-4EBE-4C89-B7BD-0553CB6301B9}.Release|Any CPU.ActiveCfg = Release35Client|Any CPU
-		{DF432B25-4EBE-4C89-B7BD-0553CB6301B9}.Release|Any CPU.Build.0 = Release35Client|Any CPU
 		{4C1BB6F8-D2CD-49C2-9053-21705681356C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{4C1BB6F8-D2CD-49C2-9053-21705681356C}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{4C1BB6F8-D2CD-49C2-9053-21705681356C}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{4C1BB6F8-D2CD-49C2-9053-21705681356C}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
+	GlobalSection(MonoDevelopProperties) = preSolution
+		StartupItem = KeeOtp\KeeOtp.csproj
+	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
 	EndGlobalSection

File KeeOtp/KeeOtp.csproj

     <AppDesignerFolder>Properties</AppDesignerFolder>
     <RootNamespace>KeeOtp</RootNamespace>
     <AssemblyName>KeeOtp</AssemblyName>
-    <SignAssembly>true</SignAssembly>
-    <AssemblyOriginatorKeyFile>
-    </AssemblyOriginatorKeyFile>
+    <SignAssembly>True</SignAssembly>
     <FileUpgradeFlags>
     </FileUpgradeFlags>
     <OldToolsVersion>4.0</OldToolsVersion>
     <UpgradeBackupLocation>
     </UpgradeBackupLocation>
-    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
     <PublishUrl>publish\</PublishUrl>
     <Install>true</Install>
     <InstallFrom>Disk</InstallFrom>
     <IsWebBootstrapper>false</IsWebBootstrapper>
     <UseApplicationTrust>false</UseApplicationTrust>
     <BootstrapperEnabled>true</BootstrapperEnabled>
-    <TargetFrameworkProfile />
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
+    <DebugSymbols>True</DebugSymbols>
     <DebugType>full</DebugType>
-    <Optimize>false</Optimize>
+    <Optimize>False</Optimize>
     <OutputPath>bin\Debug\</OutputPath>
     <DefineConstants>DEBUG;TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <DebugType>pdbonly</DebugType>
-    <Optimize>true</Optimize>
+    <Optimize>True</Optimize>
     <OutputPath>bin\Release\</OutputPath>
     <DefineConstants>TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
     <Reference Include="System.Drawing" />
     <Reference Include="System.Windows.Forms" />
     <Reference Include="System.Xml" />
+    <Reference Include="OtpSharp">
+      <HintPath>..\packages\OtpSharp.1.0.5.0\lib\net40\OtpSharp.dll</HintPath>
+    </Reference>
   </ItemGroup>
   <ItemGroup>
     <Compile Include="AsyncOperation.cs" />
     </EmbeddedResource>
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="..\OtpSharp\OtpSharp\OtpSharp.csproj">
-      <Project>{df432b25-4ebe-4c89-b7bd-0553cb6301b9}</Project>
-      <Name>OtpSharp</Name>
-    </ProjectReference>
-  </ItemGroup>
-  <ItemGroup>
     <None Include="Resources\clock.png" />
+    <None Include="packages.config" />
   </ItemGroup>
   <ItemGroup>
     <Content Include="Resources\lock-key.png" />

File KeeOtp/packages.config

+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="OtpSharp" version="1.0.5.0" targetFramework="net40" />
+</packages>

File packages/OtpSharp.1.0.5.0/OtpSharp.1.0.5.0.nupkg

Binary file added.

File packages/OtpSharp.1.0.5.0/OtpSharp.1.0.5.0.nuspec

+<?xml version="1.0" encoding="utf-8"?>
+<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
+  <metadata>
+    <id>OtpSharp</id>
+    <version>1.0.5.0</version>
+    <title>OTP Sharp</title>
+    <authors>Devin Martin</authors>
+    <owners>Devin Martin</owners>
+    <licenseUrl>https://s3.amazonaws.com/OtpSharp/LICENSE.txt</licenseUrl>
+    <projectUrl>https://bitbucket.org/devinmartin/otp-sharp/wiki/Home</projectUrl>
+    <requireLicenseAcceptance>true</requireLicenseAcceptance>
+    <description>This is an implementation of HOTP and TOTP which are commonly used for multi factor authentication by using a shared key between the client and the server to generate and verify one time use codes.  This library is capable of generating and verifying both TOTP and HOTP authentication codes.  The calculations in this library are known to be compatible with Google 2-Step Verification and consequently the Google Authenticator smartphone app.  It is also known to be able to generate codes for Amazon Web Services Multi Factor Authentication and Dropbox 2 step authentication.  It should work with any other service or client that is RFC compliant.
+
+This library is released under an MIT license. No warranty is provided as to the correctness of the library and the consumer of the library assumes all risk for the use thereof, as per the MIT license.
+
+Every effort has gone into implementing this library in accordance with the RFCs mentioned above. However it is up to the users of this library to read through the RFCs and ensure that this implementation is in accordance with the security procedures outlined therein.
+
+The implementation includes the code calculation as well as simple verification. Persistence of the keys, secure key storage, ensuring that a single code can't be validated multiple times and other things are not a part of this library. Thus far those functions (and any others mentioned in the RFCs) are up to the consumer of this library.
+
+For documentation please visit the project website.</description>
+    <summary>An implementation of HOTP or HMAC One Time Paswords (RFC 4226) and TOTP or Timed One Time Passwords (RFC 6238) in C#.  Additionally contains a base 32 encoder.</summary>
+    <releaseNotes>1.0.4 Changed the Protected Key API to be more explicit (may break existing direct useage of the protected key)
+
+The protected key no longer implicitly causes side effects (destroying the plaintext key provided must be done explicitly)
+
+Added a time correction class with experimental NTP abilities.
+
+Support for .net 3.5 as well as client profiles with some minor limitations.
+
+1.0.3 Fixed unexpected behavior where the plaintext key provided to an HOTP or TOTP object will be scrambled.  Now it will remain intact.  Added constructor overloads to provide a protected key instead of a byte array if desired.</releaseNotes>
+    <copyright>Copyright 2012-2013 Devin Martin</copyright>
+    <tags>authentication OATH totp otp hotp base32 multi-factor two-factor factor security login OATH-HOTP OATH-TOTP</tags>
+    <references>
+      <reference file="OtpSharp.dll" />
+    </references>
+  </metadata>
+</package>

File packages/OtpSharp.1.0.5.0/lib/net40/OtpSharp.XML

+<?xml version="1.0"?>
+<doc>
+    <assembly>
+        <name>OtpSharp</name>
+    </assembly>
+    <members>
+        <member name="T:OtpSharp.Base32">
+            <summary>
+            Utility to deal with Base32 encoding and decoding
+            </summary>
+            <remarks>
+            http://tools.ietf.org/html/rfc4648
+            </remarks>
+        </member>
+        <member name="F:OtpSharp.Base32.encodedBitCount">
+            <summary>
+            The number of bits in a base32 encoded character
+            </summary>
+        </member>
+        <member name="F:OtpSharp.Base32.byteBitCount">
+            <summary>
+            The number of bits in a byte
+            </summary>
+        </member>
+        <member name="F:OtpSharp.Base32.encodingChars">
+            <summary>
+            A string containing all of the base32 characters in order.
+            This allows a simple indexof or [index] to convert between
+            a numeric value and an encoded character and vice versa.
+            </summary>
+        </member>
+        <member name="F:OtpSharp.Base32.paddingCharacter">
+            <summary>
+            The rfc defines '=' as the padding character
+            </summary>
+        </member>
+        <member name="M:OtpSharp.Base32.Encode(System.Byte[])">
+            <summary>
+            Takes a block of data and converts it to a base 32 encoded string
+            </summary>
+            <param name="data">Input data</param>
+            <returns>base 32 string</returns>
+        </member>
+        <member name="M:OtpSharp.Base32.Decode(System.String)">
+            <summary>
+            Takes a base 32 encoded value and converts it back to binary data
+            </summary>
+            <param name="base32">Base 32 encoded string</param>
+            <returns>Binary data</returns>
+        </member>
+        <member name="T:OtpSharp.Hotp">
+            <summary>
+            Calculate HMAC-One-Time-Passwords (HOTP) from a secret key
+            </summary>
+        </member>
+        <member name="T:OtpSharp.Otp">
+            <summary>
+            An abstract class that contains common OTP calculations
+            </summary>
+            <remarks>
+            https://tools.ietf.org/html/rfc4226
+            </remarks>
+        </member>
+        <member name="F:OtpSharp.Otp.secretKey">
+            <summary>
+            Secret key
+            </summary>
+        </member>
+        <member name="M:OtpSharp.Otp.#ctor(System.Byte[])">
+            <summary>
+            Constructor for the abstract class.  This is to guarantee that all implementations have a secret key
+            </summary>
+            <param name="secretKey"></param>
+        </member>
+        <member name="M:OtpSharp.Otp.#ctor(OtpSharp.Key)">
+            <summary>
+            Constrocutor for the abstract class.  This is to guarantee that all implementations have a secret key
+            </summary>
+            <param name="secretKey"></param>
+        </member>
+        <member name="M:OtpSharp.Otp.Compute(System.Int64)">
+            <summary>
+            An abstract definition of a compute method.  Takes a counter and runs it through the derived algorithm.
+            </summary>
+            <param name="counter">Counter or step</param>
+            <returns>OTP calculated code</returns>
+        </member>
+        <member name="M:OtpSharp.Otp.CalculateOtp(System.Byte[],OtpSharp.OtpHashMode)">
+            <summary>
+            Helper method that calculates OTPs
+            </summary>
+        </member>
+        <member name="M:OtpSharp.Otp.ComputeHmacHash(System.Byte[],OtpSharp.OtpHashMode)">
+            <summary>
+            Uses the protected key to compute an HMAC Hash
+            </summary>
+            <param name="input">The data to use as the HMAC input</param>
+            <param name="mode">The Hash algorithm to use</param>
+            <returns>The hashed data</returns>
+        </member>
+        <member name="M:OtpSharp.Otp.CreateHmacHash(OtpSharp.OtpHashMode)">
+            <summary>
+            Create an HMAC object for the specified algorithm
+            </summary>
+        </member>
+        <member name="M:OtpSharp.Otp.GetBigEndianBytes(System.Int64)">
+            <summary>
+            converts a long into a big endian byte array.
+            </summary>
+            <remarks>
+            RFC 4226 specifies big endian as the method for converting the counter to data to hash.
+            </remarks>
+        </member>
+        <member name="M:OtpSharp.Otp.Digits(System.Int64,System.Int32)">
+            <summary>
+            truncates a number down to the specified number of digits
+            </summary>
+        </member>
+        <member name="M:OtpSharp.Otp.Verify(System.Int64,System.Int32,System.Int64@,OtpSharp.VerificationWindow)">
+            <summary>
+            Verify an OTP value
+            </summary>
+            <param name="initialStep">The initial step to try</param>
+            <param name="valueToVerify">The value to verify</param>
+            <param name="matchedStep">Output parameter that provides the step where the match was found.  If no match was found it will be 0</param>
+            <param name="window">The window to verify</param>
+            <returns>True if a match is found</returns>
+        </member>
+        <member name="M:OtpSharp.Otp.GetBaseKeyUrl(System.String)">
+            <summary>
+            Gets a URL that conforms to the de-facto standard
+            created and used by Google
+            </summary>
+        </member>
+        <member name="M:OtpSharp.Otp.GetOtpType">
+            <remarks>
+            This method simply exists for tests
+            </remarks>
+        </member>
+        <member name="P:OtpSharp.Otp.OtpType">
+            <summary>
+            Used in generating URLs
+            </summary>
+        </member>
+        <member name="M:OtpSharp.Hotp.#ctor(System.Byte[])">
+            <summary>
+            Create an HOTP instance
+            </summary>
+            <param name="secretKey">The secret key to use in HOTP calculations</param>
+        </member>
+        <member name="M:OtpSharp.Hotp.#ctor(OtpSharp.Key)">
+            <summary>
+            Create an HOTP instance
+            </summary>
+            <param name="secretKey">The secret key to use in HOTP calculations</param>
+        </member>
+        <member name="M:OtpSharp.Hotp.ComputeHotp(System.Int64)">
+            <summary>
+            Takes a counter and produces an HOTP value
+            </summary>
+            <param name="counter">the counter to be incremented each time this method is called</param>
+            <returns>Hotp</returns>
+        </member>
+        <member name="M:OtpSharp.Hotp.ComputeHotpDecimal(System.Int64)">
+            <remarks>
+            This method mainly exists for unit tests.
+            The RFC defines a decimal value in the test table that is an
+            intermediate step to a final HOTP value
+            </remarks>
+        </member>
+        <member name="M:OtpSharp.Hotp.Compute(System.Int64)">
+            <summary>
+            Takes a counter and runs it through the HOTP algorithm.
+            </summary>
+            <param name="counter">Counter or step</param>
+            <returns>HOTP calculated code</returns>
+        </member>
+        <member name="P:OtpSharp.Hotp.OtpType">
+            <summary>
+            Used in generating URLs.  HOTP
+            </summary>
+        </member>
+        <member name="T:OtpSharp.Key">
+            <summary>
+            Class used to represent a key
+            </summary>
+        </member>
+        <member name="M:OtpSharp.Key.UsePlainKey(System.Action{System.Byte[]})">
+            <summary>
+            Allows a delegate to use the key then tries to overwrite it from memory.
+            Warning! Do what you need to with the key within the scope of the delegate as it will overwrite the reference when it exists.
+            </summary>
+            <remarks>
+            This isn't foolproof as the delegate could create another copy of the key and in some cases even must.
+            The goal here is simply to limit the exposre of the plain key in memory as much as possible
+            </remarks>
+            <param name="useKey">Delegate the uses the plaintext key</param>
+            <exception cref="T:System.ArgumentNullException">thrown if no delegate is provided</exception>
+        </member>
+        <member name="M:OtpSharp.Key.GetCopyOfKey">
+            <summary>
+            Gets a copy of the plaintext key
+            </summary>
+            <returns>Plaintext Key</returns>
+        </member>
+        <member name="T:OtpSharp.KeyUtilities">
+            <summary>
+            Some helper methods to perform common key functions
+            </summary>
+        </member>
+        <member name="M:OtpSharp.KeyUtilities.Combine(System.Byte[][])">
+            <summary>
+            Concatinate two byte arrays together
+            </summary>
+            <param name="arrays">The two arrays to concatinate</param>
+            <returns></returns>
+        </member>
+        <member name="M:OtpSharp.KeyUtilities.Destroy(System.Byte[])">
+            <summary>
+            Overwrite potentially sensetive data with random junk
+            </summary>
+            <remarks>
+            Warning!
+            
+            This isn't foolproof by any means.  The garbage collector could have moved the actual
+            location in memory to another location during a collection cycle and left the old data in place
+            simply marking it as available.  We can't control this or even detect it.
+            This method is simply a good faith effort to limit the exposure of sensetive data in memory as much as possible
+            </remarks>
+        </member>
+        <member name="T:OtpSharp.Ntp">
+            <summary>
+            Class to aide with NTP (network time protocol) time corrections
+            </summary>
+            <remarks>
+            This is experimental and doesn't have great test coverage
+            nor is this idea fully developed.
+            This API may change
+            </remarks>
+        </member>
+        <member name="M:OtpSharp.Ntp.GetTimeCorrectionFromNistAsync(System.Threading.CancellationToken)">
+            <summary>
+            Get a time correction factor against NIST
+            </summary>
+            <returns>Time Correction</returns>
+            <remarks>
+            This implementation is experimental and doesn't have any tests against it.
+            This isn't even close to a robust and reliable implementation.
+            </remarks>
+        </member>
+        <member name="M:OtpSharp.Ntp.GetTimeCorrectionFromGoogleAsync">
+            <summary>
+            Get a time correction factor using Google's webservers as the time source.  Extremely fast and reliable but not authoritative.
+            </summary>
+            <returns>Time Correction</returns>
+        </member>
+        <member name="M:OtpSharp.Ntp.GetTimeCorrectionFromNist(System.Threading.CancellationToken)">
+            <summary>
+            Get a time correction factor against NIST
+            </summary>
+            <returns>Time Correction</returns>
+            <remarks>
+            This implementation is experimental and doesn't have any tests against it.
+            This isn't even close to a robust and reliable implementation.
+            </remarks>
+        </member>
+        <member name="M:OtpSharp.Ntp.GetTimeCorrectionFromGoogle">
+            <summary>
+            Get a time correction factor using Google's webservers as the time source.  Extremely fast and reliable but not authoritative.
+            </summary>
+            <returns>Time Correction</returns>
+        </member>
+        <member name="T:OtpSharp.NtpException">
+            <summary>
+            An generic ntp exception
+            </summary>
+        </member>
+        <member name="M:OtpSharp.NtpException.#ctor(System.String)">
+            <summary>
+            NtpException with a message
+            </summary>
+            <param name="message">Message</param>
+        </member>
+        <member name="T:OtpSharp.TimeCorrection">
+            <summary>
+            Class to apply a correction factor to the system time
+            </summary>
+            <remarks>
+            In cases where the local system time is incorrect it is preferable to simply correct the system time.
+            This class is provided to handle cases where it isn't possible for the client, the server, or both, to be on the correct time.
+            
+            This library provides limited facilities to to ping NIST for a correct network time.  This class can be used manually however in cases where a server's time is off
+            and the consumer of this library can't control it.  In that case create an instance of this class and provide the current server time as the correct time parameter
+            
+            This class is immutable and therefore threadsafe
+            </remarks>
+        </member>
+        <member name="F:OtpSharp.TimeCorrection.UncorrectedInstance">
+            <summary>
+            An instance that provides no correction factor
+            </summary>
+        </member>
+        <member name="M:OtpSharp.TimeCorrection.#ctor">
+            <summary>
+            Constructor used solely for the UncorrectedInstance static field to provide an instance without a correction factor.
+            </summary>
+        </member>
+        <member name="M:OtpSharp.TimeCorrection.#ctor(System.DateTime)">
+            <summary>
+            Creates a corrected time object by providing the known correct current UTC time.  The current system UTC time will be used as the reference
+            </summary>
+            <remarks>
+            This overload assumes UTC.  If a base and reference time other than UTC are required then use the other overlaod.
+            </remarks>
+            <param name="correctUtc">The current correct UTC time</param>
+        </member>
+        <member name="M:OtpSharp.TimeCorrection.#ctor(System.DateTime,System.DateTime)">
+            <summary>
+            Creates a corrected time object by providing the known correct current time and the current reference time that needs correction
+            </summary>
+            <param name="correctTime">The current correct time</param>
+            <param name="referenceTime">The current reference time (time that will have the correction factor applied in subsequent calls)</param>
+        </member>
+        <member name="M:OtpSharp.TimeCorrection.GetCorrectedTime(System.DateTime)">
+            <summary>
+            Applies the correction factor to the reference time and returns a corrected time
+            </summary>
+            <param name="referenceTime">The reference time</param>
+            <returns>The reference time with the correction factor applied</returns>
+        </member>
+        <member name="P:OtpSharp.TimeCorrection.CorrectedUtcNow">
+            <summary>
+            Applies the correction factor to the current system UTC time and returns a corrected time
+            </summary>
+        </member>
+        <member name="P:OtpSharp.TimeCorrection.CorrectionFactor">
+            <summary>
+            The timespan that is used to calculate a corrected time
+            </summary>
+        </member>
+        <member name="T:OtpSharp.ProtectedKey">
+            <summary>
+            Represents a protected key
+            </summary>
+        </member>
+        <member name="M:OtpSharp.ProtectedKey.CreateProtectedKeyAndDestroyPlaintextKey(System.Byte[])">
+            <summary>
+            Static method to create a protected key from a plaintext key.  It will wipe the reference that was passed in once the protected key instance is initialized
+            </summary>
+            <param name="plaintextKey">The key</param>
+            <returns>A protected key instance from the provided key</returns>
+        </member>
+        <member name="M:OtpSharp.ProtectedKey.CreateProtectedKeyFromPreProtectedMemory(System.Byte[],System.Int32,System.Security.Cryptography.MemoryProtectionScope)">
+            <summary>
+            Creates an instance of the protected key from a byte array that has already been protected using the ProtectedMemory.Protect method call.
+            </summary>
+            <param name="preProtectedKey">Pre-protected key data</param>
+            <param name="keyLength">The length of the plaintext key (protected memory may need to be padded)</param>
+            <param name="scope">The memory protection scope that was used to protect the memory</param>
+            <returns>A protected key instance from the provided key</returns>
+        </member>
+        <member name="M:OtpSharp.ProtectedKey.#ctor(System.Byte[])">
+            <summary>
+            Creates an instance of a protected key.
+            </summary>
+            <param name="key">Plaintext key data</param>
+        </member>
+        <member name="M:OtpSharp.ProtectedKey.GetCopyOfKey">
+            <summary>
+            Gets a copy of the plaintext key
+            </summary>
+            <returns>Plaintext Key</returns>
+        </member>
+        <member name="T:OtpSharp.OtpHashMode">
+            <summary>
+            Indicates which HMAC hashing algorithm should be used
+            </summary>
+        </member>
+        <member name="F:OtpSharp.OtpHashMode.Sha1">
+            <summary>
+            Sha1 is used as the HMAC hashing algorithm
+            </summary>
+        </member>
+        <member name="F:OtpSharp.OtpHashMode.Sha256">
+            <summary>
+            Sha256 is used as the HMAC hashing algorithm
+            </summary>
+        </member>
+        <member name="F:OtpSharp.OtpHashMode.Sha512">
+            <summary>
+            Sha512 is used as the HMAC hashing algorithm
+            </summary>
+        </member>
+        <member name="T:OtpSharp.KeyGeneration">
+            <summary>
+            Helpers to work with keys
+            </summary>
+        </member>
+        <member name="M:OtpSharp.KeyGeneration.GenerateKey(System.Int32)">
+            <summary>
+            Generates a random key in accordance with the RFC recommened length for each algorithm
+            </summary>
+            <param name="length">Key length</param>
+            <returns>The generated key</returns>
+        </member>
+        <member name="M:OtpSharp.KeyGeneration.GenerateRandomKey(System.Int32)">
+            <summary>
+            Generates a random key in accordance with the RFC recommened length for each algorithm
+            </summary>
+            <param name="length">Key length</param>
+            <returns>The generated key</returns>
+        </member>
+        <member name="M:OtpSharp.KeyGeneration.GenerateKey(OtpSharp.OtpHashMode)">
+            <summary>
+            Generates a key in accordance with the RFC recommened length for each algorithm
+            </summary>
+            <param name="mode">HashMode</param>
+            <returns>Key</returns>
+        </member>
+        <member name="M:OtpSharp.KeyGeneration.GenerateRandomKey(OtpSharp.OtpHashMode)">
+            <summary>
+            Generates a random key in accordance with the RFC recommened length for each algorithm
+            </summary>
+            <param name="mode">HashMode</param>
+            <returns>Key</returns>
+        </member>
+        <member name="M:OtpSharp.KeyGeneration.DeriveKeyFromMaster(OtpSharp.Key,System.Byte[],OtpSharp.OtpHashMode)">
+            <summary>
+            Uses the procedure defined in RFC 4226 section 7.5 to derive a key from the master key
+            </summary>
+            <param name="masterKey">The master key from which to derive a device specific key</param>
+            <param name="publicIdentifier">The public identifier that is unique to the authenticating device</param>
+            <param name="mode">The hash mode to use.  This will determine the resulting key lenght.  The default is sha-1 (as per the RFC) which is 20 bytes</param>
+            <returns>Derived key</returns>
+        </member>
+        <member name="M:OtpSharp.KeyGeneration.DeriveKeyFromMaster(OtpSharp.Key,System.Int32,OtpSharp.OtpHashMode)">
+            <summary>
+            Uses the procedure defined in RFC 4226 section 7.5 to derive a key from the master key
+            </summary>
+            <param name="masterKey">The master key from which to derive a device specific key</param>
+            <param name="serialNumber">A serial number that is unique to the authenticating device</param>
+            <param name="mode">The hash mode to use.  This will determine the resulting key lenght.  The default is sha-1 (as per the RFC) which is 20 bytes</param>
+            <returns>Derived key</returns>
+        </member>
+        <member name="T:OtpSharp.Totp">
+            <summary>
+            Calculate Timed-One-Time-Passwords (TOTP) from a secret key
+            </summary>
+            <remarks>
+            The specifications for this are found in RFC 6238
+            http://tools.ietf.org/html/rfc6238
+            </remarks>
+        </member>
+        <member name="F:OtpSharp.Totp.unixEpochTicks">
+            <summary>
+            The number of ticks as Measured at Midnight Jan 1st 1970;
+            </summary>
+        </member>
+        <member name="F:OtpSharp.Totp.ticksToSeconds">
+            <summary>
+            A divisor for converting ticks to seconds
+            </summary>
+        </member>
+        <member name="M:OtpSharp.Totp.#ctor(System.Byte[],System.Int32,OtpSharp.OtpHashMode,System.Int32,OtpSharp.TimeCorrection)">
+            <summary>
+            Create a TOTP instance
+            </summary>
+            <param name="secretKey">The secret key to use in TOTP calculations</param>
+            <param name="step">The time window step amount to use in calculating time windows.  The default is 30 as recommended in the RFC</param>
+            <param name="mode">The hash mode to use</param>
+            <param name="totpSize">The number of digits that the returning TOTP should have.  The default is 6.</param>
+            <param name="timeCorrection">If required, a time correction can be specified to compensate of an out of sync local clock</param>
+        </member>
+        <member name="M:OtpSharp.Totp.#ctor(OtpSharp.Key,System.Int32,OtpSharp.OtpHashMode,System.Int32,OtpSharp.TimeCorrection)">
+            <summary>
+            Create a TOTP instance
+            </summary>
+            <param name="secretKey">The secret key to use in TOTP calculations</param>
+            <param name="step">The time window step amount to use in calculating time windows.  The default is 30 as recommended in the RFC</param>
+            <param name="mode">The hash mode to use</param>
+            <param name="totpSize">The number of digits that the returning TOTP should have.  The default is 6.</param>
+            <param name="timeCorrection">If required, a time correction can be specified to compensate of an out of sync local clock</param>
+        </member>
+        <member name="M:OtpSharp.Totp.ComputeTotp(System.DateTime)">
+            <summary>
+            Takes a timestamp and applies correction (if provided) and then computes a TOTP value
+            </summary>
+            <param name="timestamp">The timestamp to use for the TOTP calculation</param>
+            <returns>a TOTP value</returns>
+        </member>
+        <member name="M:OtpSharp.Totp.ComputeTotp">
+            <summary>
+            Takes a timestamp and computes a TOTP value for corrected UTC now
+            </summary>
+            <remarks>
+            It will be corrected against a corrected UTC time using the provided time correction.  If none was provided then simply the current UTC will be used.
+            </remarks>
+            <returns>a TOTP value</returns>
+        </member>
+        <member name="M:OtpSharp.Totp.VerifyTotp(System.Int32,System.Int64@,OtpSharp.VerificationWindow)">
+            <summary>
+            Verify a value that has been provided with the calculated value.
+            </summary>
+            <remarks>
+            It will be corrected against a corrected UTC time using the provided time correction.  If none was provided then simply the current UTC will be used.
+            </remarks>
+            <param name="totp">the trial TOTP value</param>
+            <param name="timeStepMatched">
+            This is an output parameter that gives that time step that was used to find a match.
+            This is useful in cases where a TOTP value should only be used once.  This value is a unique identifier of the
+            time step (not the value) that can be used to prevent the same step from being used multiple times
+            </param>
+            <param name="window">The window of steps to verify</param>
+            <returns>True if there is a match.</returns>
+        </member>
+        <member name="M:OtpSharp.Totp.VerifyTotp(System.DateTime,System.Int32,System.Int64@,OtpSharp.VerificationWindow)">
+            <summary>
+            Verify a value that has been provided with the calculated value
+            </summary>
+            <param name="timestamp">The timestamp to use</param>
+            <param name="totp">the trial TOTP value</param>
+            <param name="timeStepMatched">
+            This is an output parameter that gives that time step that was used to find a match.
+            This is usefule in cases where a TOTP value should only be used once.  This value is a unique identifier of the
+            time step (not the value) that can be used to prevent the same step from being used multiple times
+            </param>
+            <param name="window">The window of steps to verify</param>
+            <returns>True if there is a match.</returns>
+        </member>
+        <member name="M:OtpSharp.Totp.CalculateTimeStepFromTimestamp(System.DateTime)">
+            <summary>
+            Takes a timestamp and calculates a time step
+            </summary>
+        </member>
+        <member name="M:OtpSharp.Totp.RemainingSeconds">
+            <summary>
+            Remaining seconds in current window based on UtcNow
+            </summary>
+            <remarks>
+            It will be corrected against a corrected UTC time using the provided time correction.  If none was provided then simply the current UTC will be used.
+            </remarks>
+            <returns>Number of remaining seconds</returns>
+        </member>
+        <member name="M:OtpSharp.Totp.RemainingSeconds(System.DateTime)">
+            <summary>
+            Remaining seconds in current window
+            </summary>
+            <param name="timestamp">The timestamp</param>
+            <returns>Number of remaining seconds</returns>
+        </member>
+        <member name="M:OtpSharp.Totp.Compute(System.Int64)">
+            <summary>
+            Takes a time step and computes a TOTP code
+            </summary>
+            <param name="counter">time step</param>
+            <returns>TOTP calculated code</returns>
+        </member>
+        <member name="M:OtpSharp.Totp.GetKeyUrl(System.String)">
+            <summary>
+            Gets a URL that conforms to the de-facto standard
+            created and used by Google
+            </summary>
+        </member>
+        <member name="P:OtpSharp.Totp.OtpType">
+            <summary>
+            Used in generating URLs.  TOTP
+            </summary>
+        </member>
+        <member name="T:OtpSharp.VerificationWindow">
+            <summary>
+            A verification window
+            </summary>
+        </member>
+        <member name="M:OtpSharp.VerificationWindow.#ctor(System.Int32,System.Int32)">
+            <summary>
+            Create an instance of a verification window
+            </summary>
+            <param name="previous">The number of previous frames to accept</param>
+            <param name="future">The number of future frames to accept</param>
+        </member>
+        <member name="M:OtpSharp.VerificationWindow.ValidationCandidates(System.Int64)">
+            <summary>
+            Gets an enumberable of all the possible validation candidates
+            </summary>
+            <param name="initialFrame">The initial frame to validate</param>
+            <returns>Enumberable of all possible frames that need to be validated</returns>
+        </member>
+        <member name="F:OtpSharp.VerificationWindow.RfcSpecifiedNetworkDelay">
+            <summary>
+            The verification window that accomodates network delay that is recommended in the RFC
+            </summary>
+        </member>
+    </members>
+</doc>

File packages/OtpSharp.1.0.5.0/lib/net40/OtpSharp.dll

Binary file added.

File packages/repositories.config

+<?xml version="1.0" encoding="utf-8"?>
+<repositories>
+  <repository path="../KeeOtp/packages.config" />
+</repositories>