CGC_Codes

TestFrameWork auth MOCK

Mar 13th, 2017
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.99 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Security.Cryptography;
  5. using System.Threading.Tasks;
  6. using D2L.Security.OAuth2.Keys;
  7. using D2L.Security.OAuth2.Keys.Default;
  8. using D2L.Security.OAuth2.Keys.Development;
  9. using D2L.Security.OAuth2.TestFrameworks;
  10. using D2L.Services;
  11. using HttpMock;
  12. using Newtonsoft.Json;
  13.  
  14. namespace D2L.Security.OAuth2.TestFramework {
  15.     public sealed class AuthServiceMock : IDisposable {
  16.         private readonly IHttpServer m_server;
  17.         private readonly string m_host;
  18.  
  19.         private readonly ISanePublicKeyDataProvider m_publicKeyDataProvider;
  20.         private readonly IPrivateKeyProvider m_privateKeyProvider;
  21.         private readonly ITokenSigner m_tokenSigner;
  22.  
  23.         public enum KeyType {
  24.             RSA = 1,
  25.             ECDSA_P256 = 2,
  26.             ECDSA_P384 = 3,
  27.             ECDSA_P521 = 4
  28.         };
  29.  
  30.         public AuthServiceMock( KeyType keyType = KeyType.RSA ) {
  31.             m_server = HttpMockFactory.Create( out m_host );
  32.  
  33. #pragma warning disable 618
  34.             m_publicKeyDataProvider = PublicKeyDataProviderFactory.CreateInternal( new InMemoryPublicKeyDataProvider() );
  35. #pragma warning restore 618
  36.  
  37.             TimeSpan keyLifetime = TimeSpan.FromDays( 365 );
  38.             TimeSpan keyRotationPeriod = TimeSpan.FromDays( 182 );
  39.  
  40.             switch( keyType ) {
  41.                 case KeyType.ECDSA_P256:
  42.                 case KeyType.ECDSA_P384:
  43.                 case KeyType.ECDSA_P521: {
  44.                         CngAlgorithm curve;
  45.                         switch( keyType ) {
  46.                             case KeyType.ECDSA_P521:
  47.                                 curve = CngAlgorithm.ECDsaP521;
  48.                                 break;
  49.                             case KeyType.ECDSA_P384:
  50.                                 curve = CngAlgorithm.ECDsaP384;
  51.                                 break;
  52.                             case KeyType.ECDSA_P256:
  53.                             default:
  54.                                 curve = CngAlgorithm.ECDsaP256;
  55.                                 break;
  56.                         }
  57.  
  58.                         m_privateKeyProvider = EcDsaPrivateKeyProvider
  59.                             .Factory
  60.                             .Create(
  61.                                 m_publicKeyDataProvider,
  62.                                 keyLifetime,
  63.                                 keyRotationPeriod,
  64.                                 curve
  65.                             );
  66.                         break;
  67.                     }
  68.                 case KeyType.RSA:
  69.                 default: {
  70.                         m_privateKeyProvider = RsaPrivateKeyProvider
  71.                             .Factory
  72.                             .Create(
  73.                                 m_publicKeyDataProvider,
  74.                                 keyLifetime,
  75.                                 keyRotationPeriod
  76.                             );
  77.                         break;
  78.                     }
  79.             }
  80.  
  81.             m_tokenSigner = new TokenSigner( m_privateKeyProvider );
  82.         }
  83.  
  84.         public async Task SetupJwks() {
  85.             // Get a private key so public key is saved
  86.             await m_privateKeyProvider.GetSigningCredentialsAsync().SafeAsync();
  87.  
  88.             var keys = await m_publicKeyDataProvider
  89.                 .GetAllAsync()
  90.                 .SafeAsync();
  91.  
  92.             IEnumerable<object> keysDto = keys
  93.                 .Select( k => k.ToJwkDto() );
  94.  
  95.             var jwksDto = new {
  96.                 keys = keysDto
  97.             };
  98.  
  99.             string jwksJson = JsonConvert.SerializeObject( jwksDto );
  100.  
  101.             m_server
  102.                 .Stub( r => r.Get( "/.well-known/jwks" ) )
  103.                 .Return( jwksJson )
  104.                 .OK();
  105.         }
  106.  
  107.         public Uri Host { get { return new Uri( m_host ); } }
  108.  
  109.         public async Task<string> SignTokenBackdoor( UnsignedToken token ) {
  110.             return await m_tokenSigner
  111.                 .SignAsync( token )
  112.                 .SafeAsync();
  113.         }
  114.        
  115.         public void Dispose() {
  116.             m_server.SafeDispose();
  117.         }
  118.     }
  119. }
Advertisement
Add Comment
Please, Sign In to add comment