initial
This commit is contained in:
commit
c2731fdb43
10 changed files with 156 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
_build
|
1
CoqSSH.opam
Normal file
1
CoqSSH.opam
Normal file
|
@ -0,0 +1 @@
|
||||||
|
name: "CoqSSH"
|
6
Extract.v
Normal file
6
Extract.v
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
From Coq Require Extraction.
|
||||||
|
|
||||||
|
Require CSSH.
|
||||||
|
|
||||||
|
Extraction "SSH" SSH.
|
||||||
|
Extraction "CryptoPrims" CryptoPrims.
|
37
coq_ssh.ml
Normal file
37
coq_ssh.ml
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
open Unix
|
||||||
|
open Printf
|
||||||
|
open CoqSSH
|
||||||
|
|
||||||
|
let () =
|
||||||
|
let addr_str = "10.7.0.4" in
|
||||||
|
|
||||||
|
let socket_fd = socket PF_INET SOCK_STREAM 0 in
|
||||||
|
let inet_addr = inet_addr_of_string addr_str in
|
||||||
|
let sock_addr = ADDR_INET (inet_addr, 22) in
|
||||||
|
|
||||||
|
connect socket_fd sock_addr;
|
||||||
|
printf "Connected to %s.\n" addr_str;
|
||||||
|
|
||||||
|
(* protocol negotiation *)
|
||||||
|
|
||||||
|
let hello = "2.0 Hellosu\r\n" |> Bytes.of_string in
|
||||||
|
let bytes_written = write socket_fd hello 0 (Bytes.length hello) in
|
||||||
|
printf "Sent greeting (%d bytes).\n" bytes_written;
|
||||||
|
|
||||||
|
let buf = Bytes.create 1024 in
|
||||||
|
let bytes_read = read socket_fd buf 0 1024 in
|
||||||
|
let actual = Bytes.sub buf 0 bytes_read |> Bytes.to_string in
|
||||||
|
printf "Read '%s' (%d bytes).\n" actual bytes_read;
|
||||||
|
|
||||||
|
let version = "SSH-2.0-CoqSSH0.1 Coggers\r\n" |> Bytes.of_string in
|
||||||
|
let bytes_written = write socket_fd version 0 (Bytes.length version) in
|
||||||
|
printf "Sent protocol version (%d bytes).\n" bytes_written;
|
||||||
|
|
||||||
|
(* key exchange *)
|
||||||
|
|
||||||
|
let n : SSH.nat = SSH.O in
|
||||||
|
match n with
|
||||||
|
| SSH.O -> print_endline "o"
|
||||||
|
| _ -> ();
|
||||||
|
|
||||||
|
close socket_fd;
|
44
crypto_prims.ml
Normal file
44
crypto_prims.ml
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
module IFC = struct
|
||||||
|
(*
|
||||||
|
"Principals" are people (or hosts, or organizations) that may have
|
||||||
|
different access to information. It's described here by a string;
|
||||||
|
each principal has a unique string.
|
||||||
|
*)
|
||||||
|
type principal = string
|
||||||
|
|
||||||
|
(*
|
||||||
|
Labels represent who is allowed to have access to a certain piece
|
||||||
|
of information. Labels form a lattice, with Public at the bottom and
|
||||||
|
Secret at the top.
|
||||||
|
|
||||||
|
Every time information flows through the program,
|
||||||
|
it must be checked to make sure that it's not revealing information
|
||||||
|
when it isn't allowed to.
|
||||||
|
|
||||||
|
For example,
|
||||||
|
*)
|
||||||
|
type label =
|
||||||
|
(* a list of principals that have access to the information described
|
||||||
|
by this label *)
|
||||||
|
| LCanRead of principal list
|
||||||
|
|
||||||
|
(* join of 2 labels *)
|
||||||
|
| LJoin of label * label
|
||||||
|
|
||||||
|
(* bottom of the lattice *)
|
||||||
|
| LPublic
|
||||||
|
|
||||||
|
(* base type of bytes *)
|
||||||
|
type bytes =
|
||||||
|
(* a literal string *)
|
||||||
|
| BLit of string
|
||||||
|
(* 2 sets of byte-strings concatenated *)
|
||||||
|
| BConcat of bytes * bytes
|
||||||
|
(* cryptographically random set of bytes *)
|
||||||
|
| BRand of principal
|
||||||
|
end
|
||||||
|
|
||||||
|
module type CryptoPrims = sig
|
||||||
|
(* A function for generating a random nonce of n bytes *)
|
||||||
|
(* val rand : *)
|
||||||
|
end
|
9
dune
Normal file
9
dune
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
(executable
|
||||||
|
(name coq_ssh)
|
||||||
|
(public_name coq_ssh)
|
||||||
|
(libraries unix CoqSSH)
|
||||||
|
(package CoqSSH))
|
||||||
|
|
||||||
|
(env
|
||||||
|
(dev
|
||||||
|
(flags (:standard -warn-error -A))))
|
2
dune-project
Normal file
2
dune-project
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
(lang dune 2.8)
|
||||||
|
(using coq 0.3)
|
30
theories/CryptoPrims.v
Normal file
30
theories/CryptoPrims.v
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
From Coq Require Extraction.
|
||||||
|
Require Import Strings.String.
|
||||||
|
|
||||||
|
(*
|
||||||
|
Abstract cryptographic primitives.
|
||||||
|
|
||||||
|
For proof-checking, this will resolve to a set of axioms, but when
|
||||||
|
extracting to ocaml, this should be replaced with the real implementation
|
||||||
|
of the cryptographic primitives.
|
||||||
|
*)
|
||||||
|
Module Type AbsCryptoPrims.
|
||||||
|
Definition principal : Type := string.
|
||||||
|
|
||||||
|
Inductive label : Set :=
|
||||||
|
Public : label
|
||||||
|
.
|
||||||
|
End AbsCryptoPrims.
|
||||||
|
|
||||||
|
Module NullCryptoPrims : AbsCryptoPrims.
|
||||||
|
Definition principal : Type := string.
|
||||||
|
|
||||||
|
Inductive label : Set :=
|
||||||
|
Public : label
|
||||||
|
.
|
||||||
|
End NullCryptoPrims.
|
||||||
|
|
||||||
|
Extraction Language OCaml.
|
||||||
|
Set Extraction Optimize.
|
||||||
|
Set Extraction AccessOpaque.
|
||||||
|
Extraction "CryptoPrims" NullCryptoPrims.
|
15
theories/SSH.v
Normal file
15
theories/SSH.v
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
From Coq Require Extraction.
|
||||||
|
Module SSH.
|
||||||
|
|
||||||
|
Inductive natlist : Type :=
|
||||||
|
| nil
|
||||||
|
| cons (n : nat) (l : natlist).
|
||||||
|
|
||||||
|
Fixpoint length (l:natlist) : nat :=
|
||||||
|
match l with
|
||||||
|
| nil => O
|
||||||
|
| cons h t => S (length t)
|
||||||
|
end.
|
||||||
|
|
||||||
|
End SSH.
|
||||||
|
Extraction "SSH" SSH.
|
11
theories/dune
Normal file
11
theories/dune
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
(library
|
||||||
|
(name CoqSSH)
|
||||||
|
(package CoqSSH))
|
||||||
|
|
||||||
|
(coq.extraction
|
||||||
|
(prelude SSH)
|
||||||
|
(extracted_modules SSH))
|
||||||
|
|
||||||
|
(coq.extraction
|
||||||
|
(prelude CryptoPrims)
|
||||||
|
(extracted_modules CryptoPrims))
|
Loading…
Reference in a new issue