From f9eefbde0ef7277a05ad148fc8484a3511929629 Mon Sep 17 00:00:00 2001 From: Didactic Drunk <1479616+didactic-drunk@users.noreply.github.com> Date: Mon, 21 Jun 2021 17:12:57 -0700 Subject: [PATCH] Secret: #readonly, #readwrite, #noaccess add abstract & type restrictions --- src/crypto-secret/secret.cr | 16 ++++++++++++---- src/crypto-secret/stateful.cr | 2 +- src/crypto-secret/stateless.cr | 6 +++--- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/crypto-secret/secret.cr b/src/crypto-secret/secret.cr index 1f910c3..f48d24f 100644 --- a/src/crypto-secret/secret.cr +++ b/src/crypto-secret/secret.cr @@ -33,7 +33,7 @@ module Crypto::Secret extend ClassMethods - # For debugging. + # For debugging. Leaks the secret # # Returned String **not** tracked or wiped def hexstring : String @@ -92,6 +92,7 @@ module Crypto::Secret wipe end + # Wipes data & makes this object available for reuse def reset wipe end @@ -132,13 +133,20 @@ module Crypto::Secret end end - # Marks a region allocated using as read & write depending on implementation. + # Marks a region as read & write depending on implementation. abstract def readwrite : self - # Marks a region allocated using as read-only depending on implementation. + # Marks a region as read-only depending on implementation. abstract def readonly : self - # Makes a region allocated inaccessible depending on implementation. It cannot be read or written, but the data are preserved. + # Makes a region inaccessible depending on implementation. It cannot be read or written, but the data are preserved. abstract def noaccess : self + # Temporarily marks a region as read & write depending on implementation and yields `Bytes` + abstract def readwrite(& : Bytes -> U) forall U + # Temporarily marks a region as readonly depending on implementation and yields `Bytes` + abstract def readonly(& : Bytes -> U) forall U + # Temporarily Makes a region inaccessible depending on implementation. It cannot be read or written, but the data are preserved. + abstract def noaccess(& : Bytes -> U) forall U + protected abstract def to_slice(& : Bytes -> U) forall U abstract def bytesize : Int32 diff --git a/src/crypto-secret/stateful.cr b/src/crypto-secret/stateful.cr index e22ac86..2795fb6 100644 --- a/src/crypto-secret/stateful.cr +++ b/src/crypto-secret/stateful.cr @@ -40,7 +40,7 @@ module Crypto::Secret # Temporarily make buffer readonly within the block returning to the prior state on exit. # WARNING: Not thread safe unless this object is readonly or readwrite - def readonly + def readonly(& : Bytes -> U) forall U with_state State::Readonly do to_slice do |slice| yield slice diff --git a/src/crypto-secret/stateless.cr b/src/crypto-secret/stateless.cr index b71b8ac..f4cccb5 100644 --- a/src/crypto-secret/stateless.cr +++ b/src/crypto-secret/stateless.cr @@ -20,7 +20,7 @@ module Crypto::Secret::Stateless # `slice` is only available within the block # # Not thread safe - def readwrite + def readwrite(& : Bytes -> U) forall U to_slice do |slice| yield slice end @@ -35,7 +35,7 @@ module Crypto::Secret::Stateless # Don't write to it # # Not thread safe - def readonly + def readonly(& : Bytes -> U) forall U to_slice do |slice| yield slice end @@ -47,7 +47,7 @@ module Crypto::Secret::Stateless end # Not thread safe - def noaccess + def noaccess(& : Bytes -> U) forall U yield end