Buenas estimados
Retomando el tema, no logro obtener el resultado pedido
en éstos pasos:
6. Tomar la sección de la firma y obtener un HASH del mismo aplicando el algoritmo SHA256.
7. Encriptar el HASH obtenido utilizando el algoritmo RSA SHA256 con la llave privada.
8. Aplicar a la cadena resultante el algoritmo Base64 para obtener una cadena.
9. Adicionar a la etiqueta de Signature Value la cadena anterior.
He encontrado éste código que es lo que mas se acerca a lo pedido.
- Code: Select all Expand view
#include "FiveWin.ch"
#include "hbssl.ch"
Function Main()
LOCAL ctx,cPrivateKey:= cSignXml:= encrypted:=""
#pragma __cstream|cPrivateKey:=%s
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCuC5IblBnw55fc
3KdSHXmPFP1Id/QXznhCaX4bPMOQBZXdu7WvOlT0cEbfhFiJZVFozvTfZYDOlfCm
MtJY6+kKihJTtQopp5cnzllJW1xtcvHWdGI+8J1fCll6wLK718tMBIQISktS/Z/X
i17mlX7jDslSV+/sKDyGvxHSQwKwbCKvpM9c5pcsV7tsYjP/BcZ/DhaHcy4Pf30n
CSKM+dmjdou+dIE6sFiB2lgVAMC+kQo7R+QN5ZKjGDaS+30f//TjNNJOUPR+tKe+
GPLgqgKivvMDJuOWvuY6KzRJyQAh3erykX/DFXTEcMTN6zUy4eP4A2PanmRFiH5M
VAlgZAHtAgMBAAECggEAF3Qgts2w5zlWSiGD/LlTGbhy31Km1pRwuUZdA4+fLOfL
x8sVUy0xqJT+v/0mLzGzlEObVQVpI62p9cOQfAIib9SmXphda7qVUHxqpMuGe4tL
UqJxYNjs5BNRdozEKTMNxssu/a0BVIgwA4xY+Aq6RB/Iemu2PaU4btINtT9pe9uF
tMYPlsoGtxq7Z7ulxc2szBe66PGuzd7ojKUf8XyjunhEcjuU9z+6//rl6EV4VkgF
Rk1uT6Uyj5vsYsNu7noNyjAp7nhuS4fm1/hJfxR3iRSTIJtUtP7kS5vQk2VipWdO
SnKmPciXVaNVe+S44ZGWYoKBPap77PVUiajXc5t/kQKBgQDXA3YQRGUl5+kPCllQ
l9psavX/4dlLnOWRdIuTeutPRcjlpyEdoeUCVs+ZZtroeriGr6cwFXni0FPCASm9
JNFx8zvg1VjVjXLsLi6+0kvEEd9xVMyQN4Ixap554EjeT1/vxMsdO3moAvS1xyBp
VpAgwdqht3IV5QTFF2X/b40xmQKBgQDPOODkFnG3f9fPOfzJNuv38wElIqnZaqcR
lPZF9jKfjWfhEMJju3FWui73sW1LgrkXFKTftbTb3/i0b/ez9EER7Inu+crG+2WF
XCPYY1wJvEczureRd69Xjx9iICoGSmJk7lpQuBR4S4umdpqnu/TF60YsTEF+PIi5
TvpxLhNvdQKBgQClJhFvGTmfzetjFA3aK2kn0Vg2PKEMxOxHtv7mPomzD+TpEGAN
RKaED23RZAFMg8ZsHUsLUdOW9XEAGKiYkUkWfz9EyFo9XTIiWq6o/xoW9atsfzfI
pfooPr6O2kjeCJWlssBYKbCd7fdMEDDC+CwoHP3zLNZCHvB0+i3r7yDCMQKBgC3q
A2JmWrH24KFozsrioWwh6roIsSucRwJNSDf+Mf9KPJ8QsJGagaVewXNeW8IkZ9Bm
YZWz1Cv3t0p7mJ3F2/kVuQY7UKPAJiFjZgnXEhiSIBClKXFQ3IgBDUoXqFgWeTC1
40sJTnfM/VdX5jKOIdEMrVK5XrWSwhSVHEahl+rVAoGBAIyoP8k6Z8T4pvWjkfCx
GluOFui7HRSW1SrHdZTSI5vfqx8Sj5bcCxVlsw67YcYkWot7t505HHtr/O2a6E2Q
RQEleHzBzbNS+GHDzR46/fa1YgDCRBDT5GzV/0mbOIQOv6zNwBaM8JvlJakYbjpe
wTTPUjAZesdQLrx4AhvTAD9D
-----END PRIVATE KEY-----
#pragma __endtext
*
#pragma __cstream|cSignXml:=%s
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"></CanonicalizationMethod>
<SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"></SignatureMethod>
<Reference URI="">
<Transforms>
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"></Transform>
<Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"></Transform>
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"></DigestMethod>
<DigestValue>D4SjxwIFg+bOkVaVXo3K+e0C4bfTYrhXHfojtnvjLuo=</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue></SignatureValue>
<KeyInfo>
<X509Data>
<X509Certificate></X509Certificate>
</X509Data>
</KeyInfo>
</Signature>
#pragma __endtext
cNewXml:="D:\Sistemas\NewFact.xml"
//6. Tomar la sección de la firma y obtener un HASH del mismo aplicando el algoritmo SHA256.
cHash256:=HB_SHA256(cSignXml)
SSL_init()
OpenSSL_add_all_ciphers()
ctx := hb_EVP_CIPHER_ctx_create()
EVP_CIPHER_CTX_init( ctx )
//7. Encriptar el HASH obtenido utilizando el algoritmo RSA SHA256 con la llave privada.
EVP_EncryptInit( ctx, HB_EVP_MD_SHA256, cPrivateKey )
EVP_EncryptUpdate( ctx, @encrypted, cHash256 )
//8.Aplicar a la cadena resultante el algoritmo Base64 para obtener una cadena.
cRsaSha256:=HB_Base64Encode(encrypted)
?cRsaSha256
Hb_MemoWrit(cNewXml,cRsaSha256) //Guarda el resultado
EVP_cleanup()
Return Nil
//Devuelve éste resultado
n/i+BrTtSV4glcaIxrlGDMNaoUmIH5sZjeKDRM4e9L7VVxBJQahKhA1C6TtFkPwS7Dhz/hqo/izhadVpCLRcpw== //de 88 caracteres y deben ser 344
//El resultado debe ser similar a éste
O7mRo9J7olCzanqMpuUX9vyUMNWcbg7c8LOcUs2Uko48MVtXX1FU2bvSSWdR22u4ptqD8W2pRLIo
s8vtMcsUDWjaH8AY859TDDcN6SYe3g/H9xJIBG6nC/QmBTAarIi89Uc585zhsIOcnhVn5isB/Bmu
T/NLFOaByAY5GYcH0S59iAIttyBf3MetSNO8YUGziaGLQuKprs5jeOMNFdbnMiWSEStjAbmjDmTG
HFiknuW89f5LeRxfBCfRkzUUGk2KO1ILChJGCVwx0G5kS39JCrm+AJNG+EBC7lwulPP427UcNXOJ
X55wF6U1obMHcXlllNGe8/4oboaGUJSHJKj5Rg==
Quizás alguien ya lo haya logrado.
He encontrado éste código en Java y hay que convertirlo
- Code: Select all Expand view
import java.security.KeyFactory;
import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Base64;
public class SHA256RSA {
public static void main(String[] args) throws Exception {
String input = "sample input";
// Not a real private key! Replace with your private key!
String strPk = "-----BEGIN PRIVATE KEY-----\nMIIEvwIBADANBgkqhkiG9"
+ "w0BAQEFAASCBKkwggSlAgEAAoIBAQDJUGqaRB11KjxQ\nKHDeG"
+ "........................................................"
+ "Ldt0hAPNl4QKYWCfJm\nNf7Afqaa/RZq0+y/36v83NGENQ==\n"
+ "-----END PRIVATE KEY-----\n";
String base64Signature = signSHA256RSA(input,strPk);
System.out.println("Signature="+base64Signature);
}
// Create base64 encoded signature using SHA256/RSA.
private static String signSHA256RSA(String input, String strPk) throws Exception {
// Remove markers and new line characters in private key
String realPK = strPk.replaceAll("-----END PRIVATE KEY-----", "")
.replaceAll("-----BEGIN PRIVATE KEY-----", "")
.replaceAll("\n", "");
byte[] b1 = Base64.getDecoder().decode(realPK);
PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(b1);
KeyFactory kf = KeyFactory.getInstance("RSA");
Signature privateSignature = Signature.getInstance("SHA256withRSA");
privateSignature.initSign(kf.generatePrivate(spec));
privateSignature.update(input.getBytes("UTF-8"));
byte[] s = privateSignature.sign();
return Base64.getEncoder().encodeToString(s);
}
}
Gracias por la ayuda