113 lines
4.6 KiB
OCaml
113 lines
4.6 KiB
OCaml
(*---------------------------------------------------------------------------
|
|
Copyright (c) 2017 Vincent Bernardoff. All rights reserved.
|
|
Distributed under the ISC license, see terms at the end of the file.
|
|
---------------------------------------------------------------------------*)
|
|
|
|
type secp160r1
|
|
type secp192r1
|
|
type secp224r1
|
|
type secp256r1
|
|
type secp256k1
|
|
(** Kinds of ECC curves. *)
|
|
|
|
type _ t
|
|
(** Type of an ECC curve, parametrized by its kind. *)
|
|
|
|
val secp160r1 : secp160r1 t
|
|
val secp192r1 : secp192r1 t
|
|
val secp224r1 : secp224r1 t
|
|
val secp256r1 : secp256r1 t
|
|
val secp256k1 : secp256k1 t
|
|
(** Supported curves. *)
|
|
|
|
val sk_size : _ t -> int
|
|
(** [sk_size curve] is the size in bytes of secret keys from
|
|
[curve]. Typically the same as the curve size, (i.e. 32 bytes for
|
|
[secp256r1]) except for [secp160r1] which is 21 bytes. *)
|
|
|
|
val pk_size : _ t -> int
|
|
(** [pk_size curve] is the size in bytes of public keys from
|
|
[curve]. Equals to [2*curve_size]. *)
|
|
|
|
val compressed_size : _ t -> int
|
|
(** [compressed_size curve] is the size in bytes of compressed public
|
|
keys from [curve]. Equals to [pk_size curve/2+1]. *)
|
|
|
|
type secret
|
|
type public
|
|
type (_, _) key
|
|
(** Type of a key, parametrized by its curve and kind. *)
|
|
|
|
val equal : ('a, 'b) key -> ('a, 'b) key -> bool
|
|
(** [equal k1 k2] is [true] if [k1] is represented by the same bytes
|
|
as [k2], and [false] otherwise. *)
|
|
|
|
val neuterize : ('a, _) key -> ('a, public) key
|
|
(** [neuterize k] is [k] if [k] is public, or is the associated public
|
|
key of [k] if [k] is secret. *)
|
|
|
|
val sk_of_bytes :
|
|
'a t -> Bigstring.t -> (('a, secret) key * ('a, public) key) option
|
|
(** [sk_of_bytes curve buf] is [Some (sk, pk)] if [buf] contains a
|
|
valid serialization of a [curve] secret key, or [None] otherwise. *)
|
|
|
|
val pk_of_bytes : 'a t -> Bigstring.t -> ('a, public) key option
|
|
(** [pk_of_bytes curve buf] is [Some pk] if [buf] contains a valid
|
|
serialization of a [curve] public key, or [None] otherwise. *)
|
|
|
|
val to_bytes : ?compress:bool -> (_, _) key -> Bigstring.t
|
|
(** [to_bytes ?compress k] is a serialization of [k]. If [compress] is
|
|
[true] (the default) and [k] is a public key, the public key will
|
|
be in compressed format. *)
|
|
|
|
val write_key : ?compress:bool -> Bigstring.t -> (_, _) key -> int
|
|
(** [write_key buf k] writes [k] at [buf] and returns the number of
|
|
bytes actually written. *)
|
|
|
|
val keypair : 'a t -> (('a, secret) key * ('a, public) key) option
|
|
(** [keypair curve] is [Some (sk, pk)] where [sk] and [pk] is freshly
|
|
generated keypair for [curve] if everything went well, or [None]
|
|
otherwise. *)
|
|
|
|
val dh : ('a, secret) key -> ('a, public) key -> Bigstring.t option
|
|
(** [dh sk pk] is [Some buf] where [buf] contains a shared secret
|
|
value computed from your [sk] and someone else's [pk] if everything
|
|
went well, or [None] otherwise. *)
|
|
|
|
val write_dh : ('a, secret) key -> ('a, public) key -> Bigstring.t -> int
|
|
(** [write_dh sk pk buf] writes a shared secret value computed from your
|
|
[sk] and someone else's [pk] and returns the number of bytes
|
|
actually written (0 in the case of an error). *)
|
|
|
|
val sign : (_, secret) key -> Bigstring.t -> Bigstring.t option
|
|
(** [sign sk msg] is [Some signature] where [signature] is a valid
|
|
signature of [msg] with secret key [sk], or [None] if an error
|
|
occured. *)
|
|
|
|
val write_sign :
|
|
(_, secret) key -> Bigstring.t -> msg:Bigstring.t -> int
|
|
(** [write_sign sk ~msg buf] writes a signature of [msg] with [sk] to
|
|
[buf], and returns the number of bytes written (0 in the case of an
|
|
error). *)
|
|
|
|
val verify :
|
|
(_, public) key -> msg:Bigstring.t -> signature:Bigstring.t -> bool
|
|
(** [verify pk ~msg ~signature] is [true] if [signature] is a valid
|
|
signature of [msg] corresponding to [pk]. *)
|
|
|
|
(*---------------------------------------------------------------------------
|
|
Copyright (c) 2017 Vincent Bernardoff
|
|
|
|
Permission to use, copy, modify, and/or distribute this software for any
|
|
purpose with or without fee is hereby granted, provided that the above
|
|
copyright notice and this permission notice appear in all copies.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
---------------------------------------------------------------------------*)
|