xref: /openbsd-src/lib/libcrypto/bn/bn_prime.pl (revision 4aca1c33d9e2657da5e7e6b8eb32a535f3f8e283)
1#!/usr/bin/perl
2# 	$OpenBSD: bn_prime.pl,v 1.12 2023/03/26 08:04:57 tb Exp $
3#
4# Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
5# All rights reserved.
6#
7# This package is an SSL implementation written
8# by Eric Young (eay@cryptsoft.com).
9# The implementation was written so as to conform with Netscapes SSL.
10#
11# This library is free for commercial and non-commercial use as long as
12# the following conditions are aheared to.  The following conditions
13# apply to all code found in this distribution, be it the RC4, RSA,
14# lhash, DES, etc., code; not just the SSL code.  The SSL documentation
15# included with this distribution is covered by the same copyright terms
16# except that the holder is Tim Hudson (tjh@cryptsoft.com).
17#
18# Copyright remains Eric Young's, and as such any Copyright notices in
19# the code are not to be removed.
20# If this package is used in a product, Eric Young should be given attribution
21# as the author of the parts of the library used.
22# This can be in the form of a textual message at program startup or
23# in documentation (online or textual) provided with the package.
24#
25# Redistribution and use in source and binary forms, with or without
26# modification, are permitted provided that the following conditions
27# are met:
28# 1. Redistributions of source code must retain the copyright
29#    notice, this list of conditions and the following disclaimer.
30# 2. Redistributions in binary form must reproduce the above copyright
31#    notice, this list of conditions and the following disclaimer in the
32#    documentation and/or other materials provided with the distribution.
33# 3. All advertising materials mentioning features or use of this software
34#    must display the following acknowledgement:
35#    "This product includes cryptographic software written by
36#     Eric Young (eay@cryptsoft.com)"
37#    The word 'cryptographic' can be left out if the rouines from the library
38#    being used are not cryptographic related :-).
39# 4. If you include any Windows specific code (or a derivative thereof) from
40#    the apps directory (application code) you must include an acknowledgement:
41#    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
42#
43# THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
44# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
45# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
46# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
47# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
48# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
49# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
50# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
51# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
52# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
53# SUCH DAMAGE.
54#
55# The licence and distribution terms for any publically available version or
56# derivative of this code cannot be changed.  i.e. this code cannot simply be
57# copied and put under another distribution licence
58# [including the GNU Public Licence.]
59
60use strict;
61use warnings;
62
63my ($i, $num, $p, $s, @primes);
64
65$num = 2048;
66$num = $ARGV[0] if $#ARGV >= 0;
67
68# The 6543rd prime is 2^16 + 1.
69die "$num must be smaller than 6543" if $num >= 6543;
70
71push(@primes, 2);
72$p = 1;
73
74loop:
75while ($#primes < $num - 1) {
76	$p += 2;
77	$s = int(sqrt($p));
78
79	for ($i = 0; defined($primes[$i]) && $primes[$i] <= $s; $i++) {
80		next loop if $p % $primes[$i] == 0;
81	}
82
83	die "\$primes[$i] is too large: $primes[$i]" if $primes[$i] > 65535;
84	push(@primes, $p);
85}
86
87printf("/*\t\$" . "OpenBSD" . "\$ */\n");
88print <<\EOF;
89/*
90 * Public domain, generated by bn_prime.pl.
91 */
92
93EOF
94
95print "#include \"bn_prime.h\"\n\n";
96print "const uint16_t primes[NUMPRIMES] = {";
97for ($i = 0; $i <= $#primes; $i++) {
98	printf("%s%5d,", $i % 8 == 0 ? "\n\t" : " ", $primes[$i]);
99}
100print "\n};\n";
101