static VALUE ossl_digest_copy(VALUE self, VALUE other) { EVP_MD_CTX *ctx1, *ctx2; rb_check_frozen(self); if (self == other) return self; GetDigest(self, ctx1); SafeGetDigest(other, ctx2); if (!EVP_MD_CTX_copy(ctx1, ctx2)) { ossl_raise(eDigestError, NULL); } return self; }
void GRecord::WriteTo(TextWriter &writer) const { char digest[DIGEST_LENGTH + 1]; GetDigest(digest); static constexpr size_t chars_per_line = 16; static_assert(DIGEST_LENGTH % chars_per_line == 0, "wrong digest length"); for (const char *i = digest, *end = digest + DIGEST_LENGTH; i != end; i += chars_per_line) { writer.Write('G'); writer.Write(i, chars_per_line); writer.NewLine(); } }
/* * call-seq: * Digest.new(string) -> digest * */ static VALUE ossl_digest_initialize(VALUE self, SEL sel, int argc, VALUE *argv) { EVP_MD_CTX *ctx; const EVP_MD *md; VALUE type, data; rb_scan_args(argc, argv, "11", &type, &data); md = GetDigestPtr(type); if (!NIL_P(data)) StringValue(data); GetDigest(self, ctx); EVP_DigestInit_ex(ctx, md, NULL); if (!NIL_P(data)) return ossl_digest_update(self, 0, data); return self; }
/* * call-seq: * Digest.new(string [, data]) -> Digest * * Creates a Digest instance based on +string+, which is either the ln * (long name) or sn (short name) of a supported digest algorithm. * If +data+ (a +String+) is given, it is used as the initial input to the * Digest instance, i.e. * digest = OpenSSL::Digest.new('sha256', 'digestdata') * is equal to * digest = OpenSSL::Digest.new('sha256') * digest.update('digestdata') * * === Example * digest = OpenSSL::Digest.new('sha1') * * */ static VALUE ossl_digest_initialize(int argc, VALUE *argv, VALUE self) { EVP_MD_CTX *ctx; const EVP_MD *md; VALUE type, data; rb_scan_args(argc, argv, "11", &type, &data); md = GetDigestPtr(type); if (!NIL_P(data)) StringValue(data); GetDigest(self, ctx); if (EVP_DigestInit_ex(ctx, md, NULL) != 1) { ossl_raise(eDigestError, "Digest initialization failed."); } if (!NIL_P(data)) return ossl_digest_update(self, data); return self; }
bool GRecord::VerifyGRecordInFile(const TCHAR *path) { // assumes FileName member is set // Load File into Buffer (assume name is already set) LoadFileToBuffer(path); // load Existing Digest "old" char old_g_record[DIGEST_LENGTH + 1]; if (!ReadGRecordFromFile(path, old_g_record, ARRAY_SIZE(old_g_record))) return false; // recalculate digest from buffer FinalizeBuffer(); char new_g_record[DIGEST_LENGTH + 1]; GetDigest(new_g_record); return strcmp(old_g_record, new_g_record) == 0; }
bool GRecord::VerifyGRecordInFile() { // assumes FileName member is set // Load File into Buffer (assume name is already set) LoadFileToBuffer(); // load Existing Digest "old" char old_g_record[BUFF_LEN]; if (!ReadGRecordFromFile(old_g_record, BUFF_LEN)) return false; // recalculate digest from buffer FinalizeBuffer(); char new_g_record[BUFF_LEN]; GetDigest(new_g_record); return strcmp(old_g_record, new_g_record) == 0; }
/* * call-seq: * digest.finish -> aString * */ static VALUE ossl_digest_finish(int argc, VALUE *argv, VALUE self) { EVP_MD_CTX *ctx; VALUE str; rb_scan_args(argc, argv, "01", &str); GetDigest(self, ctx); if (NIL_P(str)) { str = rb_str_new(NULL, EVP_MD_CTX_size(ctx)); } else { StringValue(str); rb_str_resize(str, EVP_MD_CTX_size(ctx)); } EVP_DigestFinal_ex(ctx, (unsigned char *)RSTRING_PTR(str), NULL); return str; }
/* * call-seq: * digest.finish -> aString * */ static VALUE ossl_digest_finish(VALUE self, SEL sel, int argc, VALUE *argv) { EVP_MD_CTX *ctx; VALUE str; rb_scan_args(argc, argv, "01", &str); GetDigest(self, ctx); if (NIL_P(str)) { str = rb_bstr_new(); } else { StringValue(str); str = rb_str_bstr(str); } rb_bstr_resize(str, EVP_MD_CTX_size(ctx)); EVP_DigestFinal_ex(ctx, rb_bstr_bytes(str), NULL); return str; }
/* * call-seq: * Digest.new(string) -> digest * */ static VALUE ossl_digest_initialize(int argc, VALUE *argv, VALUE self) { EVP_MD_CTX *ctx; const EVP_MD *md; char *name; VALUE type, data; rb_scan_args(argc, argv, "11", &type, &data); StringValue(type); if (!NIL_P(data)) StringValue(data); name = StringValuePtr(type); md = EVP_get_digestbyname(name); if (!md) { ossl_raise(rb_eRuntimeError, "Unsupported digest algorithm (%s).", name); } GetDigest(self, ctx); EVP_DigestInit_ex(ctx, md, NULL); if (!NIL_P(data)) return ossl_digest_update(self, data); return self; }