int evp_sign_internal(EVP_PKEY* evp, EVP_MD_CTX* ctx, enum EVP_DIGEST_TYPE type, const unsigned char* digest, unsigned int digest_length, string* s) { const EVP_MD* md = NULL; md = get_EVP_MD(type); if (md == NULL) { return 0; } EVP_MD_CTX_init(ctx); if (!EVP_SignInit(ctx, md)) { return 0; } if (!EVP_SignUpdate(ctx, digest, digest_length)) { return 0; } if (!EVP_SignFinal(ctx, string_base(s), &string_size(s), evp)) { return 0; } return 1; }
string_base substr ( euint pos = 0, euint len = npos ) const { if ( pos >= m_size ) { return string_base(); } if ( pos == 0 && len == npos ) { return string_base ( *this ); } if ( len + pos > m_size ) { len = m_size - pos; } C *str = ( C * ) Malloc ( (len + 1) * sizeof(C) ); memcpy ( str, &m_str[pos], len * sizeof(C) ); str[len] = 0; string_base ret; Mfree ( ret.m_str ); ret.m_str = str; ret.m_size = len; ret.m_hash = _hash ( str ); return ret; }
int evp_verify_internal(EVP_PKEY* evp, EVP_MD_CTX* ctx, enum EVP_DIGEST_TYPE type, const unsigned char* digest, unsigned int digest_length, string* s) { const EVP_MD* md = NULL; int r = 0; md = get_EVP_MD(type); if (md == NULL) { fprintf(stderr, "evp_verify_internal: no message digest\n"); return EVP_ERROR; } EVP_MD_CTX_init(ctx); if (!EVP_VerifyInit(ctx, md)) { fprintf(stderr, "evp_verify_iternal: EVP_VerifyInit failed\n"); return EVP_ERROR; } if (!EVP_VerifyUpdate(ctx, digest, digest_length)) { fprintf(stderr, "evp_verify_internal: EVP_VerifyUpdate failed\n"); return EVP_ERROR; } r = EVP_VerifyFinal(ctx, string_base(s), string_size(s), evp); switch (r) { case -1: fprintf(stderr, "evp_verify: EVP_VerifyFinal failed\n"); return EVP_ERROR; case 0: return EVP_FAILURE; default: return EVP_SUCCESS; } }