std::string toHexString(bool number) { return (number ? toHexString("1") : toHexString("0")); }
int signMessageWithPem(char *message, char *pem, char **signature) { unsigned int meslen = strlen(message); unsigned char *messagebytes = calloc(meslen, sizeof(unsigned char)); int derSigLen = 0; int i = 0; memcpy(messagebytes, message, meslen); EC_KEY *key = NULL; BIO *in = NULL; unsigned char *buffer = NULL; char *sha256ofMsg = calloc(SHA256_HEX_STRING, sizeof(char)); unsigned char *outBytesOfsha256ofMsg = calloc(SHA256_STRING, sizeof(unsigned char)); digestOfBytes(messagebytes, &sha256ofMsg, "sha256", meslen); sha256ofMsg[64] = '\0'; createDataWithHexString(sha256ofMsg, &outBytesOfsha256ofMsg); in = BIO_new(BIO_s_mem()); BIO_puts(in, pem); key = PEM_read_bio_ECPrivateKey(in, NULL, NULL, NULL); if(key == NULL) { return ERROR; } while(derSigLen < 70 && i < 10) { i++; ECDSA_SIG *sig = ECDSA_do_sign((const unsigned char*)outBytesOfsha256ofMsg, SHA256_DIGEST_LENGTH, key); int verify = ECDSA_do_verify((const unsigned char*)outBytesOfsha256ofMsg, SHA256_DIGEST_LENGTH, sig, key); if(verify != 1) { return ERROR; } int buflen = ECDSA_size(key); buffer = OPENSSL_malloc(buflen); derSigLen = i2d_ECDSA_SIG(sig, &buffer); } if(i == 10) return ERROR; char *hexData = calloc(derSigLen, sizeof(char)); memcpy(hexData, buffer-derSigLen, derSigLen); char *hexString = calloc(derSigLen*2+1, sizeof(char)); toHexString(hexData, derSigLen, &hexString); hexString[derSigLen * 2] = '\0'; memcpy(*signature, hexString, (derSigLen*2)+ 1); EC_KEY_free(key); BIO_free_all(in); free(messagebytes); free(sha256ofMsg); free(outBytesOfsha256ofMsg); free(hexData); free(hexString); return NOERROR; }