Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
pike
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container registry
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
pikelang
pike
Commits
bb84b08d
Commit
bb84b08d
authored
26 years ago
by
Niels Möller
Browse files
Options
Downloads
Patches
Plain Diff
Use an instance variable for random-number generator.
Rev: lib/modules/Crypto/dsa.pike:1.3
parent
cd6e8217
No related branches found
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
lib/modules/Crypto/dsa.pike
+29
-20
29 additions, 20 deletions
lib/modules/Crypto/dsa.pike
with
29 additions
and
20 deletions
lib/modules/Crypto/dsa.pike
+
29
−
20
View file @
bb84b08d
...
@@ -12,6 +12,8 @@ bignum g; /* Generator */
...
@@ -12,6 +12,8 @@ bignum g; /* Generator */
bignum y; /* Public key */
bignum y; /* Public key */
bignum x; /* Private key */
bignum x; /* Private key */
function random;
object set_public_key(bignum p_, bignum q_, bignum g_, bignum y_)
object set_public_key(bignum p_, bignum q_, bignum g_, bignum y_)
{
{
p = p_; q = q_; g = g_; y = y_;
p = p_; q = q_; g = g_; y = y_;
...
@@ -24,6 +26,11 @@ object set_private_key(bignum secret)
...
@@ -24,6 +26,11 @@ object set_private_key(bignum secret)
return this_object();
return this_object();
}
}
object use_random(function r)
{
random = r;
}
bignum hash2number(string digest)
bignum hash2number(string digest)
{
{
return Gmp.mpz(digest, 256) % q;
return Gmp.mpz(digest, 256) % q;
...
@@ -35,19 +42,19 @@ bignum dsa_hash(string msg)
...
@@ -35,19 +42,19 @@ bignum dsa_hash(string msg)
}
}
/* Generate a random number k, 0<=k<n */
/* Generate a random number k, 0<=k<n */
bignum random_number(bignum n
, function r
)
bignum random_number(bignum n)
{
{
return Gmp.mpz(r( (q->size() + 10 / 8)), 256) % n;
return Gmp.mpz(r
andom
( (q->size() + 10 / 8)), 256) % n;
}
}
bignum random_exponent(
function r
)
bignum random_exponent()
{
{
return random_number(q - 1
, r
) + 1;
return random_number(q - 1) + 1;
}
}
array(bignum) raw_sign(bignum h
, function random
)
array(bignum) raw_sign(bignum h)
{
{
bignum k = random_exponent(
random
);
bignum k = random_exponent();
bignum r = g->powm(k, p) % q;
bignum r = g->powm(k, p) % q;
bignum s = (k->invert(q) * (h + x*r)) % q;
bignum s = (k->invert(q) * (h + x*r)) % q;
...
@@ -69,7 +76,7 @@ int raw_verify(bignum h, bignum r, bignum s)
...
@@ -69,7 +76,7 @@ int raw_verify(bignum h, bignum r, bignum s)
return r == (g->powm(w * h % q, p) * y->powm(w * r % q, p) % p) % q;
return r == (g->powm(w * h % q, p) * y->powm(w * r % q, p) % p) % q;
}
}
string sign_rsaref(string msg
, function random
)
string sign_rsaref(string msg)
{
{
[bignum r, bignum s] = raw_sign(dsa_hash(msg), random);
[bignum r, bignum s] = raw_sign(dsa_hash(msg), random);
...
@@ -86,7 +93,7 @@ int verify_rsaref(string msg, string s)
...
@@ -86,7 +93,7 @@ int verify_rsaref(string msg, string s)
Gmp.mpz(s[20..], 256));
Gmp.mpz(s[20..], 256));
}
}
string sign_ssl(string msg
, function random
)
string sign_ssl(string msg)
{
{
return Standards.ASN1.Types.asn1_sequence(
return Standards.ASN1.Types.asn1_sequence(
Array.map(raw_sign(dsa_hash(msg), random),
Array.map(raw_sign(dsa_hash(msg), random),
...
@@ -140,7 +147,7 @@ string nist_hash(bignum x)
...
@@ -140,7 +147,7 @@ string nist_hash(bignum x)
}
}
/* Returns ({ p, q }) */
/* Returns ({ p, q }) */
array(bignum) nist_primes(int l
, function r
)
array(bignum) nist_primes(int l)
{
{
if ( (l < 0) || (l > 8) )
if ( (l < 0) || (l > 8) )
throw( ({ "Crypto.dsa->nist_primes: Unsupported key size.\n",
throw( ({ "Crypto.dsa->nist_primes: Unsupported key size.\n",
...
@@ -154,7 +161,7 @@ array(bignum) nist_primes(int l, function r)
...
@@ -154,7 +161,7 @@ array(bignum) nist_primes(int l, function r)
for (;;)
for (;;)
{
{
/* Generate q */
/* Generate q */
string seed = r(SEED_LENGTH);
string seed = r
andom
(SEED_LENGTH);
bignum s = Gmp.mpz(seed, 256);
bignum s = Gmp.mpz(seed, 256);
string h = nist_hash(s) ^ nist_hash(s + 1);
string h = nist_hash(s) ^ nist_hash(s + 1);
...
@@ -194,7 +201,7 @@ array(bignum) nist_primes(int l, function r)
...
@@ -194,7 +201,7 @@ array(bignum) nist_primes(int l, function r)
}
}
}
}
bignum find_generator(bignum p, bignum q
, function r
)
bignum find_generator(bignum p, bignum q)
{
{
bignum e = (p - 1) / q;
bignum e = (p - 1) / q;
bignum g;
bignum g;
...
@@ -202,7 +209,7 @@ bignum find_generator(bignum p, bignum q, function r)
...
@@ -202,7 +209,7 @@ bignum find_generator(bignum p, bignum q, function r)
do
do
{
{
/* A random number in { 2, 3, ... p - 2 } */
/* A random number in { 2, 3, ... p - 2 } */
g = (random_number(p-3
, r
) + 2)
g = (random_number(p-3) + 2)
/* Exponentiate to get an element of order 1 or q */
/* Exponentiate to get an element of order 1 or q */
->powm(e, p);
->powm(e, p);
}
}
...
@@ -211,16 +218,13 @@ bignum find_generator(bignum p, bignum q, function r)
...
@@ -211,16 +218,13 @@ bignum find_generator(bignum p, bignum q, function r)
return g;
return g;
}
}
object generate_
key(int bits, function r
)
object generate_
parameters(int bits
)
{
{
if (!r)
r = Crypto.randomness.really_random()->read;
if (bits % 64)
if (bits % 64)
throw( ({ "Crypto.dsa->generate_key: Unsupported key size.\n",
throw( ({ "Crypto.dsa->generate_key: Unsupported key size.\n",
backtrace() }) );
backtrace() }) );
[p, q] = nist_primes(bits / 64 - 8
, r
);
[p, q] = nist_primes(bits / 64 - 8);
if (p % q != 1)
if (p % q != 1)
throw( ({ "Crypto.dsa->generate_key: Internal error.\n", backtrace() }) );
throw( ({ "Crypto.dsa->generate_key: Internal error.\n", backtrace() }) );
...
@@ -228,13 +232,18 @@ object generate_key(int bits, function r)
...
@@ -228,13 +232,18 @@ object generate_key(int bits, function r)
if (q->size() != 160)
if (q->size() != 160)
throw( ({ "Crypto.dsa->generate_key: Internal error.\n", backtrace() }) );
throw( ({ "Crypto.dsa->generate_key: Internal error.\n", backtrace() }) );
g = find_generator(p, q
, r
);
g = find_generator(p, q);
if ( (g == 1) || (g->powm(q, p) != 1))
if ( (g == 1) || (g->powm(q, p) != 1))
throw( ({ "Crypto.dsa->generate_key: Internal error.\n", backtrace() }) );
throw( ({ "Crypto.dsa->generate_key: Internal error.\n", backtrace() }) );
return this_object();
}
object generate_key()
{
/* x in { 2, 3, ... q - 1 } */
/* x in { 2, 3, ... q - 1 } */
x = random_number(q - 2
, r
) + 2;
x = random_number(q - 2) + 2;
y = g->powm(x, p);
y = g->powm(x, p);
return this_object();
return this_object();
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment