For the latest news and information visit
The GNU Crypto project

## gnu.crypto.sig.dss Class DSSSignature

```java.lang.Object
gnu.crypto.sig.BaseSignature
gnu.crypto.sig.dss.DSSSignature
```
All Implemented Interfaces:
java.lang.Cloneable, ISignature

public class DSSSignature
extends BaseSignature

The DSS (Digital Signature Standard) algorithm makes use of the following parameters:

1. p: A prime modulus, where ```2L-1 < p < 2L ``` for `512 <= L <= 1024` and `L` a multiple of `64`.
2. q: A prime divisor of `p - 1`, where ```2159 < q < 2160```.
3. g: Where `g = h(p-1)/q mod p`, where `h` is any integer with `1 < h < p - 1` such that `h (p-1)/q mod p > 1` (`g` has order `q mod p`).
4. x: A randomly or pseudorandomly generated integer with ```0 < x < q```.
5. y: `y = gx mod p`.
6. k: A randomly or pseudorandomly generated integer with ```0 < k < q```.

The integers `p`, `q`, and `g` can be public and can be common to a group of users. A user's private and public keys are `x` and `y`, respectively. They are normally fixed for a period of time. Parameters `x` and `k` are used for signature generation only, and must be kept secret. Parameter `k` must be regenerated for each signature.

The signature of a message `M` is the pair of numbers `r` and `s` computed according to the equations below:

• `r = (gk mod p) mod q` and
• `s = (k-1(SHA(M) + xr)) mod q`.

In the above, `k-1` is the multiplicative inverse of `k`, `mod q`; i.e., ```(k-1 k) mod q = 1 ``` and `0 < k-1 < q`. The value of `SHA(M)` is a 160-bit string output by the Secure Hash Algorithm specified in FIPS 180. For use in computing `s`, this string must be converted to an integer.

As an option, one may wish to check if `r == 0` or ```s == 0 ```. If either `r == 0` or `s == 0`, a new value of `k` should be generated and the signature should be recalculated (it is extremely unlikely that `r == 0` or ```s == 0``` if signatures are generated properly).

The signature is transmitted along with the message to the verifier.

References:

1. Digital Signature Standard (DSS), Federal Information Processing Standards Publication 186. National Institute of Standards and Technology.

Version:
\$Revision: 1.2 \$

 Field Summary

 Fields inherited from class gnu.crypto.sig.BaseSignature `md, privateKey, publicKey, schemeName`

 Fields inherited from interface gnu.crypto.sig.ISignature `SIGNER_KEY, SOURCE_OF_RANDOMNESS, VERIFIER_KEY`

 Constructor Summary `DSSSignature()`           Trivial 0-arguments constructor.

 Method Summary ` java.lang.Object` `clone()`           Returns a clone copy of this instance. `protected  java.lang.Object` `generateSignature()` `protected  void` `setupForSigning(java.security.PrivateKey k)` `protected  void` `setupForVerification(java.security.PublicKey k)` `static java.math.BigInteger[]` ```sign(java.security.interfaces.DSAPrivateKey k, byte[] h)``` `static java.math.BigInteger[]` ```sign(java.security.interfaces.DSAPrivateKey k, byte[] h, IRandom irnd)``` `static java.math.BigInteger[]` ```sign(java.security.interfaces.DSAPrivateKey k, byte[] h, java.util.Random rnd)``` `static boolean` ```verify(java.security.interfaces.DSAPublicKey k, byte[] h, java.math.BigInteger[] rs)``` `protected  boolean` `verifySignature(java.lang.Object sig)`

 Methods inherited from class gnu.crypto.sig.BaseSignature `init, name, nextRandomBytes, setupSign, setupVerify, sign, update, update, verify`

 Methods inherited from class java.lang.Object `equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

 Constructor Detail

### DSSSignature

`public DSSSignature()`
Trivial 0-arguments constructor.

 Method Detail

### sign

```public static final java.math.BigInteger[] sign(java.security.interfaces.DSAPrivateKey k,
byte[] h)```

### sign

```public static final java.math.BigInteger[] sign(java.security.interfaces.DSAPrivateKey k,
byte[] h,
java.util.Random rnd)```

### sign

```public static final java.math.BigInteger[] sign(java.security.interfaces.DSAPrivateKey k,
byte[] h,
IRandom irnd)```

### verify

```public static final boolean verify(java.security.interfaces.DSAPublicKey k,
byte[] h,
java.math.BigInteger[] rs)```

### clone

`public java.lang.Object clone()`
Description copied from interface: `ISignature`

Returns a clone copy of this instance.

Specified by:
`clone` in interface `ISignature`
Specified by:
`clone` in class `BaseSignature`

### setupForVerification

```protected void setupForVerification(java.security.PublicKey k)
throws java.lang.IllegalArgumentException```
Specified by:
`setupForVerification` in class `BaseSignature`
Throws:
`java.lang.IllegalArgumentException`

### setupForSigning

```protected void setupForSigning(java.security.PrivateKey k)
throws java.lang.IllegalArgumentException```
Specified by:
`setupForSigning` in class `BaseSignature`
Throws:
`java.lang.IllegalArgumentException`

### generateSignature

```protected java.lang.Object generateSignature()
throws java.lang.IllegalStateException```
Specified by:
`generateSignature` in class `BaseSignature`
Throws:
`java.lang.IllegalStateException`

### verifySignature

```protected boolean verifySignature(java.lang.Object sig)
throws java.lang.IllegalStateException```
Specified by:
`verifySignature` in class `BaseSignature`
Throws:
`java.lang.IllegalStateException`

For the latest news and information visit
The GNU Crypto project