/*
 * Copyright 2005-2021 The OpenSSL Project Authors. All Rights Reserved.
 *
 * Licensed under the Apache License 2.0 (the "License").  You may not use
 * this file except in compliance with the License.  You can obtain a copy
 * in the file LICENSE in the source distribution or at
 * https://www.openssl.org/source/license.html
 */

#include <openssl/bn.h>
#include "crypto/bn_dh.h"

#define COPY_BN(dst, src) (dst != NULL) ? BN_copy(dst, &src) : BN_dup(&src)

/*-
 * "First Oakley Default Group" from RFC2409, section 6.1.
 *
 * The prime is: 2^768 - 2 ^704 - 1 + 2^64 * { [2^638 pi] + 149686 }
 *
 * RFC2409 specifies a generator of 2.
 * RFC2412 specifies a generator of 22.
 */

BIGNUM *BN_get_rfc2409_prime_768(BIGNUM *bn)
{
    static const unsigned char RFC2409_PRIME_768[] = {
        0xFF,
        0xFF,
        0xFF,
        0xFF,
        0xFF,
        0xFF,
        0xFF,
        0xFF,
        0xC9,
        0x0F,
        0xDA,
        0xA2,
        0x21,
        0x68,
        0xC2,
        0x34,
        0xC4,
        0xC6,
        0x62,
        0x8B,
        0x80,
        0xDC,
        0x1C,
        0xD1,
        0x29,
        0x02,
        0x4E,
        0x08,
        0x8A,
        0x67,
        0xCC,
        0x74,
        0x02,
        0x0B,
        0xBE,
        0xA6,
        0x3B,
        0x13,
        0x9B,
        0x22,
        0x51,
        0x4A,
        0x08,
        0x79,
        0x8E,
        0x34,
        0x04,
        0xDD,
        0xEF,
        0x95,
        0x19,
        0xB3,
        0xCD,
        0x3A,
        0x43,
        0x1B,
        0x30,
        0x2B,
        0x0A,
        0x6D,
        0xF2,
        0x5F,
        0x14,
        0x37,
        0x4F,
        0xE1,
        0x35,
        0x6D,
        0x6D,
        0x51,
        0xC2,
        0x45,
        0xE4,
        0x85,
        0xB5,
        0x76,
        0x62,
        0x5E,
        0x7E,
        0xC6,
        0xF4,
        0x4C,
        0x42,
        0xE9,
        0xA6,
        0x3A,
        0x36,
        0x20,
        0xFF,
        0xFF,
        0xFF,
        0xFF,
        0xFF,
        0xFF,
        0xFF,
        0xFF,
    };
    return BN_bin2bn(RFC2409_PRIME_768, sizeof(RFC2409_PRIME_768), bn);
}

/*-
 * "Second Oakley Default Group" from RFC2409, section 6.2.
 *
 * The prime is: 2^1024 - 2^960 - 1 + 2^64 * { [2^894 pi] + 129093 }.
 *
 * RFC2409 specifies a generator of 2.
 * RFC2412 specifies a generator of 22.
 */

BIGNUM *BN_get_rfc2409_prime_1024(BIGNUM *bn)
{
    static const unsigned char RFC2409_PRIME_1024[] = {
        0xFF,
        0xFF,
        0xFF,
        0xFF,
        0xFF,
        0xFF,
        0xFF,
        0xFF,
        0xC9,
        0x0F,
        0xDA,
        0xA2,
        0x21,
        0x68,
        0xC2,
        0x34,
        0xC4,
        0xC6,
        0x62,
        0x8B,
        0x80,
        0xDC,
        0x1C,
        0xD1,
        0x29,
        0x02,
        0x4E,
        0x08,
        0x8A,
        0x67,
        0xCC,
        0x74,
        0x02,
        0x0B,
        0xBE,
        0xA6,
        0x3B,
        0x13,
        0x9B,
        0x22,
        0x51,
        0x4A,
        0x08,
        0x79,
        0x8E,
        0x34,
        0x04,
        0xDD,
        0xEF,
        0x95,
        0x19,
        0xB3,
        0xCD,
        0x3A,
        0x43,
        0x1B,
        0x30,
        0x2B,
        0x0A,
        0x6D,
        0xF2,
        0x5F,
        0x14,
        0x37,
        0x4F,
        0xE1,
        0x35,
        0x6D,
        0x6D,
        0x51,
        0xC2,
        0x45,
        0xE4,
        0x85,
        0xB5,
        0x76,
        0x62,
        0x5E,
        0x7E,
        0xC6,
        0xF4,
        0x4C,
        0x42,
        0xE9,
        0xA6,
        0x37,
        0xED,
        0x6B,
        0x0B,
        0xFF,
        0x5C,
        0xB6,
        0xF4,
        0x06,
        0xB7,
        0xED,
        0xEE,
        0x38,
        0x6B,
        0xFB,
        0x5A,
        0x89,
        0x9F,
        0xA5,
        0xAE,
        0x9F,
        0x24,
        0x11,
        0x7C,
        0x4B,
        0x1F,
        0xE6,
        0x49,
        0x28,
        0x66,
        0x51,
        0xEC,
        0xE6,
        0x53,
        0x81,
        0xFF,
        0xFF,
        0xFF,
        0xFF,
        0xFF,
        0xFF,
        0xFF,
        0xFF,
    };
    return BN_bin2bn(RFC2409_PRIME_1024, sizeof(RFC2409_PRIME_1024), bn);
}

/*-
 * "1536-bit MODP Group" from RFC3526, Section 2.
 *
 * The prime is: 2^1536 - 2^1472 - 1 + 2^64 * { [2^1406 pi] + 741804 }
 *
 * RFC3526 specifies a generator of 2.
 * RFC2312 specifies a generator of 22.
 */

BIGNUM *BN_get_rfc3526_prime_1536(BIGNUM *bn)
{
    return COPY_BN(bn, ossl_bignum_modp_1536_p);
}

/*-
 * "2048-bit MODP Group" from RFC3526, Section 3.
 *
 * The prime is: 2^2048 - 2^1984 - 1 + 2^64 * { [2^1918 pi] + 124476 }
 *
 * RFC3526 specifies a generator of 2.
 */

BIGNUM *BN_get_rfc3526_prime_2048(BIGNUM *bn)
{
    return COPY_BN(bn, ossl_bignum_modp_2048_p);
}

/*-
 * "3072-bit MODP Group" from RFC3526, Section 4.
 *
 * The prime is: 2^3072 - 2^3008 - 1 + 2^64 * { [2^2942 pi] + 1690314 }
 *
 * RFC3526 specifies a generator of 2.
 */

BIGNUM *BN_get_rfc3526_prime_3072(BIGNUM *bn)
{
    return COPY_BN(bn, ossl_bignum_modp_3072_p);
}

/*-
 * "4096-bit MODP Group" from RFC3526, Section 5.
 *
 * The prime is: 2^4096 - 2^4032 - 1 + 2^64 * { [2^3966 pi] + 240904 }
 *
 * RFC3526 specifies a generator of 2.
 */

BIGNUM *BN_get_rfc3526_prime_4096(BIGNUM *bn)
{
    return COPY_BN(bn, ossl_bignum_modp_4096_p);
}

/*-
 * "6144-bit MODP Group" from RFC3526, Section 6.
 *
 * The prime is: 2^6144 - 2^6080 - 1 + 2^64 * { [2^6014 pi] + 929484 }
 *
 * RFC3526 specifies a generator of 2.
 */

BIGNUM *BN_get_rfc3526_prime_6144(BIGNUM *bn)
{
    return COPY_BN(bn, ossl_bignum_modp_6144_p);
}

/*-
 * "8192-bit MODP Group" from RFC3526, Section 7.
 *
 * The prime is: 2^8192 - 2^8128 - 1 + 2^64 * { [2^8062 pi] + 4743158 }
 *
 * RFC3526 specifies a generator of 2.
 */

BIGNUM *BN_get_rfc3526_prime_8192(BIGNUM *bn)
{
    return COPY_BN(bn, ossl_bignum_modp_8192_p);
}
