net.i2p.crypto

## Class SigUtil

- java.lang.Object
- - net.i2p.crypto.SigUtil

-     public final class SigUtil
      extends Object

  Comprehensive utility class for I2P signing keys and digital signatures. This class provides essential methods for converting between I2P's native key formats and standard Java cryptographic key representations, as well as utilities for signature encoding/decoding and key validation.

  Key functionalities include:

  - Conversion between I2P and Java key formats
  - Support for DSA, ECDSA, EdDSA, and RSA algorithms
  - ASN.1 signature encoding and decoding
  - Key validation and rectification

- - ### Method Summary

    All Methods Static Methods Concrete Methods
    Modifier and Type | Method and Description
    --- | ---
    `static NativeBigInteger[]` | `aSN1ToBigInteger(byte[] asn, int len)` See above.
    `static void` | `clearCaches()`
    `(package private) static byte[]` | `combine(BigInteger x, BigInteger y, int len)` Combine two BigIntegers of nominal length = len / 2
    `static SigningPrivateKey` | `fromJavaKey(DSAPrivateKey pk)`
    `static SigningPublicKey` | `fromJavaKey(DSAPublicKey pk)`
    `static SigningPrivateKey` | `fromJavaKey(ECPrivateKey pk, SigType type)`
    `static SigningPublicKey` | `fromJavaKey(ECPublicKey pk, SigType type)`
    `static SigningPrivateKey` | `fromJavaKey(EdDSAPrivateKey pk, SigType type)`
    `static SigningPublicKey` | `fromJavaKey(EdDSAPublicKey pk, SigType type)`
    `static SigningPrivateKey` | `fromJavaKey(PrivateKey pk)` Use if SigType is unknown.
    `static SigningPrivateKey` | `fromJavaKey(PrivateKey pk, SigType type)` Use if SigType is known.
    `static SigningPublicKey` | `fromJavaKey(PublicKey pk)` Use if SigType is unknown.
    `static SigningPublicKey` | `fromJavaKey(PublicKey pk, SigType type)` Use if SigType is known.
    `static SigningPrivateKey` | `fromJavaKey(RSAPrivateKey pk, SigType type)` As of 0.9.31, if pk is a RSAPrivateCrtKey, this will return a RSASigningPrivateCrtKey.
    `static SigningPublicKey` | `fromJavaKey(RSAPublicKey pk, SigType type)`
    `static Signature` | `fromJavaSig(byte[] asn, SigType type)`
    `static PrivateKey` | `importJavaPrivateKey(File file, SigType type)`
    `static PublicKey` | `importJavaPublicKey(File file, SigType type)`
    `static int` | `intToASN1(byte[] d, int idx, int val)` Output an length or integer value in ASN.1 Does NOT output the tag e.g.
    `static byte[]` | `rectify(BigInteger bi, int len)`
    `static byte[]` | `sigBytesToASN1(BigInteger r, BigInteger s)` http://download.oracle.com/javase/1.5.0/docs/guide/security/CryptoSpec.html
    `static DSAPrivateKey` | `toJavaDSAKey(SigningPrivateKey pk)`
    `static DSAPublicKey` | `toJavaDSAKey(SigningPublicKey pk)`
    `static ECPrivateKey` | `toJavaECKey(SigningPrivateKey pk)`
    `static ECPublicKey` | `toJavaECKey(SigningPublicKey pk)`
    `static EdDSAPrivateKey` | `toJavaEdDSAKey(SigningPrivateKey pk)`
    `static EdDSAPublicKey` | `toJavaEdDSAKey(SigningPublicKey pk)`
    `static PrivateKey` | `toJavaKey(SigningPrivateKey pk)`
    `static PublicKey` | `toJavaKey(SigningPublicKey pk)`
    `static RSAPrivateKey` | `toJavaRSAKey(SigningPrivateKey pk)` As of 0.9.31, if pk is a RSASigningPrivateCrtKey, this will return a RSAPrivateCrtKey.
    `static byte[]` | `toJavaSig(Signature sig)`

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- - ### Method Detail

    - #### aSN1ToBigInteger

          public static NativeBigInteger[] aSN1ToBigInteger(byte[] asn,
                                                            int len)
                                                     throws SignatureException

      See above. Only supports sigs up to about 65530 bytes. See code to fix BER encoding for bigger than that.
      Parameters:
        `len` - nominal length of each BigInteger
      Returns:
        two BigIntegers
      Throws:
        `SignatureException`

    - #### clearCaches

          public static void clearCaches()

    - #### combine

          static byte[] combine(BigInteger x,
                                BigInteger y,
                                int len)
                         throws InvalidKeyException

      Combine two BigIntegers of nominal length = len / 2
      Returns:
        array of exactly len bytes
      Throws:
        `InvalidKeyException`

    - #### fromJavaKey

          public static SigningPrivateKey fromJavaKey(DSAPrivateKey pk)
                                               throws GeneralSecurityException

      Throws:
        `GeneralSecurityException`

    - #### fromJavaKey

          public static SigningPublicKey fromJavaKey(DSAPublicKey pk)
                                              throws GeneralSecurityException

      Throws:
        `GeneralSecurityException`

    - #### fromJavaKey

          public static SigningPrivateKey fromJavaKey(ECPrivateKey pk,
                                                      SigType type)
                                               throws GeneralSecurityException

      Throws:
        `GeneralSecurityException`

    - #### fromJavaKey

          public static SigningPublicKey fromJavaKey(ECPublicKey pk,
                                                     SigType type)
                                              throws GeneralSecurityException

      Throws:
        `GeneralSecurityException`

    - #### fromJavaKey

          public static SigningPrivateKey fromJavaKey(EdDSAPrivateKey pk,
                                                      SigType type)
                                               throws GeneralSecurityException

      Throws:
        `GeneralSecurityException`

    - #### fromJavaKey

          public static SigningPublicKey fromJavaKey(EdDSAPublicKey pk,
                                                     SigType type)
                                              throws GeneralSecurityException

      Throws:
        `GeneralSecurityException`

    - #### fromJavaKey

          public static SigningPrivateKey fromJavaKey(PrivateKey pk)
                                               throws GeneralSecurityException

      Use if SigType is unknown. For efficiency, use fromJavakey(pk, type) if type is known.
      Parameters:
        `pk` - JAVA key!
      Throws:
        `InvalidKeyException` - on unknown type
        `GeneralSecurityException`

    - #### fromJavaKey

          public static SigningPrivateKey fromJavaKey(PrivateKey pk,
                                                      SigType type)
                                               throws GeneralSecurityException

      Use if SigType is known.
      Parameters:
        `pk` - JAVA key!
      Throws:
        `GeneralSecurityException`

    - #### fromJavaKey

          public static SigningPublicKey fromJavaKey(PublicKey pk)
                                              throws GeneralSecurityException

      Use if SigType is unknown. For efficiency, use fromJavakey(pk, type) if type is known.
      Parameters:
        `pk` - JAVA key!
      Throws:
        `InvalidKeyException` - on unknown type
        `GeneralSecurityException`

    - #### fromJavaKey

          public static SigningPublicKey fromJavaKey(PublicKey pk,
                                                     SigType type)
                                              throws GeneralSecurityException

      Use if SigType is known.
      Parameters:
        `pk` - JAVA key!
      Throws:
        `GeneralSecurityException`

    - #### fromJavaKey

          public static SigningPrivateKey fromJavaKey(RSAPrivateKey pk,
                                                      SigType type)
                                               throws GeneralSecurityException

      As of 0.9.31, if pk is a RSAPrivateCrtKey, this will return a RSASigningPrivateCrtKey.
      Throws:
        `GeneralSecurityException`

    - #### fromJavaKey

          public static SigningPublicKey fromJavaKey(RSAPublicKey pk,
                                                     SigType type)
                                              throws GeneralSecurityException

      Throws:
        `GeneralSecurityException`

    - #### fromJavaSig

          public static Signature fromJavaSig(byte[] asn,
                                              SigType type)
                                       throws SignatureException

      Parameters:
        `asn` - ASN.1 representation
      Returns:
        a Signature with SigType type
      Throws:
        `SignatureException`

    - #### importJavaPrivateKey

          public static PrivateKey importJavaPrivateKey(File file,
                                                        SigType type)
                                                 throws GeneralSecurityException,
                                                        IOException

      Returns:
        JAVA key!
      Throws:
        `GeneralSecurityException`
        `IOException`

    - #### importJavaPublicKey

          public static PublicKey importJavaPublicKey(File file,
                                                      SigType type)
                                               throws GeneralSecurityException,
                                                      IOException

      Returns:
        JAVA key!
      Throws:
        `GeneralSecurityException`
        `IOException`

    - #### intToASN1

          public static int intToASN1(byte[] d,
                                      int idx,
                                      int val)

      Output an length or integer value in ASN.1 Does NOT output the tag e.g. 0x02 / 0x30
      Parameters:
        `val` - 0-65535
      Returns:
        the new index

    - #### rectify

          public static byte[] rectify(BigInteger bi,
                                       int len)
                                throws InvalidKeyException

      Parameters:
        `bi` - non-negative
      Returns:
        array of exactly len bytes
      Throws:
        `InvalidKeyException`

    - #### sigBytesToASN1

          public static byte[] sigBytesToASN1(BigInteger r,
                                              BigInteger s)

      http://download.oracle.com/javase/1.5.0/docs/guide/security/CryptoSpec.html

            Signature Format: ASN.1 sequence of two INTEGER values: r and s, in that order:
                                          SEQUENCE ::= { r INTEGER, s INTEGER }

            http://en.wikipedia.org/wiki/Abstract_Syntax_Notation_One
            30 -- tag indicating SEQUENCE
            xx - length in octets

            02 -- tag indicating INTEGER
            xx - length in octets
            xxxxxx - value

      r and s are always non-negative. Only supports sigs up to about 65530 bytes. See code to fix BER encoding for this before you add a SigType with bigger signatures.
      Throws:
        `IllegalArgumentException` - if too big

    - #### toJavaDSAKey

          public static DSAPrivateKey toJavaDSAKey(SigningPrivateKey pk)
                                            throws GeneralSecurityException

      Throws:
        `GeneralSecurityException`

    - #### toJavaDSAKey

          public static DSAPublicKey toJavaDSAKey(SigningPublicKey pk)
                                           throws GeneralSecurityException

      Throws:
        `GeneralSecurityException`

    - #### toJavaECKey

          public static ECPrivateKey toJavaECKey(SigningPrivateKey pk)
                                          throws GeneralSecurityException

      Returns:
        JAVA key!
      Throws:
        `GeneralSecurityException`

    - #### toJavaECKey

          public static ECPublicKey toJavaECKey(SigningPublicKey pk)
                                         throws GeneralSecurityException

      Returns:
        JAVA key!
      Throws:
        `GeneralSecurityException`

    - #### toJavaEdDSAKey

          public static EdDSAPrivateKey toJavaEdDSAKey(SigningPrivateKey pk)
                                                throws GeneralSecurityException

      Returns:
        JAVA EdDSA private key!
      Throws:
        `GeneralSecurityException`

    - #### toJavaEdDSAKey

          public static EdDSAPublicKey toJavaEdDSAKey(SigningPublicKey pk)
                                               throws GeneralSecurityException

      Returns:
        JAVA EdDSA public key!
      Throws:
        `GeneralSecurityException`

    - #### toJavaKey

          public static PrivateKey toJavaKey(SigningPrivateKey pk)
                                      throws GeneralSecurityException

      Returns:
        JAVA key!
      Throws:
        `GeneralSecurityException`

    - #### toJavaKey

          public static PublicKey toJavaKey(SigningPublicKey pk)
                                     throws GeneralSecurityException

      Returns:
        JAVA key!
      Throws:
        `GeneralSecurityException`

    - #### toJavaRSAKey

          public static RSAPrivateKey toJavaRSAKey(SigningPrivateKey pk)
                                            throws GeneralSecurityException

      As of 0.9.31, if pk is a RSASigningPrivateCrtKey, this will return a RSAPrivateCrtKey.
      Throws:
        `GeneralSecurityException`

    - #### toJavaSig

          public static byte[] toJavaSig(Signature sig)

      Returns:
        ASN.1 representation