SecurityAlgorithmSuite.cs 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817
  1. //------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //------------------------------------------------------------
  4. namespace System.ServiceModel.Security
  5. {
  6. using System.Collections.Generic;
  7. using System.ServiceModel.Channels;
  8. using System.ServiceModel;
  9. using System.Collections.ObjectModel;
  10. using System.IdentityModel.Claims;
  11. using System.IdentityModel.Policy;
  12. using System.IdentityModel.Tokens;
  13. using System.IdentityModel.Selectors;
  14. using System.Security.Cryptography;
  15. using System.ServiceModel.Security.Tokens;
  16. using System.Text;
  17. using System.Runtime.Serialization;
  18. using System.Xml;
  19. using System.ComponentModel;
  20. [TypeConverter(typeof(System.ServiceModel.Configuration.SecurityAlgorithmSuiteConverter))]
  21. public abstract class SecurityAlgorithmSuite
  22. {
  23. static SecurityAlgorithmSuite basic256;
  24. static SecurityAlgorithmSuite basic192;
  25. static SecurityAlgorithmSuite basic128;
  26. static SecurityAlgorithmSuite tripleDes;
  27. static SecurityAlgorithmSuite basic256Rsa15;
  28. static SecurityAlgorithmSuite basic192Rsa15;
  29. static SecurityAlgorithmSuite basic128Rsa15;
  30. static SecurityAlgorithmSuite tripleDesRsa15;
  31. static SecurityAlgorithmSuite basic256Sha256;
  32. static SecurityAlgorithmSuite basic192Sha256;
  33. static SecurityAlgorithmSuite basic128Sha256;
  34. static SecurityAlgorithmSuite tripleDesSha256;
  35. static SecurityAlgorithmSuite basic256Sha256Rsa15;
  36. static SecurityAlgorithmSuite basic192Sha256Rsa15;
  37. static SecurityAlgorithmSuite basic128Sha256Rsa15;
  38. static SecurityAlgorithmSuite tripleDesSha256Rsa15;
  39. static internal SecurityAlgorithmSuite KerberosDefault
  40. {
  41. get
  42. {
  43. return Basic128;
  44. }
  45. }
  46. static public SecurityAlgorithmSuite Default
  47. {
  48. get
  49. {
  50. return Basic256;
  51. }
  52. }
  53. static public SecurityAlgorithmSuite Basic256
  54. {
  55. get
  56. {
  57. if (basic256 == null)
  58. basic256 = new Basic256SecurityAlgorithmSuite();
  59. return basic256;
  60. }
  61. }
  62. static public SecurityAlgorithmSuite Basic192
  63. {
  64. get
  65. {
  66. if (basic192 == null)
  67. basic192 = new Basic192SecurityAlgorithmSuite();
  68. return basic192;
  69. }
  70. }
  71. static public SecurityAlgorithmSuite Basic128
  72. {
  73. get
  74. {
  75. if (basic128 == null)
  76. basic128 = new Basic128SecurityAlgorithmSuite();
  77. return basic128;
  78. }
  79. }
  80. static public SecurityAlgorithmSuite TripleDes
  81. {
  82. get
  83. {
  84. if (tripleDes == null)
  85. tripleDes = new TripleDesSecurityAlgorithmSuite();
  86. return tripleDes;
  87. }
  88. }
  89. static public SecurityAlgorithmSuite Basic256Rsa15
  90. {
  91. get
  92. {
  93. if (basic256Rsa15 == null)
  94. basic256Rsa15 = new Basic256Rsa15SecurityAlgorithmSuite();
  95. return basic256Rsa15;
  96. }
  97. }
  98. static public SecurityAlgorithmSuite Basic192Rsa15
  99. {
  100. get
  101. {
  102. if (basic192Rsa15 == null)
  103. basic192Rsa15 = new Basic192Rsa15SecurityAlgorithmSuite();
  104. return basic192Rsa15;
  105. }
  106. }
  107. static public SecurityAlgorithmSuite Basic128Rsa15
  108. {
  109. get
  110. {
  111. if (basic128Rsa15 == null)
  112. basic128Rsa15 = new Basic128Rsa15SecurityAlgorithmSuite();
  113. return basic128Rsa15;
  114. }
  115. }
  116. static public SecurityAlgorithmSuite TripleDesRsa15
  117. {
  118. get
  119. {
  120. if (tripleDesRsa15 == null)
  121. tripleDesRsa15 = new TripleDesRsa15SecurityAlgorithmSuite();
  122. return tripleDesRsa15;
  123. }
  124. }
  125. static public SecurityAlgorithmSuite Basic256Sha256
  126. {
  127. get
  128. {
  129. if (basic256Sha256 == null)
  130. basic256Sha256 = new Basic256Sha256SecurityAlgorithmSuite();
  131. return basic256Sha256;
  132. }
  133. }
  134. static public SecurityAlgorithmSuite Basic192Sha256
  135. {
  136. get
  137. {
  138. if (basic192Sha256 == null)
  139. basic192Sha256 = new Basic192Sha256SecurityAlgorithmSuite();
  140. return basic192Sha256;
  141. }
  142. }
  143. static public SecurityAlgorithmSuite Basic128Sha256
  144. {
  145. get
  146. {
  147. if (basic128Sha256 == null)
  148. basic128Sha256 = new Basic128Sha256SecurityAlgorithmSuite();
  149. return basic128Sha256;
  150. }
  151. }
  152. static public SecurityAlgorithmSuite TripleDesSha256
  153. {
  154. get
  155. {
  156. if (tripleDesSha256 == null)
  157. tripleDesSha256 = new TripleDesSha256SecurityAlgorithmSuite();
  158. return tripleDesSha256;
  159. }
  160. }
  161. static public SecurityAlgorithmSuite Basic256Sha256Rsa15
  162. {
  163. get
  164. {
  165. if (basic256Sha256Rsa15 == null)
  166. basic256Sha256Rsa15 = new Basic256Sha256Rsa15SecurityAlgorithmSuite();
  167. return basic256Sha256Rsa15;
  168. }
  169. }
  170. static public SecurityAlgorithmSuite Basic192Sha256Rsa15
  171. {
  172. get
  173. {
  174. if (basic192Sha256Rsa15 == null)
  175. basic192Sha256Rsa15 = new Basic192Sha256Rsa15SecurityAlgorithmSuite();
  176. return basic192Sha256Rsa15;
  177. }
  178. }
  179. static public SecurityAlgorithmSuite Basic128Sha256Rsa15
  180. {
  181. get
  182. {
  183. if (basic128Sha256Rsa15 == null)
  184. basic128Sha256Rsa15 = new Basic128Sha256Rsa15SecurityAlgorithmSuite();
  185. return basic128Sha256Rsa15;
  186. }
  187. }
  188. static public SecurityAlgorithmSuite TripleDesSha256Rsa15
  189. {
  190. get
  191. {
  192. if (tripleDesSha256Rsa15 == null)
  193. tripleDesSha256Rsa15 = new TripleDesSha256Rsa15SecurityAlgorithmSuite();
  194. return tripleDesSha256Rsa15;
  195. }
  196. }
  197. public abstract string DefaultCanonicalizationAlgorithm { get; }
  198. public abstract string DefaultDigestAlgorithm { get; }
  199. public abstract string DefaultEncryptionAlgorithm { get; }
  200. public abstract int DefaultEncryptionKeyDerivationLength { get; }
  201. public abstract string DefaultSymmetricKeyWrapAlgorithm { get; }
  202. public abstract string DefaultAsymmetricKeyWrapAlgorithm { get; }
  203. public abstract string DefaultSymmetricSignatureAlgorithm { get; }
  204. public abstract string DefaultAsymmetricSignatureAlgorithm { get; }
  205. public abstract int DefaultSignatureKeyDerivationLength { get; }
  206. public abstract int DefaultSymmetricKeyLength { get; }
  207. internal virtual XmlDictionaryString DefaultCanonicalizationAlgorithmDictionaryString { get { return null; } }
  208. internal virtual XmlDictionaryString DefaultDigestAlgorithmDictionaryString { get { return null; } }
  209. internal virtual XmlDictionaryString DefaultEncryptionAlgorithmDictionaryString { get { return null; } }
  210. internal virtual XmlDictionaryString DefaultSymmetricKeyWrapAlgorithmDictionaryString { get { return null; } }
  211. internal virtual XmlDictionaryString DefaultAsymmetricKeyWrapAlgorithmDictionaryString { get { return null; } }
  212. internal virtual XmlDictionaryString DefaultSymmetricSignatureAlgorithmDictionaryString { get { return null; } }
  213. internal virtual XmlDictionaryString DefaultAsymmetricSignatureAlgorithmDictionaryString { get { return null; } }
  214. protected SecurityAlgorithmSuite() { }
  215. public virtual bool IsCanonicalizationAlgorithmSupported(string algorithm) { return algorithm == DefaultCanonicalizationAlgorithm; }
  216. public virtual bool IsDigestAlgorithmSupported(string algorithm) { return algorithm == DefaultDigestAlgorithm; }
  217. public virtual bool IsEncryptionAlgorithmSupported(string algorithm) { return algorithm == DefaultEncryptionAlgorithm; }
  218. public virtual bool IsEncryptionKeyDerivationAlgorithmSupported(string algorithm) { return (algorithm == SecurityAlgorithms.Psha1KeyDerivation) || (algorithm == SecurityAlgorithms.Psha1KeyDerivationDec2005); }
  219. public virtual bool IsSymmetricKeyWrapAlgorithmSupported(string algorithm) { return algorithm == DefaultSymmetricKeyWrapAlgorithm; }
  220. public virtual bool IsAsymmetricKeyWrapAlgorithmSupported(string algorithm) { return algorithm == DefaultAsymmetricKeyWrapAlgorithm; }
  221. public virtual bool IsSymmetricSignatureAlgorithmSupported(string algorithm) { return algorithm == DefaultSymmetricSignatureAlgorithm; }
  222. public virtual bool IsAsymmetricSignatureAlgorithmSupported(string algorithm) { return algorithm == DefaultAsymmetricSignatureAlgorithm; }
  223. public virtual bool IsSignatureKeyDerivationAlgorithmSupported(string algorithm) { return (algorithm == SecurityAlgorithms.Psha1KeyDerivation) || (algorithm == SecurityAlgorithms.Psha1KeyDerivationDec2005); }
  224. public abstract bool IsSymmetricKeyLengthSupported(int length);
  225. public abstract bool IsAsymmetricKeyLengthSupported(int length);
  226. internal static bool IsRsaSHA256(SecurityAlgorithmSuite suite)
  227. {
  228. if ( suite == null )
  229. return false;
  230. return (suite == Basic128Sha256 || suite == Basic128Sha256Rsa15 || suite == Basic192Sha256 || suite == Basic192Sha256Rsa15 ||
  231. suite == Basic256Sha256 || suite == Basic256Sha256Rsa15 || suite == TripleDesSha256 || suite == TripleDesSha256Rsa15);
  232. }
  233. internal string GetEncryptionKeyDerivationAlgorithm(SecurityToken token, SecureConversationVersion version)
  234. {
  235. if (token == null)
  236. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("token");
  237. string derivationAlgorithm = SecurityUtils.GetKeyDerivationAlgorithm(version);
  238. if (SecurityUtils.IsSupportedAlgorithm(derivationAlgorithm, token))
  239. return derivationAlgorithm;
  240. else
  241. return null;
  242. }
  243. internal int GetEncryptionKeyDerivationLength(SecurityToken token, SecureConversationVersion version)
  244. {
  245. if (token == null)
  246. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("token");
  247. string derivationAlgorithm = SecurityUtils.GetKeyDerivationAlgorithm(version);
  248. if (SecurityUtils.IsSupportedAlgorithm(derivationAlgorithm, token))
  249. {
  250. if (this.DefaultEncryptionKeyDerivationLength % 8 != 0)
  251. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentException(SR.GetString(SR.Psha1KeyLengthInvalid, this.DefaultEncryptionKeyDerivationLength)));
  252. return this.DefaultEncryptionKeyDerivationLength / 8;
  253. }
  254. else
  255. return 0;
  256. }
  257. internal void GetKeyWrapAlgorithm(SecurityToken token, out string keyWrapAlgorithm, out XmlDictionaryString keyWrapAlgorithmDictionaryString)
  258. {
  259. if (token == null)
  260. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("token");
  261. if (SecurityUtils.IsSupportedAlgorithm(this.DefaultSymmetricKeyWrapAlgorithm, token))
  262. {
  263. keyWrapAlgorithm = this.DefaultSymmetricKeyWrapAlgorithm;
  264. keyWrapAlgorithmDictionaryString = this.DefaultSymmetricKeyWrapAlgorithmDictionaryString;
  265. }
  266. else
  267. {
  268. keyWrapAlgorithm = this.DefaultAsymmetricKeyWrapAlgorithm;
  269. keyWrapAlgorithmDictionaryString = this.DefaultAsymmetricKeyWrapAlgorithmDictionaryString;
  270. }
  271. }
  272. internal void GetSignatureAlgorithmAndKey(SecurityToken token, out string signatureAlgorithm, out SecurityKey key, out XmlDictionaryString signatureAlgorithmDictionaryString)
  273. {
  274. ReadOnlyCollection<SecurityKey> keys = token.SecurityKeys;
  275. if (keys == null || keys.Count == 0)
  276. {
  277. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.SigningTokenHasNoKeys, token)));
  278. }
  279. for (int i = 0; i < keys.Count; i++)
  280. {
  281. if (keys[i].IsSupportedAlgorithm(this.DefaultSymmetricSignatureAlgorithm))
  282. {
  283. signatureAlgorithm = this.DefaultSymmetricSignatureAlgorithm;
  284. signatureAlgorithmDictionaryString = this.DefaultSymmetricSignatureAlgorithmDictionaryString;
  285. key = keys[i];
  286. return;
  287. }
  288. else if (keys[i].IsSupportedAlgorithm(this.DefaultAsymmetricSignatureAlgorithm))
  289. {
  290. signatureAlgorithm = this.DefaultAsymmetricSignatureAlgorithm;
  291. signatureAlgorithmDictionaryString = this.DefaultAsymmetricSignatureAlgorithmDictionaryString;
  292. key = keys[i];
  293. return;
  294. }
  295. }
  296. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.SigningTokenHasNoKeysSupportingTheAlgorithmSuite, token, this)));
  297. }
  298. internal string GetSignatureKeyDerivationAlgorithm(SecurityToken token, SecureConversationVersion version)
  299. {
  300. if (token == null)
  301. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("token");
  302. string derivationAlgorithm = SecurityUtils.GetKeyDerivationAlgorithm(version);
  303. if (SecurityUtils.IsSupportedAlgorithm(derivationAlgorithm, token))
  304. return derivationAlgorithm;
  305. else
  306. return null;
  307. }
  308. internal int GetSignatureKeyDerivationLength(SecurityToken token, SecureConversationVersion version)
  309. {
  310. if (token == null)
  311. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("token");
  312. string derivationAlgorithm = SecurityUtils.GetKeyDerivationAlgorithm(version);
  313. if (SecurityUtils.IsSupportedAlgorithm(derivationAlgorithm, token))
  314. {
  315. if (this.DefaultSignatureKeyDerivationLength % 8 != 0)
  316. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentException(SR.GetString(SR.Psha1KeyLengthInvalid, this.DefaultSignatureKeyDerivationLength)));
  317. return this.DefaultSignatureKeyDerivationLength / 8;
  318. }
  319. else
  320. return 0;
  321. }
  322. internal void EnsureAcceptableSymmetricSignatureAlgorithm(string algorithm)
  323. {
  324. if (!IsSymmetricSignatureAlgorithmSupported(algorithm))
  325. {
  326. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new MessageSecurityException(SR.GetString(SR.SuiteDoesNotAcceptAlgorithm,
  327. algorithm, "SymmetricSignature", this)));
  328. }
  329. }
  330. internal void EnsureAcceptableSignatureKeySize(SecurityKey securityKey, SecurityToken token)
  331. {
  332. AsymmetricSecurityKey asymmetricSecurityKey = securityKey as AsymmetricSecurityKey;
  333. if (asymmetricSecurityKey != null)
  334. {
  335. if (!IsAsymmetricKeyLengthSupported(asymmetricSecurityKey.KeySize))
  336. {
  337. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new MessageSecurityException(
  338. SR.GetString(SR.TokenDoesNotMeetKeySizeRequirements, this, token, asymmetricSecurityKey.KeySize)));
  339. }
  340. }
  341. else
  342. {
  343. SymmetricSecurityKey symmetricSecurityKey = securityKey as SymmetricSecurityKey;
  344. if (symmetricSecurityKey == null)
  345. {
  346. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.UnknownICryptoType, symmetricSecurityKey)));
  347. }
  348. EnsureAcceptableSignatureSymmetricKeySize(symmetricSecurityKey, token);
  349. }
  350. }
  351. // Ensure acceptable signing symmetric key.
  352. // 1) if derived key, validate derived key against DefaultSignatureKeyDerivationLength and validate
  353. // source key against DefaultSymmetricKeyLength
  354. // 2) if not derived key, validate key against DefaultSymmetricKeyLength
  355. internal void EnsureAcceptableSignatureSymmetricKeySize(SymmetricSecurityKey securityKey, SecurityToken token)
  356. {
  357. int keySize;
  358. DerivedKeySecurityToken dkt = token as DerivedKeySecurityToken;
  359. if (dkt != null)
  360. {
  361. token = dkt.TokenToDerive;
  362. keySize = ((SymmetricSecurityKey)token.SecurityKeys[0]).KeySize;
  363. // doing special case for derived key token signing length since
  364. // the sending side doesn't honor the algorithm suite. It used the DefaultSignatureKeyDerivationLength instead
  365. if (dkt.SecurityKeys[0].KeySize < this.DefaultSignatureKeyDerivationLength)
  366. {
  367. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new MessageSecurityException(
  368. SR.GetString(SR.TokenDoesNotMeetKeySizeRequirements, this, dkt, dkt.SecurityKeys[0].KeySize)));
  369. }
  370. }
  371. else
  372. {
  373. keySize = securityKey.KeySize;
  374. }
  375. if (!IsSymmetricKeyLengthSupported(keySize))
  376. {
  377. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new MessageSecurityException(
  378. SR.GetString(SR.TokenDoesNotMeetKeySizeRequirements, this, token, keySize)));
  379. }
  380. }
  381. // Ensure acceptable decrypting symmetric key.
  382. // 1) if derived key, validate derived key against DefaultEncryptionKeyDerivationLength and validate
  383. // source key against DefaultSymmetricKeyLength
  384. // 2) if not derived key, validate key against DefaultSymmetricKeyLength
  385. internal void EnsureAcceptableDecryptionSymmetricKeySize(SymmetricSecurityKey securityKey, SecurityToken token)
  386. {
  387. int keySize;
  388. DerivedKeySecurityToken dkt = token as DerivedKeySecurityToken;
  389. if (dkt != null)
  390. {
  391. token = dkt.TokenToDerive;
  392. keySize = ((SymmetricSecurityKey)token.SecurityKeys[0]).KeySize;
  393. // doing special case for derived key token signing length since
  394. // the sending side doesn't honor the algorithm suite. It used the DefaultSignatureKeyDerivationLength instead
  395. if (dkt.SecurityKeys[0].KeySize < this.DefaultEncryptionKeyDerivationLength)
  396. {
  397. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new MessageSecurityException(
  398. SR.GetString(SR.TokenDoesNotMeetKeySizeRequirements, this, dkt, dkt.SecurityKeys[0].KeySize)));
  399. }
  400. }
  401. else
  402. {
  403. keySize = securityKey.KeySize;
  404. }
  405. if (!IsSymmetricKeyLengthSupported(keySize))
  406. {
  407. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new MessageSecurityException(
  408. SR.GetString(SR.TokenDoesNotMeetKeySizeRequirements, this, token, keySize)));
  409. }
  410. }
  411. internal void EnsureAcceptableSignatureAlgorithm(SecurityKey verificationKey, string algorithm)
  412. {
  413. InMemorySymmetricSecurityKey symmeticKey = verificationKey as InMemorySymmetricSecurityKey;
  414. if (symmeticKey != null)
  415. {
  416. this.EnsureAcceptableSymmetricSignatureAlgorithm(algorithm);
  417. }
  418. else
  419. {
  420. AsymmetricSecurityKey asymmetricKey = verificationKey as AsymmetricSecurityKey;
  421. if (asymmetricKey == null)
  422. {
  423. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.UnknownICryptoType, verificationKey)));
  424. }
  425. this.EnsureAcceptableAsymmetricSignatureAlgorithm(algorithm);
  426. }
  427. }
  428. internal void EnsureAcceptableAsymmetricSignatureAlgorithm(string algorithm)
  429. {
  430. if (!IsAsymmetricSignatureAlgorithmSupported(algorithm))
  431. {
  432. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new MessageSecurityException(SR.GetString(SR.SuiteDoesNotAcceptAlgorithm,
  433. algorithm, "AsymmetricSignature", this)));
  434. }
  435. }
  436. internal void EnsureAcceptableKeyWrapAlgorithm(string algorithm, bool isAsymmetric)
  437. {
  438. if (isAsymmetric)
  439. {
  440. if (!IsAsymmetricKeyWrapAlgorithmSupported(algorithm))
  441. {
  442. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new MessageSecurityException(SR.GetString(SR.SuiteDoesNotAcceptAlgorithm,
  443. algorithm, "AsymmetricKeyWrap", this)));
  444. }
  445. }
  446. else
  447. {
  448. if (!IsSymmetricKeyWrapAlgorithmSupported(algorithm))
  449. {
  450. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new MessageSecurityException(SR.GetString(SR.SuiteDoesNotAcceptAlgorithm,
  451. algorithm, "SymmetricKeyWrap", this)));
  452. }
  453. }
  454. }
  455. internal void EnsureAcceptableEncryptionAlgorithm(string algorithm)
  456. {
  457. if (!IsEncryptionAlgorithmSupported(algorithm))
  458. {
  459. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new MessageSecurityException(SR.GetString(SR.SuiteDoesNotAcceptAlgorithm,
  460. algorithm, "Encryption", this)));
  461. }
  462. }
  463. internal void EnsureAcceptableSignatureKeyDerivationAlgorithm(string algorithm)
  464. {
  465. if (!IsSignatureKeyDerivationAlgorithmSupported(algorithm))
  466. {
  467. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new MessageSecurityException(SR.GetString(SR.SuiteDoesNotAcceptAlgorithm,
  468. algorithm, "SignatureKeyDerivation", this)));
  469. }
  470. }
  471. internal void EnsureAcceptableEncryptionKeyDerivationAlgorithm(string algorithm)
  472. {
  473. if (!IsEncryptionKeyDerivationAlgorithmSupported(algorithm))
  474. {
  475. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new MessageSecurityException(SR.GetString(SR.SuiteDoesNotAcceptAlgorithm,
  476. algorithm, "EncryptionKeyDerivation", this)));
  477. }
  478. }
  479. internal void EnsureAcceptableDigestAlgorithm(string algorithm)
  480. {
  481. if (!IsDigestAlgorithmSupported(algorithm))
  482. {
  483. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new MessageSecurityException(SR.GetString(SR.SuiteDoesNotAcceptAlgorithm,
  484. algorithm, "Digest", this)));
  485. }
  486. }
  487. }
  488. public class Basic256SecurityAlgorithmSuite : SecurityAlgorithmSuite
  489. {
  490. public Basic256SecurityAlgorithmSuite() : base() { }
  491. public override string DefaultCanonicalizationAlgorithm { get { return DefaultCanonicalizationAlgorithmDictionaryString.Value; } }
  492. public override string DefaultDigestAlgorithm { get { return DefaultDigestAlgorithmDictionaryString.Value; } }
  493. public override string DefaultEncryptionAlgorithm { get { return DefaultEncryptionAlgorithmDictionaryString.Value; } }
  494. public override int DefaultEncryptionKeyDerivationLength { get { return 256; } }
  495. public override string DefaultSymmetricKeyWrapAlgorithm { get { return DefaultSymmetricKeyWrapAlgorithmDictionaryString.Value; } }
  496. public override string DefaultAsymmetricKeyWrapAlgorithm { get { return DefaultAsymmetricKeyWrapAlgorithmDictionaryString.Value; } }
  497. public override string DefaultSymmetricSignatureAlgorithm { get { return DefaultSymmetricSignatureAlgorithmDictionaryString.Value; } }
  498. public override string DefaultAsymmetricSignatureAlgorithm { get { return DefaultAsymmetricSignatureAlgorithmDictionaryString.Value; } }
  499. public override int DefaultSignatureKeyDerivationLength { get { return 192; } }
  500. public override int DefaultSymmetricKeyLength { get { return 256; } }
  501. public override bool IsSymmetricKeyLengthSupported(int length) { return length == 256; }
  502. public override bool IsAsymmetricKeyLengthSupported(int length) { return length >= 1024 && length <= 4096; }
  503. internal override XmlDictionaryString DefaultCanonicalizationAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.ExclusiveC14n; } }
  504. internal override XmlDictionaryString DefaultDigestAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.Sha1Digest; } }
  505. internal override XmlDictionaryString DefaultEncryptionAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.Aes256Encryption; } }
  506. internal override XmlDictionaryString DefaultSymmetricKeyWrapAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.Aes256KeyWrap; } }
  507. internal override XmlDictionaryString DefaultAsymmetricKeyWrapAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.RsaOaepKeyWrap; } }
  508. internal override XmlDictionaryString DefaultSymmetricSignatureAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.HmacSha1Signature; } }
  509. internal override XmlDictionaryString DefaultAsymmetricSignatureAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.RsaSha1Signature; } }
  510. public override string ToString()
  511. {
  512. return "Basic256";
  513. }
  514. }
  515. public class Basic192SecurityAlgorithmSuite : SecurityAlgorithmSuite
  516. {
  517. public Basic192SecurityAlgorithmSuite() : base() { }
  518. public override string DefaultCanonicalizationAlgorithm { get { return DefaultCanonicalizationAlgorithmDictionaryString.Value; } }
  519. public override string DefaultDigestAlgorithm { get { return DefaultDigestAlgorithmDictionaryString.Value; } }
  520. public override string DefaultEncryptionAlgorithm { get { return DefaultEncryptionAlgorithmDictionaryString.Value; } }
  521. public override int DefaultEncryptionKeyDerivationLength { get { return 192; } }
  522. public override string DefaultSymmetricKeyWrapAlgorithm { get { return DefaultSymmetricKeyWrapAlgorithmDictionaryString.Value; } }
  523. public override string DefaultAsymmetricKeyWrapAlgorithm { get { return DefaultAsymmetricKeyWrapAlgorithmDictionaryString.Value; } }
  524. public override string DefaultSymmetricSignatureAlgorithm { get { return DefaultSymmetricSignatureAlgorithmDictionaryString.Value; } }
  525. public override string DefaultAsymmetricSignatureAlgorithm { get { return DefaultAsymmetricSignatureAlgorithmDictionaryString.Value; } }
  526. public override int DefaultSignatureKeyDerivationLength { get { return 192; } }
  527. public override int DefaultSymmetricKeyLength { get { return 192; } }
  528. public override bool IsSymmetricKeyLengthSupported(int length) { return length >= 192 && length <= 256; }
  529. public override bool IsAsymmetricKeyLengthSupported(int length) { return length >= 1024 && length <= 4096; }
  530. internal override XmlDictionaryString DefaultCanonicalizationAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.ExclusiveC14n; } }
  531. internal override XmlDictionaryString DefaultDigestAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.Sha1Digest; } }
  532. internal override XmlDictionaryString DefaultEncryptionAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.Aes192Encryption; } }
  533. internal override XmlDictionaryString DefaultSymmetricKeyWrapAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.Aes192KeyWrap; } }
  534. internal override XmlDictionaryString DefaultAsymmetricKeyWrapAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.RsaOaepKeyWrap; } }
  535. internal override XmlDictionaryString DefaultSymmetricSignatureAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.HmacSha1Signature; } }
  536. internal override XmlDictionaryString DefaultAsymmetricSignatureAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.RsaSha1Signature; } }
  537. public override string ToString()
  538. {
  539. return "Basic192";
  540. }
  541. }
  542. public class Basic128SecurityAlgorithmSuite : SecurityAlgorithmSuite
  543. {
  544. public Basic128SecurityAlgorithmSuite() : base() { }
  545. public override string DefaultCanonicalizationAlgorithm { get { return this.DefaultCanonicalizationAlgorithmDictionaryString.Value; } }
  546. public override string DefaultDigestAlgorithm { get { return this.DefaultDigestAlgorithmDictionaryString.Value; } }
  547. public override string DefaultEncryptionAlgorithm { get { return this.DefaultEncryptionAlgorithmDictionaryString.Value; } }
  548. public override int DefaultEncryptionKeyDerivationLength { get { return 128; } }
  549. public override string DefaultSymmetricKeyWrapAlgorithm { get { return this.DefaultSymmetricKeyWrapAlgorithmDictionaryString.Value; } }
  550. public override string DefaultAsymmetricKeyWrapAlgorithm { get { return this.DefaultAsymmetricKeyWrapAlgorithmDictionaryString.Value; } }
  551. public override string DefaultSymmetricSignatureAlgorithm { get { return this.DefaultSymmetricSignatureAlgorithmDictionaryString.Value; } }
  552. public override string DefaultAsymmetricSignatureAlgorithm { get { return this.DefaultAsymmetricSignatureAlgorithmDictionaryString.Value; } }
  553. public override int DefaultSignatureKeyDerivationLength { get { return 128; } }
  554. public override int DefaultSymmetricKeyLength { get { return 128; } }
  555. public override bool IsSymmetricKeyLengthSupported(int length) { return length >= 128 && length <= 256; }
  556. public override bool IsAsymmetricKeyLengthSupported(int length) { return length >= 1024 && length <= 4096; }
  557. internal override XmlDictionaryString DefaultCanonicalizationAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.ExclusiveC14n; } }
  558. internal override XmlDictionaryString DefaultDigestAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.Sha1Digest; } }
  559. internal override XmlDictionaryString DefaultEncryptionAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.Aes128Encryption; } }
  560. internal override XmlDictionaryString DefaultSymmetricKeyWrapAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.Aes128KeyWrap; } }
  561. internal override XmlDictionaryString DefaultAsymmetricKeyWrapAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.RsaOaepKeyWrap; } }
  562. internal override XmlDictionaryString DefaultSymmetricSignatureAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.HmacSha1Signature; } }
  563. internal override XmlDictionaryString DefaultAsymmetricSignatureAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.RsaSha1Signature; } }
  564. public override string ToString()
  565. {
  566. return "Basic128";
  567. }
  568. }
  569. public class TripleDesSecurityAlgorithmSuite : SecurityAlgorithmSuite
  570. {
  571. public TripleDesSecurityAlgorithmSuite() : base() { }
  572. public override string DefaultCanonicalizationAlgorithm { get { return DefaultCanonicalizationAlgorithmDictionaryString.Value; } }
  573. public override string DefaultDigestAlgorithm { get { return DefaultDigestAlgorithmDictionaryString.Value; } }
  574. public override string DefaultEncryptionAlgorithm { get { return DefaultEncryptionAlgorithmDictionaryString.Value; } }
  575. public override int DefaultEncryptionKeyDerivationLength { get { return 192; } }
  576. public override string DefaultSymmetricKeyWrapAlgorithm { get { return DefaultSymmetricKeyWrapAlgorithmDictionaryString.Value; } }
  577. public override string DefaultAsymmetricKeyWrapAlgorithm { get { return this.DefaultAsymmetricKeyWrapAlgorithmDictionaryString.Value; } }
  578. public override string DefaultSymmetricSignatureAlgorithm { get { return DefaultSymmetricSignatureAlgorithmDictionaryString.Value; } }
  579. public override string DefaultAsymmetricSignatureAlgorithm { get { return DefaultAsymmetricSignatureAlgorithmDictionaryString.Value; } }
  580. public override int DefaultSignatureKeyDerivationLength { get { return 192; } }
  581. public override int DefaultSymmetricKeyLength { get { return 192; } }
  582. public override bool IsSymmetricKeyLengthSupported(int length) { return length >= 192 && length <= 256; }
  583. public override bool IsAsymmetricKeyLengthSupported(int length) { return length >= 1024 && length <= 4096; }
  584. internal override XmlDictionaryString DefaultCanonicalizationAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.ExclusiveC14n; } }
  585. internal override XmlDictionaryString DefaultDigestAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.Sha1Digest; } }
  586. internal override XmlDictionaryString DefaultEncryptionAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.TripleDesEncryption; } }
  587. internal override XmlDictionaryString DefaultSymmetricKeyWrapAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.TripleDesKeyWrap; } }
  588. internal override XmlDictionaryString DefaultAsymmetricKeyWrapAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.RsaOaepKeyWrap; } }
  589. internal override XmlDictionaryString DefaultSymmetricSignatureAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.HmacSha1Signature; } }
  590. internal override XmlDictionaryString DefaultAsymmetricSignatureAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.RsaSha1Signature; } }
  591. public override string ToString()
  592. {
  593. return "TripleDes";
  594. }
  595. }
  596. class Basic128Rsa15SecurityAlgorithmSuite : Basic128SecurityAlgorithmSuite
  597. {
  598. public Basic128Rsa15SecurityAlgorithmSuite() : base() { }
  599. internal override XmlDictionaryString DefaultAsymmetricKeyWrapAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.RsaV15KeyWrap; } }
  600. public override string ToString()
  601. {
  602. return "Basic128Rsa15";
  603. }
  604. }
  605. class Basic192Rsa15SecurityAlgorithmSuite : Basic192SecurityAlgorithmSuite
  606. {
  607. public Basic192Rsa15SecurityAlgorithmSuite() : base() { }
  608. internal override XmlDictionaryString DefaultAsymmetricKeyWrapAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.RsaV15KeyWrap; } }
  609. public override string ToString()
  610. {
  611. return "Basic192Rsa15";
  612. }
  613. }
  614. class Basic256Rsa15SecurityAlgorithmSuite : Basic256SecurityAlgorithmSuite
  615. {
  616. public Basic256Rsa15SecurityAlgorithmSuite() : base() { }
  617. internal override XmlDictionaryString DefaultAsymmetricKeyWrapAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.RsaV15KeyWrap; } }
  618. public override string ToString()
  619. {
  620. return "Basic256Rsa15";
  621. }
  622. }
  623. class TripleDesRsa15SecurityAlgorithmSuite : TripleDesSecurityAlgorithmSuite
  624. {
  625. public TripleDesRsa15SecurityAlgorithmSuite() : base() { }
  626. internal override XmlDictionaryString DefaultAsymmetricKeyWrapAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.RsaV15KeyWrap; } }
  627. public override string ToString()
  628. {
  629. return "TripleDesRsa15";
  630. }
  631. }
  632. class Basic256Sha256SecurityAlgorithmSuite : Basic256SecurityAlgorithmSuite
  633. {
  634. public Basic256Sha256SecurityAlgorithmSuite() : base() { }
  635. internal override XmlDictionaryString DefaultDigestAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.Sha256Digest; } }
  636. internal override XmlDictionaryString DefaultSymmetricSignatureAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.HmacSha256Signature; } }
  637. internal override XmlDictionaryString DefaultAsymmetricSignatureAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.RsaSha256Signature; } }
  638. public override string ToString()
  639. {
  640. return "Basic256Sha256";
  641. }
  642. }
  643. class Basic192Sha256SecurityAlgorithmSuite : Basic192SecurityAlgorithmSuite
  644. {
  645. public Basic192Sha256SecurityAlgorithmSuite() : base() { }
  646. internal override XmlDictionaryString DefaultDigestAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.Sha256Digest; } }
  647. internal override XmlDictionaryString DefaultSymmetricSignatureAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.HmacSha256Signature; } }
  648. internal override XmlDictionaryString DefaultAsymmetricSignatureAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.RsaSha256Signature; } }
  649. public override string ToString()
  650. {
  651. return "Basic192Sha256";
  652. }
  653. }
  654. class Basic128Sha256SecurityAlgorithmSuite : Basic128SecurityAlgorithmSuite
  655. {
  656. public Basic128Sha256SecurityAlgorithmSuite() : base() { }
  657. internal override XmlDictionaryString DefaultDigestAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.Sha256Digest; } }
  658. internal override XmlDictionaryString DefaultSymmetricSignatureAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.HmacSha256Signature; } }
  659. internal override XmlDictionaryString DefaultAsymmetricSignatureAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.RsaSha256Signature; } }
  660. public override string ToString()
  661. {
  662. return "Basic128Sha256";
  663. }
  664. }
  665. class TripleDesSha256SecurityAlgorithmSuite : TripleDesSecurityAlgorithmSuite
  666. {
  667. public TripleDesSha256SecurityAlgorithmSuite() : base() { }
  668. internal override XmlDictionaryString DefaultDigestAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.Sha256Digest; } }
  669. internal override XmlDictionaryString DefaultSymmetricSignatureAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.HmacSha256Signature; } }
  670. internal override XmlDictionaryString DefaultAsymmetricSignatureAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.RsaSha256Signature; } }
  671. public override string ToString()
  672. {
  673. return "TripleDesSha256";
  674. }
  675. }
  676. class Basic256Sha256Rsa15SecurityAlgorithmSuite : Basic256Rsa15SecurityAlgorithmSuite
  677. {
  678. public Basic256Sha256Rsa15SecurityAlgorithmSuite() : base() { }
  679. internal override XmlDictionaryString DefaultDigestAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.Sha256Digest; } }
  680. internal override XmlDictionaryString DefaultSymmetricSignatureAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.HmacSha256Signature; } }
  681. internal override XmlDictionaryString DefaultAsymmetricSignatureAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.RsaSha256Signature; } }
  682. public override string ToString()
  683. {
  684. return "Basic256Sha256Rsa15";
  685. }
  686. }
  687. class Basic192Sha256Rsa15SecurityAlgorithmSuite : Basic192Rsa15SecurityAlgorithmSuite
  688. {
  689. public Basic192Sha256Rsa15SecurityAlgorithmSuite() : base() { }
  690. internal override XmlDictionaryString DefaultDigestAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.Sha256Digest; } }
  691. internal override XmlDictionaryString DefaultSymmetricSignatureAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.HmacSha256Signature; } }
  692. internal override XmlDictionaryString DefaultAsymmetricSignatureAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.RsaSha256Signature; } }
  693. public override string ToString()
  694. {
  695. return "Basic192Sha256Rsa15";
  696. }
  697. }
  698. class Basic128Sha256Rsa15SecurityAlgorithmSuite : Basic128Rsa15SecurityAlgorithmSuite
  699. {
  700. public Basic128Sha256Rsa15SecurityAlgorithmSuite() : base() { }
  701. internal override XmlDictionaryString DefaultDigestAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.Sha256Digest; } }
  702. internal override XmlDictionaryString DefaultSymmetricSignatureAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.HmacSha256Signature; } }
  703. internal override XmlDictionaryString DefaultAsymmetricSignatureAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.RsaSha256Signature; } }
  704. public override string ToString()
  705. {
  706. return "Basic128Sha256Rsa15";
  707. }
  708. }
  709. class TripleDesSha256Rsa15SecurityAlgorithmSuite : TripleDesRsa15SecurityAlgorithmSuite
  710. {
  711. public TripleDesSha256Rsa15SecurityAlgorithmSuite() : base() { }
  712. internal override XmlDictionaryString DefaultDigestAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.Sha256Digest; } }
  713. internal override XmlDictionaryString DefaultSymmetricSignatureAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.HmacSha256Signature; } }
  714. internal override XmlDictionaryString DefaultAsymmetricSignatureAlgorithmDictionaryString { get { return XD.SecurityAlgorithmDictionary.RsaSha256Signature; } }
  715. public override string ToString()
  716. {
  717. return "TripleDesSha256Rsa15";
  718. }
  719. }
  720. }