微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从 Ballerina 调用 Java 的问题

如何解决从 Ballerina 调用 Java 的问题

以下用于芭蕾舞女演员 Java 互操作的代码无法生成数据签名。 你能找出它在下面一行失败的原因吗?

代码使用 Ballerina slalpha5 运行。 Java 版本:openjdk 版本“15.0.1” 2020-10-20

我已经检查了 java 类和方法的签名,对我来说都是正确的。

`var signedDataHandle = check generateSignature(signature);`

    import ballerina/jballerina.java;
    import ballerina/jballerina.java.arrays;
    import ballerina/io;
    
    public function main() returns error? {
    
        var data = "Test data!".toBytes();
        var { encodedPublicKey,encodedPrivateKey } = check generateKeyTestPair();
        var signedData = check signData(data,encodedPrivateKey);
    
        io:println(signedData.length());
    }
    
    function signData(byte[] data,byte[] encodedPrivateKey) returns byte[]|error {
    
        var pkcs8EncodedKeySpec = newPKCS8EncodedKeySpec(check arrays:toHandle(encodedPrivateKey,"byte"));
        var keyFactory = check getKeyFactoryInstance(java:fromString("RSA"));
        var privateKey = check generatePrivateKey(keyFactory,pkcs8EncodedKeySpec);
        var signature = check getSignatureInstance(java:fromString("SHA256withRSA"));
    
        check initDataSigning(signature,privateKey);
        check updateSignatureData(signature,check arrays:toHandle(data,"byte"));
    
        // The line below is failing
        var signedDataHandle = check generateSignature(signature);
        var signedData = <byte[]> check arrays:fromHandle(signedDataHandle,"byte");
    
        return signedData;
    }
    
    function generateKeyTestPair() returns record { byte[] 'encodedPublicKey; byte[] 'encodedPrivateKey; }|error {
    
        var keyPairGenerator = check getKeyPairGeneratorInstance(java:fromString("RSA"));
    
        initializeKeyPairGenerator(keyPairGenerator,1024);
        
        var keyPair = generateKeyPair(keyPairGenerator);
        var privateKey = getPrivateKeyFromKeyPair(keyPair);
        var publicKey = getPublicKeyFromKeyPair(keyPair);
    
        return {
            encodedPublicKey: <byte[]> check arrays:fromHandle(getEncodedPublicKey(publicKey),"byte"),encodedPrivateKey: <byte[]> check arrays:fromHandle(getEncodedPrivateKey(privateKey),"byte")
        };
    }
    
    isolated function getKeyFactoryInstance(handle algorithm) returns handle|error = @java:Method {
        'class: "java.security.KeyFactory",name: "getInstance"
    } external;
    
    isolated function newPKCS8EncodedKeySpec(handle encodedKey) returns handle = @java:Constructor {
        'class: "java.security.spec.PKCS8EncodedKeySpec"
    } external;
    
    isolated function generatePrivateKey(handle receiver,handle keySpec) returns handle|error = @java:Method {
        'class: "java.security.KeyFactory",name: "generatePrivate"
    } external;
    
    isolated function getSignatureInstance(handle algorithm) returns handle|error = @java:Method {
        'class: "java.security.Signature",name: "getInstance",paramTypes: ["java.lang.String"]
    } external;
    
    isolated function initDataSigning(handle receiver,handle privateKey) returns error? = @java:Method {
        'class: "java.security.Signature",name: "initSign",paramTypes: ["java.security.PrivateKey"]
    } external;
    
    isolated function updateSignatureData(handle receiver,handle data) returns error? = @java:Method {
        'class: "java.security.Signature",name: "update",paramTypes: [{ 'class: "byte",dimensions: 1 }]
    } external;
    
    isolated function generateSignature(handle receiver) returns handle|error = @java:Method {
        'class: "java.security.Signature",name: "sign"
    } external;
    
    isolated function getKeyPairGeneratorInstance(handle algorithm) returns handle|error = @java:Method {
        'class: "java.security.KeyPairGenerator",name: "getInstance"
    } external;
    
    isolated function initializeKeyPairGenerator(handle receiver,int keySize) = @java:Method {
        'class: "java.security.KeyPairGenerator",name: "initialize",paramTypes: ["int"]
    } external;
    
    isolated function generateKeyPair(handle receiver) returns handle = @java:Method {
        'class: "java.security.KeyPairGenerator",name: "generateKeyPair"
    } external;
    
    isolated function getPrivateKeyFromKeyPair(handle receiver) returns handle = @java:Method {
        'class: "java.security.KeyPair",name: "getPrivate"
    } external;
    
    isolated function getPublicKeyFromKeyPair(handle receiver) returns handle = @java:Method {
        'class: "java.security.KeyPair",name: "getPublic"
    } external;
    
    
    isolated function getEncodedPrivateKey(handle receiver) returns handle = @java:Method {
        'class: "java.security.Key",name: "getEncoded"
    } external;
    
    isolated function getEncodedPublicKey(handle receiver) returns handle = @java:Method {
        'class: "java.security.PublicKey",name: "getEncoded"
    } external;

解决方法

这看起来像是 Ballerina 中的一个错误。 为解决此问题而创建的问题:https://github.com/ballerina-platform/ballerina-lang/issues/30949

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。