拒绝类,因为它未通过编译时验证

2023-12-25

我正在尝试将来自 openwhispersystems 的 curve25519-java 集成到我的 Android 应用程序中,并使用 API 23 (Marshmallow) 进行编译。使用非本机代码时,我收到此运行时异常:

java.lang.VerifyError: Rejecting class org.whispersystems.curve25519.java.fe_mul because it failed compile-time verification (declaration of 'org.whispersystems.curve25519.java.fe_mul' appears in /data/app/com.fenritz.safecam-1/base.apk)
      at org.whispersystems.curve25519.java.ge_madd.ge_madd(ge_madd.java:65)
      at org.whispersystems.curve25519.java.ge_scalarmult_base.ge_scalarmult_base(ge_scalarmult_base.java:96)
      at org.whispersystems.curve25519.java.curve_sigs.curve25519_keygen(curve_sigs.java:30)
      at org.whispersystems.curve25519.BaseJavaCurve25519Provider.generatePublicKey(BaseJavaCurve25519Provider.java:50)
      at org.whispersystems.curve25519.JavaCurve25519Provider.generatePublicKey(JavaCurve25519Provider.java:8)
      at org.whispersystems.curve25519.Curve25519.generateKeyPair(Curve25519.java:70)
      at com.fenritz.safecam.SafeCameraActivity.onCreate(SafeCameraActivity.java:105)
      at android.app.Activity.performCreate(Activity.java:6237)
      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
      at android.app.ActivityThread.-wrap11(ActivityThread.java)
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
      at android.os.Handler.dispatchMessage(Handler.java:102)
      at android.os.Looper.loop(Looper.java:148)
      at android.app.ActivityThread.main(ActivityThread.java:5417)
      at java.lang.reflect.Method.invoke(Native Method)
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

被拒绝的类如下:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package org.whispersystems.curve25519.java;

public class fe_mul {
    public fe_mul() {
    }

    public static void fe_mul(int[] h, int[] f, int[] g) {
        int f0 = f[0];
        int f1 = f[1];
        int f2 = f[2];
        int f3 = f[3];
        int f4 = f[4];
        int f5 = f[5];
        int f6 = f[6];
        int f7 = f[7];
        int f8 = f[8];
        int f9 = f[9];
        int g0 = g[0];
        int g1 = g[1];
        int g2 = g[2];
        int g3 = g[3];
        int g4 = g[4];
        int g5 = g[5];
        int g6 = g[6];
        int g7 = g[7];
        int g8 = g[8];
        int g9 = g[9];
        int g1_19 = 19 * g1;
        int g2_19 = 19 * g2;
        int g3_19 = 19 * g3;
        int g4_19 = 19 * g4;
        int g5_19 = 19 * g5;
        int g6_19 = 19 * g6;
        int g7_19 = 19 * g7;
        int g8_19 = 19 * g8;
        int g9_19 = 19 * g9;
        int f1_2 = 2 * f1;
        int f3_2 = 2 * f3;
        int f5_2 = 2 * f5;
        int f7_2 = 2 * f7;
        int f9_2 = 2 * f9;
        long f0g0 = (long)f0 * (long)g0;
        long f0g1 = (long)f0 * (long)g1;
        long f0g2 = (long)f0 * (long)g2;
        long f0g3 = (long)f0 * (long)g3;
        long f0g4 = (long)f0 * (long)g4;
        long f0g5 = (long)f0 * (long)g5;
        long f0g6 = (long)f0 * (long)g6;
        long f0g7 = (long)f0 * (long)g7;
        long f0g8 = (long)f0 * (long)g8;
        long f0g9 = (long)f0 * (long)g9;
        long f1g0 = (long)f1 * (long)g0;
        long f1g1_2 = (long)f1_2 * (long)g1;
        long f1g2 = (long)f1 * (long)g2;
        long f1g3_2 = (long)f1_2 * (long)g3;
        long f1g4 = (long)f1 * (long)g4;
        long f1g5_2 = (long)f1_2 * (long)g5;
        long f1g6 = (long)f1 * (long)g6;
        long f1g7_2 = (long)f1_2 * (long)g7;
        long f1g8 = (long)f1 * (long)g8;
        long f1g9_38 = (long)f1_2 * (long)g9_19;
        long f2g0 = (long)f2 * (long)g0;
        long f2g1 = (long)f2 * (long)g1;
        long f2g2 = (long)f2 * (long)g2;
        long f2g3 = (long)f2 * (long)g3;
        long f2g4 = (long)f2 * (long)g4;
        long f2g5 = (long)f2 * (long)g5;
        long f2g6 = (long)f2 * (long)g6;
        long f2g7 = (long)f2 * (long)g7;
        long f2g8_19 = (long)f2 * (long)g8_19;
        long f2g9_19 = (long)f2 * (long)g9_19;
        long f3g0 = (long)f3 * (long)g0;
        long f3g1_2 = (long)f3_2 * (long)g1;
        long f3g2 = (long)f3 * (long)g2;
        long f3g3_2 = (long)f3_2 * (long)g3;
        long f3g4 = (long)f3 * (long)g4;
        long f3g5_2 = (long)f3_2 * (long)g5;
        long f3g6 = (long)f3 * (long)g6;
        long f3g7_38 = (long)f3_2 * (long)g7_19;
        long f3g8_19 = (long)f3 * (long)g8_19;
        long f3g9_38 = (long)f3_2 * (long)g9_19;
        long f4g0 = (long)f4 * (long)g0;
        long f4g1 = (long)f4 * (long)g1;
        long f4g2 = (long)f4 * (long)g2;
        long f4g3 = (long)f4 * (long)g3;
        long f4g4 = (long)f4 * (long)g4;
        long f4g5 = (long)f4 * (long)g5;
        long f4g6_19 = (long)f4 * (long)g6_19;
        long f4g7_19 = (long)f4 * (long)g7_19;
        long f4g8_19 = (long)f4 * (long)g8_19;
        long f4g9_19 = (long)f4 * (long)g9_19;
        long f5g0 = (long)f5 * (long)g0;
        long f5g1_2 = (long)f5_2 * (long)g1;
        long f5g2 = (long)f5 * (long)g2;
        long f5g3_2 = (long)f5_2 * (long)g3;
        long f5g4 = (long)f5 * (long)g4;
        long f5g5_38 = (long)f5_2 * (long)g5_19;
        long f5g6_19 = (long)f5 * (long)g6_19;
        long f5g7_38 = (long)f5_2 * (long)g7_19;
        long f5g8_19 = (long)f5 * (long)g8_19;
        long f5g9_38 = (long)f5_2 * (long)g9_19;
        long f6g0 = (long)f6 * (long)g0;
        long f6g1 = (long)f6 * (long)g1;
        long f6g2 = (long)f6 * (long)g2;
        long f6g3 = (long)f6 * (long)g3;
        long f6g4_19 = (long)f6 * (long)g4_19;
        long f6g5_19 = (long)f6 * (long)g5_19;
        long f6g6_19 = (long)f6 * (long)g6_19;
        long f6g7_19 = (long)f6 * (long)g7_19;
        long f6g8_19 = (long)f6 * (long)g8_19;
        long f6g9_19 = (long)f6 * (long)g9_19;
        long f7g0 = (long)f7 * (long)g0;
        long f7g1_2 = (long)f7_2 * (long)g1;
        long f7g2 = (long)f7 * (long)g2;
        long f7g3_38 = (long)f7_2 * (long)g3_19;
        long f7g4_19 = (long)f7 * (long)g4_19;
        long f7g5_38 = (long)f7_2 * (long)g5_19;
        long f7g6_19 = (long)f7 * (long)g6_19;
        long f7g7_38 = (long)f7_2 * (long)g7_19;
        long f7g8_19 = (long)f7 * (long)g8_19;
        long f7g9_38 = (long)f7_2 * (long)g9_19;
        long f8g0 = (long)f8 * (long)g0;
        long f8g1 = (long)f8 * (long)g1;
        long f8g2_19 = (long)f8 * (long)g2_19;
        long f8g3_19 = (long)f8 * (long)g3_19;
        long f8g4_19 = (long)f8 * (long)g4_19;
        long f8g5_19 = (long)f8 * (long)g5_19;
        long f8g6_19 = (long)f8 * (long)g6_19;
        long f8g7_19 = (long)f8 * (long)g7_19;
        long f8g8_19 = (long)f8 * (long)g8_19;
        long f8g9_19 = (long)f8 * (long)g9_19;
        long f9g0 = (long)f9 * (long)g0;
        long f9g1_38 = (long)f9_2 * (long)g1_19;
        long f9g2_19 = (long)f9 * (long)g2_19;
        long f9g3_38 = (long)f9_2 * (long)g3_19;
        long f9g4_19 = (long)f9 * (long)g4_19;
        long f9g5_38 = (long)f9_2 * (long)g5_19;
        long f9g6_19 = (long)f9 * (long)g6_19;
        long f9g7_38 = (long)f9_2 * (long)g7_19;
        long f9g8_19 = (long)f9 * (long)g8_19;
        long f9g9_38 = (long)f9_2 * (long)g9_19;
        long h0 = f0g0 + f1g9_38 + f2g8_19 + f3g7_38 + f4g6_19 + f5g5_38 + f6g4_19 + f7g3_38 + f8g2_19 + f9g1_38;
        long h1 = f0g1 + f1g0 + f2g9_19 + f3g8_19 + f4g7_19 + f5g6_19 + f6g5_19 + f7g4_19 + f8g3_19 + f9g2_19;
        long h2 = f0g2 + f1g1_2 + f2g0 + f3g9_38 + f4g8_19 + f5g7_38 + f6g6_19 + f7g5_38 + f8g4_19 + f9g3_38;
        long h3 = f0g3 + f1g2 + f2g1 + f3g0 + f4g9_19 + f5g8_19 + f6g7_19 + f7g6_19 + f8g5_19 + f9g4_19;
        long h4 = f0g4 + f1g3_2 + f2g2 + f3g1_2 + f4g0 + f5g9_38 + f6g8_19 + f7g7_38 + f8g6_19 + f9g5_38;
        long h5 = f0g5 + f1g4 + f2g3 + f3g2 + f4g1 + f5g0 + f6g9_19 + f7g8_19 + f8g7_19 + f9g6_19;
        long h6 = f0g6 + f1g5_2 + f2g4 + f3g3_2 + f4g2 + f5g1_2 + f6g0 + f7g9_38 + f8g8_19 + f9g7_38;
        long h7 = f0g7 + f1g6 + f2g5 + f3g4 + f4g3 + f5g2 + f6g1 + f7g0 + f8g9_19 + f9g8_19;
        long h8 = f0g8 + f1g7_2 + f2g6 + f3g5_2 + f4g4 + f5g3_2 + f6g2 + f7g1_2 + f8g0 + f9g9_38;
        long h9 = f0g9 + f1g8 + f2g7 + f3g6 + f4g5 + f5g4 + f6g3 + f7g2 + f8g1 + f9g0;
        long carry0 = h0 + 33554432L >> 26;
        h1 += carry0;
        h0 -= carry0 << 26;
        long carry4 = h4 + 33554432L >> 26;
        h5 += carry4;
        h4 -= carry4 << 26;
        long carry1 = h1 + 16777216L >> 25;
        h2 += carry1;
        h1 -= carry1 << 25;
        long carry5 = h5 + 16777216L >> 25;
        h6 += carry5;
        h5 -= carry5 << 25;
        long carry2 = h2 + 33554432L >> 26;
        h3 += carry2;
        h2 -= carry2 << 26;
        long carry6 = h6 + 33554432L >> 26;
        h7 += carry6;
        h6 -= carry6 << 26;
        long carry3 = h3 + 16777216L >> 25;
        h4 += carry3;
        h3 -= carry3 << 25;
        long carry7 = h7 + 16777216L >> 25;
        h8 += carry7;
        h7 -= carry7 << 25;
        carry4 = h4 + 33554432L >> 26;
        h5 += carry4;
        h4 -= carry4 << 26;
        long carry8 = h8 + 33554432L >> 26;
        h9 += carry8;
        h8 -= carry8 << 26;
        long carry9 = h9 + 16777216L >> 25;
        h0 += carry9 * 19L;
        h9 -= carry9 << 25;
        carry0 = h0 + 33554432L >> 26;
        h1 += carry0;
        h0 -= carry0 << 26;
        h[0] = (int)h0;
        h[1] = (int)h1;
        h[2] = (int)h2;
        h[3] = (int)h3;
        h[4] = (int)h4;
        h[5] = (int)h5;
        h[6] = (int)h6;
        h[7] = (int)h7;
        h[8] = (int)h8;
        h[9] = (int)h9;
    }
}

任何想法为什么它被拒绝以及我该如何解决这个问题。


由于单个方法中变量过多而引发此异常。只需将其分为两种方法即可解决问题。这是修复方法:

package org.whispersystems.curve25519.java;

public class fe_mul {

//CONVERT #include "fe.h"
//CONVERT #include "long.h"

/*
h = f * g
Can overlap h with f or g.

Preconditions:
   |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc.
   |g| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc.

Postconditions:
   |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc.
*/

/*
Notes on implementation strategy:

Using schoolbook multiplication.
Karatsuba would save a little in some cost models.

Most multiplications by 2 and 19 are 32-bit precomputations;
cheaper than 64-bit postcomputations.

There is one remaining multiplication by 19 in the carry chain;
one *19 precomputation can be merged into this,
but the resulting data flow is considerably less clean.

There are 12 carries below.
10 of them are 2-way parallelizable and vectorizable.
Can get away with 11 carries, but then data flow is much deeper.

With tighter constraints on inputs can squeeze carries into int32.
*/

private static long[] fe_mul1(int[] f,int[] g){
  int f0 = f[0];
  int f1 = f[1];
  int f2 = f[2];
  int f3 = f[3];
  int f4 = f[4];
  int f5 = f[5];
  int f6 = f[6];
  int f7 = f[7];
  int f8 = f[8];
  int f9 = f[9];
  int g0 = g[0];
  int g1 = g[1];
  int g2 = g[2];
  int g3 = g[3];
  int g4 = g[4];
  int g5 = g[5];
  int g6 = g[6];
  int g7 = g[7];
  int g8 = g[8];
  int g9 = g[9];
  int g1_19 = 19 * g1; /* 1.959375*2^29 */
  int g2_19 = 19 * g2; /* 1.959375*2^30; still ok */
  int g3_19 = 19 * g3;
  int g4_19 = 19 * g4;
  int g5_19 = 19 * g5;
  int g6_19 = 19 * g6;
  int g7_19 = 19 * g7;
  int g8_19 = 19 * g8;
  int g9_19 = 19 * g9;
  int f1_2 = 2 * f1;
  int f3_2 = 2 * f3;
  int f5_2 = 2 * f5;
  int f7_2 = 2 * f7;
  int f9_2 = 2 * f9;
  long f0g0    = f0   * (long) g0;
  long f0g1    = f0   * (long) g1;
  long f0g2    = f0   * (long) g2;
  long f0g3    = f0   * (long) g3;
  long f0g4    = f0   * (long) g4;
  long f0g5    = f0   * (long) g5;
  long f0g6    = f0   * (long) g6;
  long f0g7    = f0   * (long) g7;
  long f0g8    = f0   * (long) g8;
  long f0g9    = f0   * (long) g9;
  long f1g0    = f1   * (long) g0;
  long f1g1_2  = f1_2 * (long) g1;
  long f1g2    = f1   * (long) g2;
  long f1g3_2  = f1_2 * (long) g3;
  long f1g4    = f1   * (long) g4;
  long f1g5_2  = f1_2 * (long) g5;
  long f1g6    = f1   * (long) g6;
  long f1g7_2  = f1_2 * (long) g7;
  long f1g8    = f1   * (long) g8;
  long f1g9_38 = f1_2 * (long) g9_19;
  long f2g0    = f2   * (long) g0;
  long f2g1    = f2   * (long) g1;
  long f2g2    = f2   * (long) g2;
  long f2g3    = f2   * (long) g3;
  long f2g4    = f2   * (long) g4;
  long f2g5    = f2   * (long) g5;
  long f2g6    = f2   * (long) g6;
  long f2g7    = f2   * (long) g7;
  long f2g8_19 = f2   * (long) g8_19;
  long f2g9_19 = f2   * (long) g9_19;
  long f3g0    = f3   * (long) g0;
  long f3g1_2  = f3_2 * (long) g1;
  long f3g2    = f3   * (long) g2;
  long f3g3_2  = f3_2 * (long) g3;
  long f3g4    = f3   * (long) g4;
  long f3g5_2  = f3_2 * (long) g5;
  long f3g6    = f3   * (long) g6;
  long f3g7_38 = f3_2 * (long) g7_19;
  long f3g8_19 = f3   * (long) g8_19;
  long f3g9_38 = f3_2 * (long) g9_19;
  long f4g0    = f4   * (long) g0;
  long f4g1    = f4   * (long) g1;
  long f4g2    = f4   * (long) g2;
  long f4g3    = f4   * (long) g3;
  long f4g4    = f4   * (long) g4;
  long f4g5    = f4   * (long) g5;
  long f4g6_19 = f4   * (long) g6_19;
  long f4g7_19 = f4   * (long) g7_19;
  long f4g8_19 = f4   * (long) g8_19;
  long f4g9_19 = f4   * (long) g9_19;
  long f5g0    = f5   * (long) g0;
  long f5g1_2  = f5_2 * (long) g1;
  long f5g2    = f5   * (long) g2;
  long f5g3_2  = f5_2 * (long) g3;
  long f5g4    = f5   * (long) g4;
  long f5g5_38 = f5_2 * (long) g5_19;
  long f5g6_19 = f5   * (long) g6_19;
  long f5g7_38 = f5_2 * (long) g7_19;
  long f5g8_19 = f5   * (long) g8_19;
  long f5g9_38 = f5_2 * (long) g9_19;
  long f6g0    = f6   * (long) g0;
  long f6g1    = f6   * (long) g1;
  long f6g2    = f6   * (long) g2;
  long f6g3    = f6   * (long) g3;
  long f6g4_19 = f6   * (long) g4_19;
  long f6g5_19 = f6   * (long) g5_19;
  long f6g6_19 = f6   * (long) g6_19;
  long f6g7_19 = f6   * (long) g7_19;
  long f6g8_19 = f6   * (long) g8_19;
  long f6g9_19 = f6   * (long) g9_19;
  long f7g0    = f7   * (long) g0;
  long f7g1_2  = f7_2 * (long) g1;
  long f7g2    = f7   * (long) g2;
  long f7g3_38 = f7_2 * (long) g3_19;
  long f7g4_19 = f7   * (long) g4_19;
  long f7g5_38 = f7_2 * (long) g5_19;
  long f7g6_19 = f7   * (long) g6_19;
  long f7g7_38 = f7_2 * (long) g7_19;
  long f7g8_19 = f7   * (long) g8_19;
  long f7g9_38 = f7_2 * (long) g9_19;
  long f8g0    = f8   * (long) g0;
  long f8g1    = f8   * (long) g1;
  long f8g2_19 = f8   * (long) g2_19;
  long f8g3_19 = f8   * (long) g3_19;
  long f8g4_19 = f8   * (long) g4_19;
  long f8g5_19 = f8   * (long) g5_19;
  long f8g6_19 = f8   * (long) g6_19;
  long f8g7_19 = f8   * (long) g7_19;
  long f8g8_19 = f8   * (long) g8_19;
  long f8g9_19 = f8   * (long) g9_19;
  long f9g0    = f9   * (long) g0;
  long f9g1_38 = f9_2 * (long) g1_19;
  long f9g2_19 = f9   * (long) g2_19;
  long f9g3_38 = f9_2 * (long) g3_19;
  long f9g4_19 = f9   * (long) g4_19;
  long f9g5_38 = f9_2 * (long) g5_19;
  long f9g6_19 = f9   * (long) g6_19;
  long f9g7_38 = f9_2 * (long) g7_19;
  long f9g8_19 = f9   * (long) g8_19;
  long f9g9_38 = f9_2 * (long) g9_19;
  long h[] = new long[10];
  h[0] = f0g0+f1g9_38+f2g8_19+f3g7_38+f4g6_19+f5g5_38+f6g4_19+f7g3_38+f8g2_19+f9g1_38;
  h[1] = f0g1+f1g0   +f2g9_19+f3g8_19+f4g7_19+f5g6_19+f6g5_19+f7g4_19+f8g3_19+f9g2_19;
  h[2] = f0g2+f1g1_2 +f2g0   +f3g9_38+f4g8_19+f5g7_38+f6g6_19+f7g5_38+f8g4_19+f9g3_38;
  h[3] = f0g3+f1g2   +f2g1   +f3g0   +f4g9_19+f5g8_19+f6g7_19+f7g6_19+f8g5_19+f9g4_19;
  h[4] = f0g4+f1g3_2 +f2g2   +f3g1_2 +f4g0   +f5g9_38+f6g8_19+f7g7_38+f8g6_19+f9g5_38;
  h[5] = f0g5+f1g4   +f2g3   +f3g2   +f4g1   +f5g0   +f6g9_19+f7g8_19+f8g7_19+f9g6_19;
  h[6] = f0g6+f1g5_2 +f2g4   +f3g3_2 +f4g2   +f5g1_2 +f6g0   +f7g9_38+f8g8_19+f9g7_38;
  h[7] = f0g7+f1g6   +f2g5   +f3g4   +f4g3   +f5g2   +f6g1   +f7g0   +f8g9_19+f9g8_19;
  h[8] = f0g8+f1g7_2 +f2g6   +f3g5_2 +f4g4   +f5g3_2 +f6g2   +f7g1_2 +f8g0   +f9g9_38;
  h[9] = f0g9+f1g8   +f2g7   +f3g6   +f4g5   +f5g4   +f6g3   +f7g2   +f8g1   +f9g0   ;

  return h;
}

public static void fe_mul(int[] h,int[] f,int[] g)
{

  long hr[] = fe_mul1(f, g);

  long carry0;
  long carry1;
  long carry2;
  long carry3;
  long carry4;
  long carry5;
  long carry6;
  long carry7;
  long carry8;
  long carry9;

  /*
  |h0| <= (1.65*1.65*2^52*(1+19+19+19+19)+1.65*1.65*2^50*(38+38+38+38+38))
    i.e. |h0| <= 1.4*2^60; narrower ranges for h2, h4, h6, h8
  |h1| <= (1.65*1.65*2^51*(1+1+19+19+19+19+19+19+19+19))
    i.e. |h1| <= 1.7*2^59; narrower ranges for h3, h5, h7, h9
  */

  carry0 = (hr[0] + (long) (1<<25)) >> 26; hr[1] += carry0; hr[0] -= carry0 << 26;
  carry4 = (hr[4] + (long) (1<<25)) >> 26; hr[5] += carry4; hr[4] -= carry4 << 26;
  /* |h0| <= 2^25 */
  /* |h4| <= 2^25 */
  /* |h1| <= 1.71*2^59 */
  /* |h5| <= 1.71*2^59 */

  carry1 = (hr[1] + (long) (1<<24)) >> 25; hr[2] += carry1; hr[1] -= carry1 << 25;
  carry5 = (hr[5] + (long) (1<<24)) >> 25; hr[6] += carry5; hr[5] -= carry5 << 25;
  /* |h1| <= 2^24; from now on fits into int32 */
  /* |h5| <= 2^24; from now on fits into int32 */
  /* |h2| <= 1.41*2^60 */
  /* |h6| <= 1.41*2^60 */

  carry2 = (hr[2] + (long) (1<<25)) >> 26; hr[3] += carry2; hr[2] -= carry2 << 26;
  carry6 = (hr[6] + (long) (1<<25)) >> 26; hr[7] += carry6; hr[6] -= carry6 << 26;
  /* |h2| <= 2^25; from now on fits into int32 unchanged */
  /* |h6| <= 2^25; from now on fits into int32 unchanged */
  /* |h3| <= 1.71*2^59 */
  /* |h7| <= 1.71*2^59 */

  carry3 = (hr[3] + (long) (1<<24)) >> 25; hr[4] += carry3; hr[3] -= carry3 << 25;
  carry7 = (hr[7] + (long) (1<<24)) >> 25; hr[8] += carry7; hr[7] -= carry7 << 25;
  /* |h3| <= 2^24; from now on fits into int32 unchanged */
  /* |h7| <= 2^24; from now on fits into int32 unchanged */
  /* |h4| <= 1.72*2^34 */
  /* |h8| <= 1.41*2^60 */

  carry4 = (hr[4] + (long) (1<<25)) >> 26; hr[5] += carry4; hr[4] -= carry4 << 26;
  carry8 = (hr[8] + (long) (1<<25)) >> 26; hr[9] += carry8; hr[8] -= carry8 << 26;
  /* |h4| <= 2^25; from now on fits into int32 unchanged */
  /* |h8| <= 2^25; from now on fits into int32 unchanged */
  /* |h5| <= 1.01*2^24 */
  /* |h9| <= 1.71*2^59 */

  carry9 = (hr[9] + (long) (1<<24)) >> 25; hr[0] += carry9 * 19; hr[9] -= carry9 << 25;
  /* |h9| <= 2^24; from now on fits into int32 unchanged */
  /* |h0| <= 1.1*2^39 */

  carry0 = (hr[0] + (long) (1<<25)) >> 26; hr[1] += carry0; hr[0] -= carry0 << 26;
  /* |h0| <= 2^25; from now on fits into int32 unchanged */
  /* |h1| <= 1.01*2^24 */

  h[0] = (int)hr[0];
  h[1] = (int)hr[1];
  h[2] = (int)hr[2];
  h[3] = (int)hr[3];
  h[4] = (int)hr[4];
  h[5] = (int)hr[5];
  h[6] = (int)hr[6];
  h[7] = (int)hr[7];
  h[8] = (int)hr[8];
  h[9] = (int)hr[9];
}


}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

拒绝类,因为它未通过编译时验证 的相关文章

  • 从直方图计算平均值和百分位数?

    我编写了一个计时器 可以测量任何多线程应用程序中特定代码的性能 在下面的计时器中 它还会在地图中填充花费了 x 毫秒的调用次数 我将使用这张图作为我的直方图的一部分来进行进一步的分析 例如调用花费了这么多毫秒的百分比等等 public st
  • 从休眠乐观锁定异常中恢复

    我有一个这样的方法 Transactional propagation Propagation REQUIRES NEW public void doSomeWork Entity entity dao loadEntity do some
  • Android 中的 OpenGL 缩小

    我正在使用 3D 对象并渲染它并通过扩展 GLSurfaceView 实现渲染器来显示它 问题是如何通过捏合和捏合进行缩小 下面是我的班级 package com example objLoader import java nio Byte
  • 移动设备上的 TensorFlow(Android、iOS、Windows Phone)

    我目前正在寻找不同的深度学习框架 特别是用于训练和部署卷积神经网络 要求是 它可以在带有 GPU 的普通 PC 上进行训练 但训练后的模型必须部署在三个主要的移动操作系统上 即 Android iOS 和 Windows Phone Ten
  • 安卓。 CalendarView...一次仅显示一个月的日历

    我正在使用 CalendarView 其中我想一次仅查看一个月的日历并滚动查看下个月 但 CalendarView 一次显示所有月份 下面是我的代码
  • Java:如何确定文件所在的驱动器类型?

    Java 是否有一种独立于平台的方法来检测文件所在的驱动器类型 基本上我有兴趣区分 硬盘 可移动驱动器 如 USB 记忆棒 和网络共享 JNI JNA 解决方案不会有帮助 可以假设 Java 7 您可以使用 Java 执行 cmd fsut
  • 如何从日期中删除毫秒、秒、分钟和小时[重复]

    这个问题在这里已经有答案了 我遇到了一个问题 我想比较两个日期 然而 我只想比较年 月 日 这就是我能想到的 private Date trim Date date Calendar calendar Calendar getInstanc
  • 我们如何测试包私有类?

    我正在看书Effective Java in Item 13 Minimize the accessibility of classes and members 它提到 为了方便测试 您可能想让类 接口或成员更易于访问 这在某种程度上是好的
  • 寻找局部最小值

    下面的代码正确地找到了数组的局部最大值 但未能找到局部最小值 我已经进行了网络搜索 以找到找到最小值的最佳方法 并且根据这些搜索 我认为我正在使用下面的正确方法 但是 在几天的时间里多次检查每一行之后 下面的代码中有一些我仍然没有看到的错误
  • 无法使用 findViewById() 找到视图

    我找不到TextView通过致电findViewById 即使 ID 确实存在 OtherActivity public class OtherActivity extends Activity Override protected voi
  • Android:GestureDetector 无法与选项卡(TabActivity、Tabwidget)一起工作(gestureDetector.onTouchEvent(event) 始终为 false)

    我已经用不同的子活动实现了 TabActivity intent new Intent setClass this MyChildTabActiviy class Initialize a TabSpec for each tab and
  • 无需登录即可直接从 Alfresco 访问文件/内容

    我的场景是这样的 我有一个使用 ALFRESCO CMS 来显示文件或图像的 Web 应用程序 我正在做的是在 Java servlet 中使用用户名和密码登录 alfresco 并且我可以获得该登录的票证 但我无法使用该票证直接从浏览器访
  • 我可以限制分布式应用程序发出的请求吗?

    我的应用程序发出 Web 服务请求 提供商处理的请求有最大速率 因此我需要限制它们 当应用程序在单个服务器上运行时 我曾经在应用程序级别执行此操作 一个对象跟踪到目前为止已发出的请求数量 并在当前请求超出允许的最大负载时等待 现在 我们正在
  • fs-extra:源和目标不能相同。 (科尔多瓦)

    我在使用 cordova 构建时遇到错误 Error Source and destination must not be the same 构建系统 Ionic ionic cli 4 10 1 ionic framework ionic
  • ECDH使用Android KeyStore生成私钥

    我正在尝试使用 Android KeyStore Provider 生成的私有文件在 Android 中实现 ECDH public byte ecdh PublicKey otherPubKey throws Exception try
  • 如何更改操作栏背景和文本颜色

    我正在使用本教程中的导航抽屉 http www androidhive info 2013 11 android sliding menu using navigation drawer http www androidhive info
  • 使用 JFreeChart 为两个系列设置不同的 y 轴

    我正在使用 JFreeChart 使用折线图绘制两个数据系列 XYSeries 复杂的因素是 其中一个数据系列的 y 值通常远高于第二个数据系列的 y 值 假设第一个系列的 y 值约为数百万数量级 而第二个数据系列的 y 值约为数百万数量级
  • 如何使用通配符模拟泛型方法的行为

    我正在使用 EasyMock 3 2 我想基于 Spring Security 为我的部分安全系统编写一个测试 我想嘲笑Authentication http docs spring io autorepo docs spring secu
  • 从文件路径显示图像视图?

    我需要仅使用文件名而不是资源 ID 来显示图像 ImageView imgView new ImageView this imgView setBackgroundResource R drawable img1 我在可绘制文件夹中有图像
  • 即使调整大小,如何获得屏幕的精确中间位置

    好的 这个问题有两部分 当我做一个JFrame 并在其上画一些东西 即使我将宽度设置为 400 并使其在一个项目击中它时 当然 允许项目宽度 它会反弹回来 但由于某种原因 它总是偏离屏幕约 10 个像素 有没有办法解决这个问题 或者我只需要

随机推荐

  • 具有多个文本字段输入视图的多个选择器视图 Swift

    我一直在论坛中进行搜索 但没有任何帮助 我在一个视图控制器中使用 4 个文本字段 对于每个文本字段 我使用一个单独的 pickerView 作为文本字段 4pickers 的 inputView 当我单击第一个文本字段时 pickerVie
  • 使用 GraalVM 构建本机应用程序时缺少 cl.exe

    我正在尝试使用 GraalVM 和本机映像构建本机应用程序 启动构建过程时发生错误 类路径中似乎缺少 cl exe 正如 GraalVM 网站上提到的 我已经安装了 GRMSDKX EN DVD iso 适用于 Windows 7 和 NE
  • Arrayformula 在谷歌表格中使用 countif 来计算当前行之前的重复项[重复]

    这个问题在这里已经有答案了 我只需要计算当前行之前的重复项 我需要它位于数组公式中 因为我需要它在添加新行时自动扩展 在 Excel 中 我会使用一个带有类似以下函数的表 COUNTIF A 2 A2 B2 gt 在单元格 C2 中 在单元
  • 使用 AWS CodeBuild 进行 docker 推送失败,退出状态为 1

    我创建了由 CodePipeline 触发的 CodeBuild 项目 并且 docker Push 步骤始终失败 并显示 原因 退出状态 1 错误消息 以下是我的构建日志 将我的组织 ID 替换为 Container 2021 06 12
  • 如何从 GMSMapView 中删除 GMSPolygon

    是否有任何方法可以从 GMSMapView 中删除 GMSPolygons 它似乎不存在包含它们的 GMSMapView 属性 如 GMSPlolyLines 我应该清除地图并再次渲染吗 thanks 当您创建GMSPolygon你设置它的
  • 如何知道窗口是否被“x”按钮关闭?

    有谁知道如何找出wpf窗口是否被 x 按钮关闭 最简单的方法 在我看来 是存储一个布尔值 指示用户是否通过其他方法关闭了表单 然后在 OnClosing 事件中 检查布尔值是否为 false 表示单击了 x 按钮 唯一的问题是您自己设置了布
  • Rails 和 Socket.io (node.js)

    我打算使用 Rails 应用程序来提供由 node js 服务器和 Socket io 处理的实时数据 在 Socket io 网站上 它说 如果您不会利用 Node JS 来提供服务 您的文件 请确保设置 全球的WEB SOCKET SW
  • 从 gradle 扩展访问配置闭包

    我正在编写一个插件 其中执行如下操作 project extensions create myExtension new MyExtension project where MyExtension是定义我的新功能的类 Now in grad
  • 在 RDF 中对数据库 NULL 的等价物进行建模

    我想知道是否有一种标准或普遍接受的方法来表示 RDF 数据数据库中使用的 NULL 的等效项 更具体地说 我对区分以下情况的值感兴趣o财产的p p是谓词 oRDF 三元组的对象 其值为不适用 即财产p不存在或在上下文中没有意义 其值为unk
  • 在 C 中读取 .csv 文件

    我有一个 csv 文件 lp imie nazwisko ulica numer kod miejscowosc telefon email data ur 1 Jan Kowalski ul Nowa 1a 11 234 Budry 12
  • 内存屏障的传递性/累积性属性是如何在微架构上实现的?

    我一直在阅读有关 x86 内存模型的工作原理 x86 上屏障指令的重要性以及与其他架构 例如 ARMv8 的比较 在 x86 和 ARMv8 架构中 似乎 没有双关语 内存模型尊重传递性 累积性 即如果 CPU 1 看到 CPU0 的存储
  • 使用 llvm 后端编译 haskell .ll 文件时出错

    我想使用 ghc 前端和 llvm 后端编译 haskell 我的 haskell hello hs 文件中有以下代码 main putStrLn Hello World 我使用以下命令用 ghc 编译 hello hs ghc fllvm
  • 长轮询,“全局”按钮,向所有人广播?

    我正在尝试实现一个全局按钮计数器 该计数器会在任何 不同用户单击它时更新 因此 我们的想法是 如果一个人单击该按钮 我会在页面实例上看到计数器更新 我目前的长轮询技术正在工作 或者我认为是这样 但经过审查 我相信我在向所有浏览器 广播 更新
  • 使用 Neo4j 批量插入

    我正在从表中导入 23 亿个关系 导入速度不是很快 每小时 500 万个 需要 20 天才能完成迁移 我听说过 neo4j 批量插入和批量插入实用程序 https github com jexp batch import 该实用程序通过从
  • 如何根据 powershell 中对象的两个属性来选择唯一的对象?

    我有一个具有 6 个属性的对象数组 看起来像这样 csvData CURRENT DATE AND TIME 07 10 2015 08 17 17 CST USER NAME userName COMPUTER NAME computer
  • 使用反射获取 linq 查询中的选择字段

    我正在使用 Linq 进行查询 并且希望能够使用反射在 选择 部分中获取我想要返回的属性列表 我已尝试以下方法但无济于事 string paramList new AppId Name var query from entity in ct
  • 自定义表格视图背景的 UITableViewCell 颜色问题

    我有一个 UITableView 其自定义背景图像设置如下 self tableView backgroundColor UIColor colorWithPatternImage UIImage imageNamed mybg png 背
  • DataInputStream/DataOutputStream类与InputStream/OutputStream类之间的区别

    每当我使用HttpConnection班级于Java ME Android or in BlackBerry 我用DataInputStream DataOutputStream用于通过远程服务器读取和写入数据的类 然而还有其他类 例如In
  • Get-EventLog - 轻松按“今天”过滤?

    我想快速检查今天发生的事件 即 从午夜开始的任何事件 Powershell 中是否有 今天 别名 内置功能可以帮助解决此问题 我目前正在做这样的事情 get eventlog system source disk after datetim
  • 拒绝类,因为它未通过编译时验证

    我正在尝试将来自 openwhispersystems 的 curve25519 java 集成到我的 Android 应用程序中 并使用 API 23 Marshmallow 进行编译 使用非本机代码时 我收到此运行时异常 java la