blob: 9af7617a83ea788af4e5380b355121d4733972b3 [file] [log] [blame]
// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'dart:ffi';
import 'dart:io';
import 'dlopen_helper.dart';
import 'types.dart';
// See:
// https://commondatastorage.googleapis.com/chromium-boringssl-docs/digest.h.html
DynamicLibrary openSsl() {
// Force load crypto.
dlopenPlatformSpecific('crypto',
path: Platform.script.resolve('../native/out/').path);
final ssl = dlopenPlatformSpecific('ssl',
path: Platform.script.resolve('../native/out/').path);
return ssl;
}
final DynamicLibrary ssl = openSsl();
/// The following functions return EVP_MD objects that implement the named
/// hash function.
///
/// ```c
/// const EVP_MD *EVP_sha512(void);
/// ```
final Pointer<EVP_MD> Function() EVP_sha512 =
ssl.lookupFunction<Pointer<EVP_MD> Function(), Pointer<EVP_MD> Function()>(
'EVP_sha512');
/// EVP_MD_CTX_new allocates and initialises a fresh EVP_MD_CTX and returns it,
/// or NULL on allocation failure. The caller must use EVP_MD_CTX_free to
/// release the resulting object.
///
/// ```c
/// EVP_MD_CTX *EVP_MD_CTX_new(void);
/// ```
final Pointer<EVP_MD_CTX> Function() EVP_MD_CTX_new = ssl.lookupFunction<
Pointer<EVP_MD_CTX> Function(),
Pointer<EVP_MD_CTX> Function()>('EVP_MD_CTX_new');
/// EVP_MD_CTX_free calls EVP_MD_CTX_cleanup and then frees ctx itself.
///
/// ```c
/// void EVP_MD_CTX_free(EVP_MD_CTX *ctx);
/// ```
final void Function(Pointer<EVP_MD_CTX>) EVP_MD_CTX_free = ssl.lookupFunction<
Void Function(Pointer<EVP_MD_CTX>),
void Function(Pointer<EVP_MD_CTX>)>('EVP_MD_CTX_free');
/// EVP_DigestInit acts like EVP_DigestInit_ex except that ctx is initialised
/// before use.
///
/// ```c
/// int EVP_DigestInit(EVP_MD_CTX *ctx, const EVP_MD *type);
/// ```
final int Function(Pointer<EVP_MD_CTX>, Pointer<EVP_MD>) EVP_DigestInit =
ssl.lookupFunction<Int32 Function(Pointer<EVP_MD_CTX>, Pointer<EVP_MD>),
int Function(Pointer<EVP_MD_CTX>, Pointer<EVP_MD>)>('EVP_DigestInit');
/// EVP_DigestUpdate hashes len bytes from data into the hashing operation
/// in ctx. It returns one.
///
/// ```c
/// int EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *data,
/// size_t len);
/// ```
final int Function(Pointer<EVP_MD_CTX>, Pointer<Data>, int) EVP_DigestUpdate =
ssl.lookupFunction<
Int32 Function(Pointer<EVP_MD_CTX>, Pointer<Data>, IntPtr),
int Function(
Pointer<EVP_MD_CTX>, Pointer<Data>, int)>('EVP_DigestUpdate');
/// EVP_DigestFinal acts like EVP_DigestFinal_ex except that EVP_MD_CTX_cleanup
/// is called on ctx before returning.
///
/// ```c
/// int EVP_DigestFinal(EVP_MD_CTX *ctx, uint8_t *md_out,
/// unsigned int *out_size);
/// ```
final int Function(Pointer<EVP_MD_CTX>, Pointer<Bytes>, Pointer<Uint32>)
EVP_DigestFinal = ssl.lookupFunction<
Int32 Function(Pointer<EVP_MD_CTX>, Pointer<Bytes>, Pointer<Uint32>),
int Function(Pointer<EVP_MD_CTX>, Pointer<Bytes>,
Pointer<Uint32>)>('EVP_DigestFinal');
/// EVP_MD_CTX_size returns the digest size of ctx, in bytes. It will crash if
/// a digest hasn't been set on ctx.
///
/// ```c
/// size_t EVP_MD_CTX_size(const EVP_MD_CTX *ctx);
/// ```
final int Function(Pointer<EVP_MD_CTX>) EVP_MD_CTX_size = ssl.lookupFunction<
IntPtr Function(Pointer<EVP_MD_CTX>),
int Function(Pointer<EVP_MD_CTX>)>('EVP_MD_CTX_size');