//*********************************************************
//
// Copyright (c) Microsoft. All rights reserved.
// This code is licensed under the Apache License Version 2.0.
// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
//
//*********************************************************
package com.microsoft.uprove;
import java.io.IOException;
import java.math.BigInteger;
import java.util.HashMap;
import java.util.Map;
//TODO: support the pregenerated groups from the U-Prove Recommended Parameters Profile V1.1.
/**
* Generates default subgroup instances. Three group order bit sizes are offered: 160, 256, and 512.
*/
public final class DefaultSubgroupFactory {
private static Map<Integer, Subgroup> defaultSpecMap = new HashMap<Integer, Subgroup>();
static {
// these were generated with a q/(2^|q|) ratio
// of at least 0.999. Therefore, random number
// generation of Zq elements will be efficient.
try {
defaultSpecMap.put(
Integer.valueOf(160),
new Subgroup(
// p
new BigInteger(1, Base64.decode("ANIa6NZubGs87Q6z3xomyRve7QE8F9hJ0w7DCYE+TTeZ8m2w1JToLsYeqf3HC7XLyvLl8YqDZJT1jmfG1hZIDDen8jBhAfyfD0do+cl5PCvhdrC3yXm0Bl0+g1aGo/C4QgxoNMsXkwOG3tqysH3Uc0SaSLqrMWKGtCEFJHXRNM07")),
// q (ratio: 0.99987)
new BigInteger(1, Base64.decode("AP/4CuGdrrxh9GNWrwk13A6BFI6x")),
// g
new BigInteger(1, Base64.decode("AKvOyXLpqd2NEzJwz+rCb3JuVn2WR1djDWvUNGDQkjpGrsCs4lXr893UscQmT1PmizYa+3d6E88AZ9rjZKNNVaCWWmzM94hSeCkjgTz4cIg02R9lV9eD7HW183zZGF8CewQsHHLhIbEmakCL4LtycNZZF7aQg2M+HzzWBiRhL8jB"))));
defaultSpecMap.put(
Integer.valueOf(256),
new Subgroup(
// p
new BigInteger(1, Base64.decode("AJgEaluYCdoRiTYD2LvMD4aR2S9YKmzg/qXVJ+kmFci/7wmMZBCBtnWMBf21ye4ZSSGcfxSAlfU+EdFZUK7Sw9x2SScARPXwk4IkDvIPkEh7IdaUCgWAymeZaJE6VTGevUvhX+3klPMRv8s1ztQ10nuS0t81EctSsH+vwNOvlvnughY9BI0KFJvl25qeJGQDVNvqgkDyEkLQ3yzp1GnDSF8=")),
// q (ratio: 0.99993)
new BigInteger(1, Base64.decode("AP/7vWYLlEEq5h6tnCkGo0QRbjFqJW/Th4dMbGdbHVh9")),
// g
new BigInteger(1, Base64.decode("ZY/qS3f2qmXBzrjKwhnkM47qM4Gmc4dIWB2UV8J1YdD8rOUjWuV5KVvm7QG3Orc9bY4apE3mdjNLVYUxal9Fp1R4yMJ2Js4hyIMQlUkiTVCwwe9DT8KQ3YYtrNH7b1vpFEpYNS3hRJ9tyaCXOj6UiH/bxMqEnHK7b6Hx4ZCFDmArz7eKE//rQ991/nR7ip1iBuzlXSBxqT0bnZlx3g0eNw=="))));
defaultSpecMap.put(
Integer.valueOf(512),
new Subgroup(
// p
new BigInteger(1, Base64.decode("AOTD8AJWE6z1R1P8vOWL3mUtq88zBBYPnh7cag7imrMRG3p0rUjerMDi6d27yyQ0cc+vB3gpxl2Jpriyr44XVrTTWqaALwBgpNGYlsF4Z5e4MoizvDKq2ygWg/htYxCOPlENCgp2j5nq+N5d0i4eSrkALmKBZBdTcgz/Y7O8hTsLZefJd2QR7tWzun7ZvEt+wgq2xFgxHbplfEyUbUTeEahgluv9ojYCbK++WOaFQ5bm9abS58WaOJ8UfXwm6N69O9HeR2wdeoUHW1YY3D1B3Fg6CYGJCERA9tXol7TuVukGo6lNV5vBUkfRq6JXuUeESobC4QVMXyhTI012QGRCuus=")),
// q (ratio: 0.99948)
new BigInteger(1, Base64.decode("AP/ehdZiIzmFLN5xmIcQ2lbjV2ovZXwyLJRw9PvBKaRZ/xa0C+Q4zAoh2ggqvSD3TYpIuTbO4IPsg2v+aIaRSH8=")),
// g
new BigInteger(1, Base64.decode("VcW7g6F/Pn5ih4DzBIZh/nFyz2/7eqCbUQvZPrJVPQkLBkAzdYSL7MSxGGpmw1ITlYIBy9WngaQJC5JlxLGGyJhFFlZKwFGXGWlFOi3Fg3/SxuxPPJxy4MNpXJaeAJRTTbIgwRXxt3wBxJB48JQlPKoNd3gUbUORTmUoGPAdZzZdyn2vAI/au2R7bUCwDLq4LOQPd5Ow6ivQ9uF82q0+JNWYmYAeMsFzIiVHfusdNhMdyunPZVlCVZv1HT8LysEZlAewIloB/btBQhBcIeE2ytSMgI5icyZp2Ma4G3+z1KUIe+6lIHhx3sWfvNBwRbmo/nIFcArQbEyO7vqXEdlRyQ=="))));
} catch (final IOException e) {
AssertionError ae = new AssertionError("impossible exception");
ae.initCause(e);
throw ae;
}
}
/**
* Non-instantiable class.
*/
private DefaultSubgroupFactory() {
super();
}
/**
* Returns a pregenerated subgroup of specific order if one is available.
* @param orderSize the desired size of the group's order <code>q</code>.
* @return a pregenerated subgroup, or <code>null</code> if none is available
* for the given <code>q</code> size.
*/
public static Subgroup getDefaultSubroup(final int orderSize) {
if (defaultSpecMap.containsKey(Integer.valueOf(orderSize))) {
return defaultSpecMap.get(Integer.valueOf(orderSize));
} else {
return null;
}
}
}