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