summaryrefslogtreecommitdiff
path: root/repackaged_platform/bcprov/src/main/java/com/android/internal/org/bouncycastle/crypto/signers/PlainDSAEncoding.java
diff options
context:
space:
mode:
Diffstat (limited to 'repackaged_platform/bcprov/src/main/java/com/android/internal/org/bouncycastle/crypto/signers/PlainDSAEncoding.java')
-rw-r--r--repackaged_platform/bcprov/src/main/java/com/android/internal/org/bouncycastle/crypto/signers/PlainDSAEncoding.java66
1 files changed, 66 insertions, 0 deletions
diff --git a/repackaged_platform/bcprov/src/main/java/com/android/internal/org/bouncycastle/crypto/signers/PlainDSAEncoding.java b/repackaged_platform/bcprov/src/main/java/com/android/internal/org/bouncycastle/crypto/signers/PlainDSAEncoding.java
new file mode 100644
index 00000000..6b1807bb
--- /dev/null
+++ b/repackaged_platform/bcprov/src/main/java/com/android/internal/org/bouncycastle/crypto/signers/PlainDSAEncoding.java
@@ -0,0 +1,66 @@
+/* GENERATED SOURCE. DO NOT MODIFY. */
+package com.android.internal.org.bouncycastle.crypto.signers;
+
+import java.math.BigInteger;
+
+import com.android.internal.org.bouncycastle.util.Arrays;
+import com.android.internal.org.bouncycastle.util.BigIntegers;
+
+/**
+ * @hide This class is not part of the Android public SDK API
+ */
+public class PlainDSAEncoding
+ implements DSAEncoding
+{
+ public static final PlainDSAEncoding INSTANCE = new PlainDSAEncoding();
+
+ public byte[] encode(BigInteger n, BigInteger r, BigInteger s)
+ {
+ int valueLength = BigIntegers.getUnsignedByteLength(n);
+ byte[] result = new byte[valueLength * 2];
+ encodeValue(n, r, result, 0, valueLength);
+ encodeValue(n, s, result, valueLength, valueLength);
+ return result;
+ }
+
+ public BigInteger[] decode(BigInteger n, byte[] encoding)
+ {
+ int valueLength = BigIntegers.getUnsignedByteLength(n);
+ if (encoding.length != valueLength * 2)
+ {
+ throw new IllegalArgumentException("Encoding has incorrect length");
+ }
+
+ return new BigInteger[] {
+ decodeValue(n, encoding, 0, valueLength),
+ decodeValue(n, encoding, valueLength, valueLength),
+ };
+ }
+
+ protected BigInteger checkValue(BigInteger n, BigInteger x)
+ {
+ if (x.signum() < 0 || x.compareTo(n) >= 0)
+ {
+ throw new IllegalArgumentException("Value out of range");
+ }
+
+ return x;
+ }
+
+ protected BigInteger decodeValue(BigInteger n, byte[] buf, int off, int len)
+ {
+ byte[] bs = Arrays.copyOfRange(buf, off, off + len);
+ return checkValue(n, new BigInteger(1, bs));
+ }
+
+ private void encodeValue(BigInteger n, BigInteger x, byte[] buf, int off, int len)
+ {
+ byte[] bs = checkValue(n, x).toByteArray();
+ int bsOff = Math.max(0, bs.length - len);
+ int bsLen = bs.length - bsOff;
+
+ int pos = len - bsLen;
+ Arrays.fill(buf, off, off + pos, (byte)0);
+ System.arraycopy(bs, bsOff, buf, off + pos, bsLen);
+ }
+}