1 /** 2 * Discrete Logarithm Group 3 * 4 * Copyright: 5 * (C) 1999-2008 Jack Lloyd 6 * (C) 2014-2015 Etienne Cimon 7 * 8 * License: 9 * Botan is released under the Simplified BSD License (see LICENSE.md) 10 */ 11 module botan.pubkey.algo.dl_group; 12 13 import botan.constants; 14 static if (BOTAN_HAS_PUBLIC_KEY_CRYPTO): 15 16 public import botan.pubkey.pubkey; 17 import botan.utils.mem_ops; 18 import botan.math.bigint.bigint; 19 import botan.filters.data_src; 20 import botan.libstate.libstate; 21 import botan.utils.parsing; 22 import botan.math.numbertheory.numthry; 23 import botan.asn1.der_enc; 24 import botan.asn1.ber_dec; 25 import botan.filters.pipe; 26 import botan.codec.pem; 27 import botan.pubkey.workfactor; 28 29 /** 30 * This class represents discrete logarithm groups. It holds a prime p, 31 * a prime q = (p-1)/2 and m_g = x^((p-1)/q) mod p. 32 */ 33 struct DLGroup 34 { 35 public: 36 @disable this(this); 37 38 /** 39 * Get the prime m_p. 40 * Returns: prime m_p 41 */ 42 ref const(BigInt) getP() const 43 { 44 initCheck(); 45 return m_p; 46 } 47 48 /** 49 * Get the prime q. 50 * Returns: prime q 51 */ 52 ref const(BigInt) getQ() const 53 { 54 initCheck(); 55 if (m_q == 0) 56 throw new InvalidState("DLP group has no m_q prime specified"); 57 return m_q; 58 } 59 60 /** 61 * Get the base m_g. 62 * Returns: base m_g 63 */ 64 ref const(BigInt) getG() const 65 { 66 initCheck(); 67 return m_g; 68 } 69 70 alias Format = ubyte; 71 /** 72 * The DL group encoding format variants. 73 */ 74 enum : Format { 75 ANSI_X9_42, 76 ANSI_X9_57, 77 PKCS_3, 78 79 DSA_PARAMETERS = ANSI_X9_57, 80 DH_PARAMETERS = ANSI_X9_42, 81 X942_DH_PARAMETERS = ANSI_X9_42, 82 PKCS3_DH_PARAMETERS = PKCS_3 83 } 84 85 alias PrimeType = ubyte; 86 /** 87 * Determine the prime creation for DL groups. 88 */ 89 enum : PrimeType { Strong, Prime_Subgroup, DSA_Kosherizer } 90 91 /** 92 * Perform validity checks on the group. 93 * 94 * Params: 95 * rng = the rng to use 96 * strong = whether to perform stronger by lengthier tests 97 * Returns: true if the object is consistent, false otherwise 98 */ 99 bool verifyGroup(RandomNumberGenerator rng, bool strong) const 100 { 101 initCheck(); 102 103 if (m_g < 2 || m_p < 3 || m_q < 0) 104 return false; 105 if ((m_q != 0) && ((m_p - 1) % m_q != 0)) 106 return false; 107 108 const size_t prob = (strong) ? 56 : 10; 109 110 if (!isPrime(&m_p, rng, prob)) 111 return false; 112 if ((m_q > 0) && !isPrime(&m_q, rng, prob)) 113 return false; 114 return true; 115 } 116 117 /** 118 * Encode this group into a string using PEM encoding. 119 * 120 * Params: 121 * format = the encoding format 122 * Returns: string holding the PEM encoded group 123 */ 124 string PEM_encode(Format format) const 125 { 126 const Vector!ubyte encoding = DER_encode(format); 127 128 if (format == PKCS_3) 129 return PEM.encode(encoding, "DH PARAMETERS"); 130 else if (format == ANSI_X9_57) 131 return PEM.encode(encoding, "DSA PARAMETERS"); 132 else if (format == ANSI_X9_42) 133 return PEM.encode(encoding, "X942 DH PARAMETERS"); 134 else 135 throw new InvalidArgument("Unknown DLGroup encoding " ~ to!string(format)); 136 } 137 138 /** 139 * Encode this group into a string using DER encoding. 140 * 141 * Params: 142 * format = the encoding format 143 * Returns: string holding the DER encoded group 144 */ 145 Vector!ubyte DER_encode(Format format) const 146 { 147 initCheck(); 148 149 if ((m_q == 0) && (format != PKCS_3)) 150 throw new EncodingError("The ANSI DL parameter formats require a subgroup"); 151 152 if (format == ANSI_X9_57) 153 { 154 return DEREncoder() 155 .startCons(ASN1Tag.SEQUENCE) 156 .encode(m_p) 157 .encode(m_q) 158 .encode(m_g) 159 .endCons() 160 .getContentsUnlocked(); 161 } 162 else if (format == ANSI_X9_42) 163 { 164 return DEREncoder() 165 .startCons(ASN1Tag.SEQUENCE) 166 .encode(m_p) 167 .encode(m_g) 168 .encode(m_q) 169 .endCons() 170 .getContentsUnlocked(); 171 } 172 else if (format == PKCS_3) 173 { 174 return DEREncoder() 175 .startCons(ASN1Tag.SEQUENCE) 176 .encode(m_p) 177 .encode(m_g) 178 .endCons() 179 .getContentsUnlocked(); 180 } 181 182 throw new InvalidArgument("Unknown DLGroup encoding " ~ to!string(format)); 183 } 184 185 /** 186 * Decode a DER/BER encoded group into this instance. 187 * 188 * Params: 189 * data = a vector containing the DER/BER encoded group 190 * format = the format of the encoded group 191 */ 192 void BER_decode()(auto const ref Vector!ubyte data, 193 Format format) 194 { 195 //logTrace("BER_decode ", format); 196 BigInt new_p, new_q, new_g; 197 198 BERDecoder decoder = BERDecoder(data); 199 BERDecoder ber = decoder.startCons(ASN1Tag.SEQUENCE); 200 201 if (format == ANSI_X9_57) 202 { 203 ber.decode(new_p) 204 .decode(new_q) 205 .decode(new_g) 206 .verifyEnd(); 207 } 208 else if (format == ANSI_X9_42) 209 { 210 ber.decode(new_p) 211 .decode(new_g) 212 .decode(new_q) 213 .discardRemaining(); 214 } 215 else if (format == PKCS_3) 216 { 217 ber.decode(new_p) 218 .decode(new_g) 219 .discardRemaining(); 220 } 221 else 222 throw new InvalidArgument("Unknown DLGroup encoding " ~ to!string(format)); 223 224 initialize(new_p, new_q, new_g); 225 } 226 227 /** 228 * Decode a PEM encoded group into this instance. 229 * 230 * Params: 231 * pem = the PEM encoding of the group 232 */ 233 void PEM_decode(in string pem) 234 { 235 string label; 236 auto ber = unlock(PEM.decode(pem, label)); 237 238 if (label == "DH PARAMETERS") 239 BER_decode(ber, PKCS_3); 240 else if (label == "DSA PARAMETERS") 241 BER_decode(ber, ANSI_X9_57); 242 else if (label == "X942 DH PARAMETERS") 243 BER_decode(ber, ANSI_X9_42); 244 else 245 throw new DecodingError("DLGroup: Invalid PEM label " ~ label); 246 } 247 248 /** 249 * Construct a DL group that is registered in the configuration. 250 * 251 * Params: 252 * name = the name that is configured in the global configuration 253 * for the desired group. If no configuration file is specified, 254 * the default values from the file policy.cpp will be used. For instance, 255 * use "modp/ietf/768" as name. 256 */ 257 this(in string name) 258 { 259 string pem = getPemForNamedGroup(name); 260 261 if (!pem) 262 throw new InvalidArgument("DLGroup: Unknown group " ~ name); 263 264 PEM_decode(pem); 265 } 266 267 /** 268 * Create a new group randomly. 269 * 270 * Params: 271 * rng = the random number generator to use 272 * type = specifies how the creation of primes p and q shall 273 * be performed. If $(D type=Strong), then p will be determined as a 274 * safe prime, and q will be chosen as (p-1)/2. If $(D type=Prime_Subgroup) and $(D qbits = 0), 275 * then the size of q will be determined according to the estimated difficulty of the DL 276 * problem. If type=DSA_Kosherizer, DSA primes will be created. 277 * pbits = the number of bits of p 278 * qbits = the number of bits of q. Leave it as 0 to have the value determined according to pbits. 279 */ 280 this(RandomNumberGenerator rng, PrimeType type, size_t pbits, size_t qbits = 0) 281 { 282 if (pbits < 1024) 283 throw new InvalidArgument("DLGroup: prime size " ~ to!string(pbits) ~ " is too small"); 284 285 if (type == Strong) 286 { 287 m_p = randomSafePrime(rng, pbits); 288 m_q = (m_p - 1) / 2; 289 m_g = 2; 290 } 291 else if (type == Prime_Subgroup) 292 { 293 if (!qbits) 294 qbits = 2 * dlWorkFactor(pbits); 295 296 m_q = randomPrime(rng, qbits); 297 BigInt X; 298 while (m_p.bits() != pbits || !isPrime(&m_p, rng)) 299 { 300 X.randomize(rng, pbits); 301 m_p = X - (X % (m_q*2) - 1); 302 } 303 304 m_g = makeDsaGenerator(m_p, m_q); 305 } 306 else if (type == DSA_Kosherizer) 307 { 308 qbits = qbits ? qbits : ((pbits <= 1024) ? 160 : 256); 309 310 generateDsaPrimes(rng, 311 globalState().algorithmFactory(), 312 m_p, m_q, 313 pbits, qbits); 314 315 m_g = makeDsaGenerator(m_p, m_q); 316 } 317 318 m_initialized = true; 319 } 320 321 /** 322 * Create a DSA group with a given seed. 323 * 324 * Params: 325 * rng = the random number generator to use 326 * seed = the seed to use to create the random primes 327 * pbits = the desired bit size of the prime p 328 * qbits = the desired bit size of the prime q. 329 */ 330 this()(RandomNumberGenerator rng, auto const ref Vector!ubyte seed, size_t pbits = 1024, size_t qbits = 0) 331 { 332 if (!generateDsaPrimes(rng, globalState().algorithmFactory(), m_p, m_q, pbits, qbits, seed)) 333 throw new InvalidArgument("DLGroup: The seed given does not " 334 ~ "generate a DSA group"); 335 336 m_g = makeDsaGenerator(m_p, m_q); 337 338 m_initialized = true; 339 } 340 341 /** 342 * Create a DL group. The prime q will be determined according to p. 343 * 344 * Params: 345 * p1 = the prime p 346 * g1 = the base g 347 */ 348 this(ref BigInt p1, ref BigInt g1) 349 { 350 auto bi = BigInt(0); 351 initialize(p1, bi, g1); 352 } 353 354 /** 355 * Create a DL group. 356 * 357 * Params: 358 * p1 = the prime p 359 * q1 = the prime q 360 * g1 = the base g 361 */ 362 this(ref BigInt p1, ref BigInt q1, ref BigInt g1) 363 { 364 initialize(p1, q1, g1); 365 } 366 367 /** 368 * Duplicate this object 369 */ 370 @property DLGroup dup() const { 371 auto p2 = m_p.dup; 372 auto q2 = m_q.dup; 373 auto g2 = m_g.dup; 374 return DLGroup(m_initialized, p2, q2, g2); 375 } 376 377 @property DLGroup move() { 378 return DLGroup(m_initialized, m_p, m_q, m_g); 379 } 380 381 void opAssign(DLGroup other) { 382 m_p = other.m_p.move; 383 m_q = other.m_q.move; 384 m_g = other.m_g.move; 385 m_initialized = other.m_initialized; 386 } 387 388 private: 389 390 this(bool initialized, ref BigInt p1, ref BigInt q1, ref BigInt g1) 391 { 392 if (initialized) { 393 m_p = p1.move; 394 m_q = q1.move; 395 m_g = g1.move; 396 m_initialized = true; 397 } 398 else { 399 initialize(p1, q1, g1); 400 } 401 402 } 403 404 /* 405 * Create generator of the q-sized subgroup (DSA style generator) 406 */ 407 static BigInt makeDsaGenerator(const ref BigInt p, const ref BigInt q) 408 { 409 const BigInt e = (p - 1) / q; 410 411 if (e == 0 || (p - 1) % q > 0) 412 throw new InvalidArgument("makeDsaGenerator q does not divide p-1"); 413 414 foreach (size_t i; 0 .. PRIME_TABLE_SIZE) 415 { 416 auto g_0 = BigInt(PRIMES[i]); 417 BigInt g = powerMod(&g_0, &e, &p); 418 if (g > 1) 419 return g.move; 420 } 421 422 throw new InternalError("DLGroup: Couldn't create a suitable generator"); 423 } 424 425 void initCheck() const 426 { 427 if (!m_initialized) 428 throw new InvalidState("DLP group cannot be used uninitialized"); 429 } 430 431 void initialize(ref BigInt p1, 432 ref BigInt q1, 433 ref BigInt g1) 434 { 435 if (p1 < 3) 436 throw new InvalidArgument("DLGroup: Prime invalid"); 437 if (g1 < 2 || g1 >= p1) 438 throw new InvalidArgument("DLGroup: Generator invalid"); 439 if (q1 < 0 || q1 >= p1) 440 throw new InvalidArgument("DLGroup: Subgroup invalid"); 441 442 m_p = p1.move; 443 m_g = g1.move; 444 m_q = q1.move; 445 446 m_initialized = true; 447 } 448 449 bool m_initialized; 450 BigInt m_p, m_q, m_g; 451 452 public string toString() const { 453 return toVector()[].idup; 454 } 455 456 public Vector!char toVector() const { 457 Vector!char ret; 458 ret ~= "p: "; 459 ret ~= m_p.toVector()[]; 460 ret ~= "\n"; 461 ret ~= "q: "; 462 ret ~= m_q.toVector()[]; 463 ret ~= "\n"; 464 ret ~= "g: "; 465 ret ~= m_g.toVector()[]; 466 ret ~= "\n"; 467 return ret.move; 468 } 469 470 /** 471 * Return PEM representation of named DL group 472 */ 473 public static string getPemForNamedGroup(in string name) 474 { 475 if (name == "modp/ietf/1024") 476 return 477 "-----BEGIN X942 DH PARAMETERS-----" 478 ~ "MIIBCgKBgQD//////////8kP2qIhaMI0xMZii4DcHNEpAk4IimfMdAILvqY7E5si" 479 ~ "UUoIeY40BN3vlRmzzTpDGzArCm3yXxQ3T+E1bW1RwkXkhbV2Yl5+xvRMQummN+1r" 480 ~ "C/9ctvQGt+3uOGv7Womfpa6fJBF8Sx/mSShmUezmU4H//////////wIBAgKBgH//" 481 ~ "////////5IftURC0YRpiYzFFwG4OaJSBJwRFM+Y6AQXfUx2JzZEopQQ8xxoCbvfK" 482 ~ "jNnmnSGNmBWFNvkvihun8Jq2tqjhIvJC2rsxLz9jeiYhdNMb9rWF/65begNb9vcc" 483 ~ "Nf2tRM/S10+SCL4lj/MklDMo9nMpwP//////////" 484 ~ "-----END X942 DH PARAMETERS-----"; 485 486 if (name == "modp/srp/1024") 487 return 488 "-----BEGIN X942 DH PARAMETERS-----" 489 ~ "MIIBCgKBgQDurwq5rbON1pwz+Ar6j8XoYHJhh3X/PAueojFMnCVldtZ033SW6oHT" 490 ~ "ODtIE9aSxuDg1djiULmL5I5JXB1gidrRXcfXtGFU1rbOjvStabFdSYJVmyl7zxiF" 491 ~ "xSn1ZmYOV+xo7bw8BXJswC/Uy/SXbqqa/VE4/oN2Q1ufxh0vwOsG4wIBAgKBgHdX" 492 ~ "hVzW2cbrThn8BX1H4vQwOTDDuv+eBc9RGKZOErK7azpvukt1QOmcHaQJ60ljcHBq" 493 ~ "7HEoXMXyRySuDrBE7Wiu4+vaMKprW2dHela02K6kwSrNlL3njELilPqzMwcr9jR2" 494 ~ "3h4CuTZgF+pl+ku3VU1+qJx/Qbshrc/jDpfgdYNx" 495 ~ "-----END X942 DH PARAMETERS-----"; 496 497 if (name == "modp/ietf/1536") 498 return 499 "-----BEGIN X942 DH PARAMETERS-----" 500 ~ "MIIBigKBwQD//////////8kP2qIhaMI0xMZii4DcHNEpAk4IimfMdAILvqY7E5si" 501 ~ "UUoIeY40BN3vlRmzzTpDGzArCm3yXxQ3T+E1bW1RwkXkhbV2Yl5+xvRMQummN+1r" 502 ~ "C/9ctvQGt+3uOGv7Womfpa6fJBF8Sx/mSShmUezkWz3CAHy4oWO/BZjaSDYcVdOa" 503 ~ "aRY/qP0kz1+DZV0j3KOtlhxi81YghVK7ntUpB3CWlm1nDDVOSryYBPF0bAjKI3Mn" 504 ~ "//////////8CAQICgcB//////////+SH7VEQtGEaYmMxRcBuDmiUgScERTPmOgEF" 505 ~ "31Mdic2RKKUEPMcaAm73yozZ5p0hjZgVhTb5L4obp/Catrao4SLyQtq7MS8/Y3om" 506 ~ "IXTTG/a1hf+uW3oDW/b3HDX9rUTP0tdPkgi+JY/zJJQzKPZyLZ7hAD5cULHfgsxt" 507 ~ "JBsOKunNNIsf1H6SZ6/Bsq6R7lHWyw4xeasQQqldz2qUg7hLSzazhhqnJV5MAni6" 508 ~ "NgRlEbmT//////////8=" 509 ~ "-----END X942 DH PARAMETERS-----"; 510 511 if (name == "modp/srp/1536") 512 return 513 "-----BEGIN DH PARAMETERS-----" 514 ~ "MIHHAoHBAJ3vPK+5OSd6sfEqhheke7vbpR30maxMgL7uqWFLGcxNX09fVW4ny95R" 515 ~ "xqlL5GB6KRVYkDug0PhDgLZVu5oi6NzfAop87Gfw0IE0sci5eYkUm2CeC+O6tj1H" 516 ~ "VIOB28Wx/HZOP0tT3Z2hFYv9PiucjPVu3wGVOTSWJ9sv1T0kt8SGZXcuQ31sf4zk" 517 ~ "QnNK98y3roN8Jkrjqb64f4ov6bi1KS5aAh//XpFHnoznoowkQsbzFRgPk0maI03P" 518 ~ "duP+0TX5uwIBAg==" 519 ~ "-----END DH PARAMETERS-----"; 520 521 if (name == "modp/ietf/2048") 522 return 523 "-----BEGIN X942 DH PARAMETERS-----" 524 ~ "MIICDAKCAQEA///////////JD9qiIWjCNMTGYouA3BzRKQJOCIpnzHQCC76mOxOb" 525 ~ "IlFKCHmONATd75UZs806QxswKwpt8l8UN0/hNW1tUcJF5IW1dmJefsb0TELppjft" 526 ~ "awv/XLb0Brft7jhr+1qJn6WunyQRfEsf5kkoZlHs5Fs9wgB8uKFjvwWY2kg2HFXT" 527 ~ "mmkWP6j9JM9fg2VdI9yjrZYcYvNWIIVSu57VKQdwlpZtZww1Tkq8mATxdGwIyhgh" 528 ~ "fDKQXkYuNs474553LBgOhgObJ4Oi7Aeij7XFXfBvTFLJ3ivL9pVYFxg5lUl86pVq" 529 ~ "5RXSJhiY+gUQFXKOWoqsqmj//////////wIBAgKCAQB//////////+SH7VEQtGEa" 530 ~ "YmMxRcBuDmiUgScERTPmOgEF31Mdic2RKKUEPMcaAm73yozZ5p0hjZgVhTb5L4ob" 531 ~ "p/Catrao4SLyQtq7MS8/Y3omIXTTG/a1hf+uW3oDW/b3HDX9rUTP0tdPkgi+JY/z" 532 ~ "JJQzKPZyLZ7hAD5cULHfgsxtJBsOKunNNIsf1H6SZ6/Bsq6R7lHWyw4xeasQQqld" 533 ~ "z2qUg7hLSzazhhqnJV5MAni6NgRlDBC+GUgvIxcbZx3xzzuWDAdDAc2TwdF2A9FH" 534 ~ "2uKu+DemKWTvFeX7SqwLjBzKpL51SrVyiukTDEx9AogKuUctRVZVNH//////////" 535 ~ "-----END X942 DH PARAMETERS-----"; 536 537 if (name == "modp/srp/2048") 538 return 539 "-----BEGIN X942 DH PARAMETERS-----" 540 ~ "MIICDAKCAQEArGvbQTJKmpvxZt5eE4lYL69ytmUZh+4H/DGSlD21YFCjcynLtKCZ" 541 ~ "7YGT4HV3Z6E91SMSq0sDMQ3Nf0ip2gT9UOgIOWntt2ewz2CVF5oWOrNmGgX71fqq" 542 ~ "6CkYqZYvC5O4Vfl5k+yXXuqoDXQK2/T/dHNZ0EHVwz6nHSgeRGsUdzvKl7Q6I/uA" 543 ~ "Fna9IHpDbGSB8dK5B4cXRhpbnTLmiPh3SFRFI7UksNV9Xqd6J3XS7PoDLPvb9S+z" 544 ~ "eGFgJ5AE5Xrmr4dOcwPOUymczAQce8MI2CpWmPOo0MOCca41+Onb+7aUtcgD2J96" 545 ~ "5DXeI21SX1R1m2XjcvzWjvIPpxEfnkr/cwIBAgKCAQBWNe2gmSVNTfizby8JxKwX" 546 ~ "17lbMozD9wP+GMlKHtqwKFG5lOXaUEz2wMnwOruz0J7qkYlVpYGYhua/pFTtAn6o" 547 ~ "dAQctPbbs9hnsEqLzQsdWbMNAv3q/VV0FIxUyxeFydwq/LzJ9kuvdVQGugVt+n+6" 548 ~ "OazoIOrhn1OOlA8iNYo7neVL2h0R/cALO16QPSG2MkD46VyDw4ujDS3OmXNEfDuk" 549 ~ "KiKR2pJYar6vU70Tuul2fQGWfe36l9m8MLATyAJyvXNXw6c5gecplM5mAg494YRs" 550 ~ "FStMedRoYcE41xr8dO3920pa5AHsT71yGu8RtqkvqjrNsvG5fmtHeQfTiI/PJX+5" 551 ~ "-----END X942 DH PARAMETERS-----"; 552 553 if (name == "modp/ietf/3072") 554 return 555 "-----BEGIN X942 DH PARAMETERS-----" 556 ~ "MIIDDAKCAYEA///////////JD9qiIWjCNMTGYouA3BzRKQJOCIpnzHQCC76mOxOb" 557 ~ "IlFKCHmONATd75UZs806QxswKwpt8l8UN0/hNW1tUcJF5IW1dmJefsb0TELppjft" 558 ~ "awv/XLb0Brft7jhr+1qJn6WunyQRfEsf5kkoZlHs5Fs9wgB8uKFjvwWY2kg2HFXT" 559 ~ "mmkWP6j9JM9fg2VdI9yjrZYcYvNWIIVSu57VKQdwlpZtZww1Tkq8mATxdGwIyhgh" 560 ~ "fDKQXkYuNs474553LBgOhgObJ4Oi7Aeij7XFXfBvTFLJ3ivL9pVYFxg5lUl86pVq" 561 ~ "5RXSJhiY+gUQFXKOWoqqxC2tMxcNBFB6M6hVIavfHLpk7PuFBFjb7wqK6nFXXQYM" 562 ~ "fbOXD4Wm4eTHq/WujNsJM9cejJTgSiVhnc7j0iYa0u5r8S/6BtmKCGTYdgJzPshq" 563 ~ "ZFIfKxgXeyAMu+EXV3phXWx3CYjAutlG4gjiT6B05asxQ9tb/OD9EI5LgtEgqTrS" 564 ~ "yv//////////AgECAoIBgH//////////5IftURC0YRpiYzFFwG4OaJSBJwRFM+Y6" 565 ~ "AQXfUx2JzZEopQQ8xxoCbvfKjNnmnSGNmBWFNvkvihun8Jq2tqjhIvJC2rsxLz9j" 566 ~ "eiYhdNMb9rWF/65begNb9vccNf2tRM/S10+SCL4lj/MklDMo9nItnuEAPlxQsd+C" 567 ~ "zG0kGw4q6c00ix/UfpJnr8GyrpHuUdbLDjF5qxBCqV3PapSDuEtLNrOGGqclXkwC" 568 ~ "eLo2BGUMEL4ZSC8jFxtnHfHPO5YMB0MBzZPB0XYD0Ufa4q74N6YpZO8V5ftKrAuM" 569 ~ "HMqkvnVKtXKK6RMMTH0CiAq5Ry1FVWIW1pmLhoIoPRnUKpDV745dMnZ9woIsbfeF" 570 ~ "RXU4q66DBj7Zy4fC03DyY9X610ZthJnrj0ZKcCUSsM7ncekTDWl3NfiX/QNsxQQy" 571 ~ "bDsBOZ9kNTIpD5WMC72QBl3wi6u9MK62O4TEYF1so3EEcSfQOnLVmKHtrf5wfohH" 572 ~ "JcFokFSdaWV//////////w==" 573 ~ "-----END X942 DH PARAMETERS-----"; 574 575 if (name == "modp/srp/3072") 576 return 577 "-----BEGIN DH PARAMETERS-----" 578 ~ "MIIBiAKCAYEA///////////JD9qiIWjCNMTGYouA3BzRKQJOCIpnzHQCC76mOxOb" 579 ~ "IlFKCHmONATd75UZs806QxswKwpt8l8UN0/hNW1tUcJF5IW1dmJefsb0TELppjft" 580 ~ "awv/XLb0Brft7jhr+1qJn6WunyQRfEsf5kkoZlHs5Fs9wgB8uKFjvwWY2kg2HFXT" 581 ~ "mmkWP6j9JM9fg2VdI9yjrZYcYvNWIIVSu57VKQdwlpZtZww1Tkq8mATxdGwIyhgh" 582 ~ "fDKQXkYuNs474553LBgOhgObJ4Oi7Aeij7XFXfBvTFLJ3ivL9pVYFxg5lUl86pVq" 583 ~ "5RXSJhiY+gUQFXKOWoqqxC2tMxcNBFB6M6hVIavfHLpk7PuFBFjb7wqK6nFXXQYM" 584 ~ "fbOXD4Wm4eTHq/WujNsJM9cejJTgSiVhnc7j0iYa0u5r8S/6BtmKCGTYdgJzPshq" 585 ~ "ZFIfKxgXeyAMu+EXV3phXWx3CYjAutlG4gjiT6B05asxQ9tb/OD9EI5LgtEgqTrS" 586 ~ "yv//////////AgEF" 587 ~ "-----END DH PARAMETERS-----"; 588 589 if (name == "modp/ietf/4096") 590 return 591 "-----BEGIN X942 DH PARAMETERS-----" 592 ~ "MIIEDAKCAgEA///////////JD9qiIWjCNMTGYouA3BzRKQJOCIpnzHQCC76mOxOb" 593 ~ "IlFKCHmONATd75UZs806QxswKwpt8l8UN0/hNW1tUcJF5IW1dmJefsb0TELppjft" 594 ~ "awv/XLb0Brft7jhr+1qJn6WunyQRfEsf5kkoZlHs5Fs9wgB8uKFjvwWY2kg2HFXT" 595 ~ "mmkWP6j9JM9fg2VdI9yjrZYcYvNWIIVSu57VKQdwlpZtZww1Tkq8mATxdGwIyhgh" 596 ~ "fDKQXkYuNs474553LBgOhgObJ4Oi7Aeij7XFXfBvTFLJ3ivL9pVYFxg5lUl86pVq" 597 ~ "5RXSJhiY+gUQFXKOWoqqxC2tMxcNBFB6M6hVIavfHLpk7PuFBFjb7wqK6nFXXQYM" 598 ~ "fbOXD4Wm4eTHq/WujNsJM9cejJTgSiVhnc7j0iYa0u5r8S/6BtmKCGTYdgJzPshq" 599 ~ "ZFIfKxgXeyAMu+EXV3phXWx3CYjAutlG4gjiT6B05asxQ9tb/OD9EI5LgtEgqSEI" 600 ~ "ARpyPBKnh+bXiHGaEL26WyaZwycYavTiPBqUaDS2FQvaJYPpyirUTOjbu8LbBN6O" 601 ~ "+S6O/BQfvsqmKHxZR05rwF2ZspZPoJDDoiM7oYZRW+ftH2EpcM7i16+4G912IXBI" 602 ~ "HNAGkSfVsFqpk7TqmI2P3cGG/7fckKbAj030Nck0BjGZ//////////8CAQICggIA" 603 ~ "f//////////kh+1RELRhGmJjMUXAbg5olIEnBEUz5joBBd9THYnNkSilBDzHGgJu" 604 ~ "98qM2eadIY2YFYU2+S+KG6fwmra2qOEi8kLauzEvP2N6JiF00xv2tYX/rlt6A1v2" 605 ~ "9xw1/a1Ez9LXT5IIviWP8ySUMyj2ci2e4QA+XFCx34LMbSQbDirpzTSLH9R+kmev" 606 ~ "wbKuke5R1ssOMXmrEEKpXc9qlIO4S0s2s4YapyVeTAJ4ujYEZQwQvhlILyMXG2cd" 607 ~ "8c87lgwHQwHNk8HRdgPRR9rirvg3pilk7xXl+0qsC4wcyqS+dUq1corpEwxMfQKI" 608 ~ "CrlHLUVVYhbWmYuGgig9GdQqkNXvjl0ydn3Cgixt94VFdTirroMGPtnLh8LTcPJj" 609 ~ "1frXRm2EmeuPRkpwJRKwzudx6RMNaXc1+Jf9A2zFBDJsOwE5n2Q1MikPlYwLvZAG" 610 ~ "XfCLq70wrrY7hMRgXWyjcQRxJ9A6ctWYoe2t/nB+iEclwWiQVJCEAI05HglTw/Nr" 611 ~ "xDjNCF7dLZNM4ZOMNXpxHg1KNBpbCoXtEsH05RVqJnRt3eFtgm9HfJdHfgoP32VT" 612 ~ "FD4so6c14C7M2Usn0Ehh0RGd0MMorfP2j7CUuGdxa9fcDe67ELgkDmgDSJPq2C1U" 613 ~ "ydp1TEbH7uDDf9vuSFNgR6b6GuSaAxjM//////////8=" 614 ~ "-----END X942 DH PARAMETERS-----"; 615 616 if (name == "modp/srp/4096") 617 return 618 "-----BEGIN DH PARAMETERS-----" 619 ~ "MIICCAKCAgEA///////////JD9qiIWjCNMTGYouA3BzRKQJOCIpnzHQCC76mOxOb" 620 ~ "IlFKCHmONATd75UZs806QxswKwpt8l8UN0/hNW1tUcJF5IW1dmJefsb0TELppjft" 621 ~ "awv/XLb0Brft7jhr+1qJn6WunyQRfEsf5kkoZlHs5Fs9wgB8uKFjvwWY2kg2HFXT" 622 ~ "mmkWP6j9JM9fg2VdI9yjrZYcYvNWIIVSu57VKQdwlpZtZww1Tkq8mATxdGwIyhgh" 623 ~ "fDKQXkYuNs474553LBgOhgObJ4Oi7Aeij7XFXfBvTFLJ3ivL9pVYFxg5lUl86pVq" 624 ~ "5RXSJhiY+gUQFXKOWoqqxC2tMxcNBFB6M6hVIavfHLpk7PuFBFjb7wqK6nFXXQYM" 625 ~ "fbOXD4Wm4eTHq/WujNsJM9cejJTgSiVhnc7j0iYa0u5r8S/6BtmKCGTYdgJzPshq" 626 ~ "ZFIfKxgXeyAMu+EXV3phXWx3CYjAutlG4gjiT6B05asxQ9tb/OD9EI5LgtEgqSEI" 627 ~ "ARpyPBKnh+bXiHGaEL26WyaZwycYavTiPBqUaDS2FQvaJYPpyirUTOjbu8LbBN6O" 628 ~ "+S6O/BQfvsqmKHxZR05rwF2ZspZPoJDDoiM7oYZRW+ftH2EpcM7i16+4G912IXBI" 629 ~ "HNAGkSfVsFqpk7TqmI2P3cGG/7fckKbAj030Nck0BjGZ//////////8CAQU=" 630 ~ "-----END DH PARAMETERS-----"; 631 632 if (name == "modp/ietf/6144") 633 return 634 "-----BEGIN X942 DH PARAMETERS-----" 635 ~ "MIIGDAKCAwEA///////////JD9qiIWjCNMTGYouA3BzRKQJOCIpnzHQCC76mOxOb" 636 ~ "IlFKCHmONATd75UZs806QxswKwpt8l8UN0/hNW1tUcJF5IW1dmJefsb0TELppjft" 637 ~ "awv/XLb0Brft7jhr+1qJn6WunyQRfEsf5kkoZlHs5Fs9wgB8uKFjvwWY2kg2HFXT" 638 ~ "mmkWP6j9JM9fg2VdI9yjrZYcYvNWIIVSu57VKQdwlpZtZww1Tkq8mATxdGwIyhgh" 639 ~ "fDKQXkYuNs474553LBgOhgObJ4Oi7Aeij7XFXfBvTFLJ3ivL9pVYFxg5lUl86pVq" 640 ~ "5RXSJhiY+gUQFXKOWoqqxC2tMxcNBFB6M6hVIavfHLpk7PuFBFjb7wqK6nFXXQYM" 641 ~ "fbOXD4Wm4eTHq/WujNsJM9cejJTgSiVhnc7j0iYa0u5r8S/6BtmKCGTYdgJzPshq" 642 ~ "ZFIfKxgXeyAMu+EXV3phXWx3CYjAutlG4gjiT6B05asxQ9tb/OD9EI5LgtEgqSEI" 643 ~ "ARpyPBKnh+bXiHGaEL26WyaZwycYavTiPBqUaDS2FQvaJYPpyirUTOjbu8LbBN6O" 644 ~ "+S6O/BQfvsqmKHxZR05rwF2ZspZPoJDDoiM7oYZRW+ftH2EpcM7i16+4G912IXBI" 645 ~ "HNAGkSfVsFqpk7TqmI2P3cGG/7fckKbAj030Nck0AoSSNsP6tNJ8cCbB1NyyYCZG" 646 ~ "3sl1HnY9uje9+P+UBq2eUw7l2zgvQTABrrBqU+2QJ9gxF5cnsIZaiRjaPtvrz5sU" 647 ~ "7UTObLrO1Lsb238UR+bMJUszIFFRK9evQm+49AE3jNK/WYPKAcZLkuzwMuoV0XId" 648 ~ "A/SC185udP721V5wL0aYDIK1qEAxkAscnlnnyX++x+jzI6l6fjbMiL4PHUW3/1ha" 649 ~ "xUvUB7IrQVSqzI9tfr9I4dgUzF7SD4A34KeXFe7ym+MoBqHVi7fF2nb1UKo9ih+/" 650 ~ "8OsZzLGjE9Vc2lbJ7C7yljI4f+jXbjwEaAQ+j2Y/SGDuEr8tWwt0dNbmlPkebcxA" 651 ~ "JP//////////AoIDAH//////////5IftURC0YRpiYzFFwG4OaJSBJwRFM+Y6AQXf" 652 ~ "Ux2JzZEopQQ8xxoCbvfKjNnmnSGNmBWFNvkvihun8Jq2tqjhIvJC2rsxLz9jeiYh" 653 ~ "dNMb9rWF/65begNb9vccNf2tRM/S10+SCL4lj/MklDMo9nItnuEAPlxQsd+CzG0k" 654 ~ "Gw4q6c00ix/UfpJnr8GyrpHuUdbLDjF5qxBCqV3PapSDuEtLNrOGGqclXkwCeLo2" 655 ~ "BGUMEL4ZSC8jFxtnHfHPO5YMB0MBzZPB0XYD0Ufa4q74N6YpZO8V5ftKrAuMHMqk" 656 ~ "vnVKtXKK6RMMTH0CiAq5Ry1FVWIW1pmLhoIoPRnUKpDV745dMnZ9woIsbfeFRXU4" 657 ~ "q66DBj7Zy4fC03DyY9X610ZthJnrj0ZKcCUSsM7ncekTDWl3NfiX/QNsxQQybDsB" 658 ~ "OZ9kNTIpD5WMC72QBl3wi6u9MK62O4TEYF1so3EEcSfQOnLVmKHtrf5wfohHJcFo" 659 ~ "kFSQhACNOR4JU8Pza8Q4zQhe3S2TTOGTjDV6cR4NSjQaWwqF7RLB9OUVaiZ0bd3h" 660 ~ "bYJvR3yXR34KD99lUxQ+LKOnNeAuzNlLJ9BIYdERndDDKK3z9o+wlLhncWvX3A3u" 661 ~ "uxC4JA5oA0iT6tgtVMnadUxGx+7gw3/b7khTYEem+hrkmgFCSRth/VppPjgTYOpu" 662 ~ "WTATI29kuo87Ht0b3vx/ygNWzymHcu2cF6CYANdYNSn2yBPsGIvLk9hDLUSMbR9t" 663 ~ "9efNinaiZzZdZ2pdje2/iiPzZhKlmZAoqJXr16E33HoAm8ZpX6zB5QDjJcl2eBl1" 664 ~ "Cui5DoH6QWvnNzp/e2qvOBejTAZBWtQgGMgFjk8s8+S/32P0eZHUvT8bZkRfB46i" 665 ~ "2/+sLWKl6gPZFaCqVWZHtr9fpHDsCmYvaQfAG/BTy4r3eU3xlANQ6sXb4u07eqhV" 666 ~ "HsUP3/h1jOZY0Ynqrm0rZPYXeUsZHD/0a7ceAjQCH0ezH6Qwdwlflq2Fujprc0p8" 667 ~ "jzbmIBJ//////////wIBAg==" 668 ~ "-----END X942 DH PARAMETERS-----"; 669 670 if (name == "modp/srp/6144") 671 return 672 "-----BEGIN DH PARAMETERS-----" 673 ~ "MIIDCAKCAwEA///////////JD9qiIWjCNMTGYouA3BzRKQJOCIpnzHQCC76mOxOb" 674 ~ "IlFKCHmONATd75UZs806QxswKwpt8l8UN0/hNW1tUcJF5IW1dmJefsb0TELppjft" 675 ~ "awv/XLb0Brft7jhr+1qJn6WunyQRfEsf5kkoZlHs5Fs9wgB8uKFjvwWY2kg2HFXT" 676 ~ "mmkWP6j9JM9fg2VdI9yjrZYcYvNWIIVSu57VKQdwlpZtZww1Tkq8mATxdGwIyhgh" 677 ~ "fDKQXkYuNs474553LBgOhgObJ4Oi7Aeij7XFXfBvTFLJ3ivL9pVYFxg5lUl86pVq" 678 ~ "5RXSJhiY+gUQFXKOWoqqxC2tMxcNBFB6M6hVIavfHLpk7PuFBFjb7wqK6nFXXQYM" 679 ~ "fbOXD4Wm4eTHq/WujNsJM9cejJTgSiVhnc7j0iYa0u5r8S/6BtmKCGTYdgJzPshq" 680 ~ "ZFIfKxgXeyAMu+EXV3phXWx3CYjAutlG4gjiT6B05asxQ9tb/OD9EI5LgtEgqSEI" 681 ~ "ARpyPBKnh+bXiHGaEL26WyaZwycYavTiPBqUaDS2FQvaJYPpyirUTOjbu8LbBN6O" 682 ~ "+S6O/BQfvsqmKHxZR05rwF2ZspZPoJDDoiM7oYZRW+ftH2EpcM7i16+4G912IXBI" 683 ~ "HNAGkSfVsFqpk7TqmI2P3cGG/7fckKbAj030Nck0AoSSNsP6tNJ8cCbB1NyyYCZG" 684 ~ "3sl1HnY9uje9+P+UBq2eUw7l2zgvQTABrrBqU+2QJ9gxF5cnsIZaiRjaPtvrz5sU" 685 ~ "7UTObLrO1Lsb238UR+bMJUszIFFRK9evQm+49AE3jNK/WYPKAcZLkuzwMuoV0XId" 686 ~ "A/SC185udP721V5wL0aYDIK1qEAxkAscnlnnyX++x+jzI6l6fjbMiL4PHUW3/1ha" 687 ~ "xUvUB7IrQVSqzI9tfr9I4dgUzF7SD4A34KeXFe7ym+MoBqHVi7fF2nb1UKo9ih+/" 688 ~ "8OsZzLGjE9Vc2lbJ7C7yljI4f+jXbjwEaAQ+j2Y/SGDuEr8tWwt0dNbmlPkebcxA" 689 ~ "JP//////////AgEF" 690 ~ "-----END DH PARAMETERS-----"; 691 692 if (name == "modp/ietf/8192") 693 return 694 "-----BEGIN X942 DH PARAMETERS-----" 695 ~ "MIIIDAKCBAEA///////////JD9qiIWjCNMTGYouA3BzRKQJOCIpnzHQCC76mOxOb" 696 ~ "IlFKCHmONATd75UZs806QxswKwpt8l8UN0/hNW1tUcJF5IW1dmJefsb0TELppjft" 697 ~ "awv/XLb0Brft7jhr+1qJn6WunyQRfEsf5kkoZlHs5Fs9wgB8uKFjvwWY2kg2HFXT" 698 ~ "mmkWP6j9JM9fg2VdI9yjrZYcYvNWIIVSu57VKQdwlpZtZww1Tkq8mATxdGwIyhgh" 699 ~ "fDKQXkYuNs474553LBgOhgObJ4Oi7Aeij7XFXfBvTFLJ3ivL9pVYFxg5lUl86pVq" 700 ~ "5RXSJhiY+gUQFXKOWoqqxC2tMxcNBFB6M6hVIavfHLpk7PuFBFjb7wqK6nFXXQYM" 701 ~ "fbOXD4Wm4eTHq/WujNsJM9cejJTgSiVhnc7j0iYa0u5r8S/6BtmKCGTYdgJzPshq" 702 ~ "ZFIfKxgXeyAMu+EXV3phXWx3CYjAutlG4gjiT6B05asxQ9tb/OD9EI5LgtEgqSEI" 703 ~ "ARpyPBKnh+bXiHGaEL26WyaZwycYavTiPBqUaDS2FQvaJYPpyirUTOjbu8LbBN6O" 704 ~ "+S6O/BQfvsqmKHxZR05rwF2ZspZPoJDDoiM7oYZRW+ftH2EpcM7i16+4G912IXBI" 705 ~ "HNAGkSfVsFqpk7TqmI2P3cGG/7fckKbAj030Nck0AoSSNsP6tNJ8cCbB1NyyYCZG" 706 ~ "3sl1HnY9uje9+P+UBq2eUw7l2zgvQTABrrBqU+2QJ9gxF5cnsIZaiRjaPtvrz5sU" 707 ~ "7UTObLrO1Lsb238UR+bMJUszIFFRK9evQm+49AE3jNK/WYPKAcZLkuzwMuoV0XId" 708 ~ "A/SC185udP721V5wL0aYDIK1qEAxkAscnlnnyX++x+jzI6l6fjbMiL4PHUW3/1ha" 709 ~ "xUvUB7IrQVSqzI9tfr9I4dgUzF7SD4A34KeXFe7ym+MoBqHVi7fF2nb1UKo9ih+/" 710 ~ "8OsZzLGjE9Vc2lbJ7C7yljI4f+jXbjwEaAQ+j2Y/SGDuEr8tWwt0dNbmlPkebb4R" 711 ~ "WXSjkm8S/uXkOHd8tqky34zYvsTQc7kxujvIMraNndMAdB+nv4r8R+0ldvaTa6Qk" 712 ~ "ZjqrY5xa5PVoNCO0dCvxyXgjjxbL451lLeP9uL78hIrZIiIuBKQDfAcT61eoGiPw" 713 ~ "xzRz/GRs6jBrS8vIhi+Dhd36nUt/osCH6HloMwPtW906Bis89bOieKZtKhP4P0T4" 714 ~ "Ld8xDuB0q2o2RZfomaAlXcFk8xzFCEaFHfmrSBld7X6hsdUQvX7nTXP682vDHs+i" 715 ~ "aDWQRvTrh5+SQAlDi0gcbNeImgAu1e44K8kZDab8Am5HlVjkR1Z36aqeMFDidlaU" 716 ~ "38gfVuiAuW5xYMmA3Zjt09///////////wKCBAB//////////+SH7VEQtGEaYmMx" 717 ~ "RcBuDmiUgScERTPmOgEF31Mdic2RKKUEPMcaAm73yozZ5p0hjZgVhTb5L4obp/Ca" 718 ~ "trao4SLyQtq7MS8/Y3omIXTTG/a1hf+uW3oDW/b3HDX9rUTP0tdPkgi+JY/zJJQz" 719 ~ "KPZyLZ7hAD5cULHfgsxtJBsOKunNNIsf1H6SZ6/Bsq6R7lHWyw4xeasQQqldz2qU" 720 ~ "g7hLSzazhhqnJV5MAni6NgRlDBC+GUgvIxcbZx3xzzuWDAdDAc2TwdF2A9FH2uKu" 721 ~ "+DemKWTvFeX7SqwLjBzKpL51SrVyiukTDEx9AogKuUctRVViFtaZi4aCKD0Z1CqQ" 722 ~ "1e+OXTJ2fcKCLG33hUV1OKuugwY+2cuHwtNw8mPV+tdGbYSZ649GSnAlErDO53Hp" 723 ~ "Ew1pdzX4l/0DbMUEMmw7ATmfZDUyKQ+VjAu9kAZd8IurvTCutjuExGBdbKNxBHEn" 724 ~ "0Dpy1Zih7a3+cH6IRyXBaJBUkIQAjTkeCVPD82vEOM0IXt0tk0zhk4w1enEeDUo0" 725 ~ "GlsKhe0SwfTlFWomdG3d4W2Cb0d8l0d+Cg/fZVMUPiyjpzXgLszZSyfQSGHREZ3Q" 726 ~ "wyit8/aPsJS4Z3Fr19wN7rsQuCQOaANIk+rYLVTJ2nVMRsfu4MN/2+5IU2BHpvoa" 727 ~ "5JoBQkkbYf1aaT44E2DqblkwEyNvZLqPOx7dG978f8oDVs8ph3LtnBegmADXWDUp" 728 ~ "9sgT7BiLy5PYQy1EjG0fbfXnzYp2omc2XWdqXY3tv4oj82YSpZmQKKiV69ehN9x6" 729 ~ "AJvGaV+sweUA4yXJdngZdQrouQ6B+kFr5zc6f3tqrzgXo0wGQVrUIBjIBY5PLPPk" 730 ~ "v99j9HmR1L0/G2ZEXweOotv/rC1ipeoD2RWgqlVmR7a/X6Rw7ApmL2kHwBvwU8uK" 731 ~ "93lN8ZQDUOrF2+LtO3qoVR7FD9/4dYzmWNGJ6q5tK2T2F3lLGRw/9Gu3HgI0Ah9H" 732 ~ "sx+kMHcJX5athbo6a3NKfI823wisulHJN4l/cvIcO75bVJlvxmxfYmg53JjdHeQZ" 733 ~ "W0bO6YA6D9PfxX4j9pK7e0m10hIzHVWxzi1yerQaEdo6FfjkvBHHi2XxzrKW8f7c" 734 ~ "X35CRWyRERcCUgG+A4n1q9QNEfhjmjn+MjZ1GDWl5eRDF8HC7v1Opb/RYEP0PLQZ" 735 ~ "gfat7p0DFZ562dE8UzaVCfwfonwW75iHcDpVtRsiy/RM0BKu4LJ5jmKEI0KO/NWk" 736 ~ "DK72v1DY6ohev3Omuf15teGPZ9E0GsgjenXDz8kgBKHFpA42a8RNABdq9xwV5IyG" 737 ~ "034BNyPKrHIjqzv01U8YKHE7K0pv5A+rdEBctziwZMBuzHbp7///////////AgEC" 738 ~ "-----END X942 DH PARAMETERS-----"; 739 740 if (name == "modp/srp/8192") 741 return 742 "-----BEGIN DH PARAMETERS-----" 743 ~ "MIIECAKCBAEA///////////JD9qiIWjCNMTGYouA3BzRKQJOCIpnzHQCC76mOxOb" 744 ~ "IlFKCHmONATd75UZs806QxswKwpt8l8UN0/hNW1tUcJF5IW1dmJefsb0TELppjft" 745 ~ "awv/XLb0Brft7jhr+1qJn6WunyQRfEsf5kkoZlHs5Fs9wgB8uKFjvwWY2kg2HFXT" 746 ~ "mmkWP6j9JM9fg2VdI9yjrZYcYvNWIIVSu57VKQdwlpZtZww1Tkq8mATxdGwIyhgh" 747 ~ "fDKQXkYuNs474553LBgOhgObJ4Oi7Aeij7XFXfBvTFLJ3ivL9pVYFxg5lUl86pVq" 748 ~ "5RXSJhiY+gUQFXKOWoqqxC2tMxcNBFB6M6hVIavfHLpk7PuFBFjb7wqK6nFXXQYM" 749 ~ "fbOXD4Wm4eTHq/WujNsJM9cejJTgSiVhnc7j0iYa0u5r8S/6BtmKCGTYdgJzPshq" 750 ~ "ZFIfKxgXeyAMu+EXV3phXWx3CYjAutlG4gjiT6B05asxQ9tb/OD9EI5LgtEgqSEI" 751 ~ "ARpyPBKnh+bXiHGaEL26WyaZwycYavTiPBqUaDS2FQvaJYPpyirUTOjbu8LbBN6O" 752 ~ "+S6O/BQfvsqmKHxZR05rwF2ZspZPoJDDoiM7oYZRW+ftH2EpcM7i16+4G912IXBI" 753 ~ "HNAGkSfVsFqpk7TqmI2P3cGG/7fckKbAj030Nck0AoSSNsP6tNJ8cCbB1NyyYCZG" 754 ~ "3sl1HnY9uje9+P+UBq2eUw7l2zgvQTABrrBqU+2QJ9gxF5cnsIZaiRjaPtvrz5sU" 755 ~ "7UTObLrO1Lsb238UR+bMJUszIFFRK9evQm+49AE3jNK/WYPKAcZLkuzwMuoV0XId" 756 ~ "A/SC185udP721V5wL0aYDIK1qEAxkAscnlnnyX++x+jzI6l6fjbMiL4PHUW3/1ha" 757 ~ "xUvUB7IrQVSqzI9tfr9I4dgUzF7SD4A34KeXFe7ym+MoBqHVi7fF2nb1UKo9ih+/" 758 ~ "8OsZzLGjE9Vc2lbJ7C7yljI4f+jXbjwEaAQ+j2Y/SGDuEr8tWwt0dNbmlPkebb4R" 759 ~ "WXSjkm8S/uXkOHd8tqky34zYvsTQc7kxujvIMraNndMAdB+nv4r8R+0ldvaTa6Qk" 760 ~ "ZjqrY5xa5PVoNCO0dCvxyXgjjxbL451lLeP9uL78hIrZIiIuBKQDfAcT61eoGiPw" 761 ~ "xzRz/GRs6jBrS8vIhi+Dhd36nUt/osCH6HloMwPtW906Bis89bOieKZtKhP4P0T4" 762 ~ "Ld8xDuB0q2o2RZfomaAlXcFk8xzFCEaFHfmrSBld7X6hsdUQvX7nTXP682vDHs+i" 763 ~ "aDWQRvTrh5+SQAlDi0gcbNeImgAu1e44K8kZDab8Am5HlVjkR1Z36aqeMFDidlaU" 764 ~ "38gfVuiAuW5xYMmA3Zjt09///////////wIBEw==" 765 ~ "-----END DH PARAMETERS-----"; 766 767 if (name == "dsa/jce/1024") 768 return 769 "-----BEGIN DSA PARAMETERS-----" 770 ~ "MIIBHgKBgQD9f1OBHXUSKVLfSpwu7OTn9hG3UjzvRADDHj+AtlEmaUVdQCJR+1k9" 771 ~ "jVj6v8X1ujD2y5tVbNeBO4AdNG/yZmC3a5lQpaSfn+gEexAiwk+7qdf+t8Yb+DtX" 772 ~ "58aophUPBPuD9tPFHsMCNVQTWhaRMvZ1864rYdcq7/IiAxmd0UgBxwIVAJdgUI8V" 773 ~ "IwvMspK5gqLrhAvwWBz1AoGARpYDUS4wJ4zTlHWV2yLuyYJqYyKtyXNE9B10DDJX" 774 ~ "JMj577qn1NgD/4xgnc0QDrxb38+tfGpCX66nhuogUOvpg1HqH9of3yTWlHqmuaoj" 775 ~ "dmlTgC9NfUqOy6BtGXaKJJH/sW0O+cQ6mbX3FnL/bwoktETQc20E04oaEyLa9s3Y" 776 ~ "jJ0=" 777 ~ "-----END DSA PARAMETERS-----"; 778 779 if (name == "dsa/botan/2048") 780 return 781 "-----BEGIN DSA PARAMETERS-----" 782 ~ "MIICLAKCAQEAkcSKT9+898Aq6V59oSYSK13Shk9Vm4fo50oobVL1m9HeaN/WRdDg" 783 ~ "DGDAgAMYkZgDdO61lKUyv9Z7mgnqxLhmOgeRDmjzlGX7cEDSXfE5MuusQ0elMOy6" 784 ~ "YchU+biA08DDZgCAWHxFVm2t4mvVo5S+CTtMDyS1r/747GxbPlf7iQJam8FnaZMh" 785 ~ "MeFtPJTvyrGNDfBhIDzFPmEDvHLVWUv9QMplOA9EqahR3LB1SV/AM6ilgHGhvXj+" 786 ~ "BS9mVVZI60txnSr+i0iA+NrW8VgYuhePiSdMhwvpuW6wjEbEAEDMLv4d+xsYaN0x" 787 ~ "nePDSjKmOrbrEiQgmkGWgMx5AtFyjU354QIhAIzX1FD4bwrZTu5M5GmodW0evRBY" 788 ~ "JBlD6v+ws1RYXpJNAoIBAA2fXgdhtNvRgz1qsalhoJlsXyIwP3LYTBQPZ8Qx2Uq1" 789 ~ "cVvqgaDJjTnOS8941rnryJXTT+idlAkdWEhhXvFfXobxHZb2yWniA936WDVkIKSc" 790 ~ "tES1lbkBqTPP4HZ7WU8YoHt/kd7NukRriJkPePL/kfL+fNQ/0uRtGOraH3u2YCxh" 791 ~ "f27zpLKE8v2boQo2BC3o+oeiyjZZf+yBFXoUheRAQd8CgwERy4gLvm7UlIFIhvll" 792 ~ "zcMTX1zPE4Nyi/ZbgG+WksCxDWxMCcdabKO0ATyxarLBBfa+I66pAA6rIXiYX5cs" 793 ~ "mAV+HIbkTnIYaI6krg82NtzKdFydzU5q/7Z8y8E9YTE=" 794 ~ "-----END DSA PARAMETERS-----"; 795 796 if (name == "dsa/botan/3072") 797 return 798 "-----BEGIN DSA PARAMETERS-----" 799 ~ "MIIDLAKCAYEA5LUIgHWWY1heFCRgyi2d/xMviuTIQN2jomZoiRJP5WOLhOiim3rz" 800 ~ "+hIJvmv8S1By7Tsrc4e68/hX9HioAijvNgC3az3Pth0g00RlslBtLK+H3259wM6R" 801 ~ "vS0Wekb2rcwxxTHk+cervbkq3fNbCoBsZikqX14X6WTdCZkDczrEKKs12A6m9oW/" 802 ~ "uovkBo5UGK5eytno/wc94rY+Tn6tNciptwtb1Hz7iNNztm83kxk5sKtxvVWVgJCG" 803 ~ "2gFVM30YWg5Ps2pRmxtiArhZHmACRJzxzTpmOE9tIHOxzXO+ypO68eGmEX0COPIi" 804 ~ "rh7X/tGFqJDn9n+rj+uXU8wTSlGD3+h64llfe1wtn7tCJJ/dWVE+HTOWs+sv2GaE" 805 ~ "8oWoRI/nV6ApiBxAdguU75Gb35dAw4OJWZ7FGm6btRmo4GhJHpzgovz+PLYNZs8N" 806 ~ "+tIKjsaEBIaEphREV1vRck1zUrRKdgB3s71r04XOWwpyUMwL92jagpI4Buuc+7E4" 807 ~ "hDcxthggjHWbAiEAs+vTZOxp74zzuvZDt1c0sWM5suSeXN4bWcHp+0DuDFsCggGA" 808 ~ "K+0h7vg5ZKIwrom7px2ffDnFL8gim047x+WUTTKdoQ8BDqyee69sAJ/E6ylgcj4r" 809 ~ "Vt9GY+TDrIAOkljeL3ZJ0gZ4KJP4Ze/KSY0u7zAHTqXop6smJxKk2UovOwuaku5A" 810 ~ "D7OKPMWaXcfkNtXABLIuNQKDgbUck0B+sy1K4P1Cy0XhLQ7O6KJiOO3iCCp7FSIR" 811 ~ "PGbO+NdFxs88uUX4TS9N4W1Epx3hmCcOE/A1U8iLjTI60LlIob8hA6lJl5tu0W+1" 812 ~ "88lT2Vt8jojKZ9z1pjb7nKOdkkIV96iE7Wx+48ltjZcVQnl0t8Q1EoLhPTdz99KL" 813 ~ "RS8QiSoTx1hzKN6kgntrNpsqjcFyrcWD9R8qZZjFSD5bxGewL5HQWcQC0Y4sJoD3" 814 ~ "dqoG9JKAoscsF8xC1bbnQMXEsas8UcLtCSviotiwU65Xc9FCXtKwjwbi3VBZLfGk" 815 ~ "eMFVkc39EVZP+I/zi3IdQjkv2kcyEtz9jS2IqXagCv/m//tDCjWeZMorNRyiQSOU" 816 ~ "-----END DSA PARAMETERS-----"; 817 818 return null; 819 } 820 }