chibi.crypto: code style fixes

- Fixed some typos in sha-native.scm
- Removed unnecessary structs and unions from sha_context
- Used more efficient implementation of hex32
- Made (scheme base) a common import in (chibi crypto sha2)
This commit is contained in:
ilammy 2015-04-19 13:16:43 +03:00
parent 9088b1954c
commit db2b598cde
4 changed files with 22 additions and 28 deletions

View file

@ -2,7 +2,7 @@
;; Copyright (c) 2015 Alexei Lozovsky. All rights reserved. ;; Copyright (c) 2015 Alexei Lozovsky. All rights reserved.
;; BSD-style license: http://synthcode.com/license.txt ;; BSD-style license: http://synthcode.com/license.txt
(define (procees-sha-data! context src) (define (process-sha-data! context src)
(cond ((or (bytevector? src) (string? src)) (cond ((or (bytevector? src) (string? src))
(add-sha-data! context src)) (add-sha-data! context src))
((input-port? src) ((input-port? src)
@ -15,10 +15,10 @@
(define (sha-224 src) (define (sha-224 src)
(let ((context (start-sha type-sha-224))) (let ((context (start-sha type-sha-224)))
(procees-sha-data! context src) (process-sha-data! context src)
(get-sha context))) (get-sha context)))
(define (sha-256 src) (define (sha-256 src)
(let ((context (start-sha type-sha-256))) (let ((context (start-sha type-sha-256)))
(procees-sha-data! context src) (process-sha-data! context src)
(get-sha context))) (get-sha context)))

View file

@ -54,17 +54,10 @@ struct sha_context {
enum sha_type type; enum sha_type type;
char sealed; char sealed;
sexp_uint_t len; sexp_uint_t len;
union _sha_data { sexp_uint32_t hash256[8];
struct _sha_256 { sexp_uint8_t buffer[128]; /* enough for all SHA-2 */
sexp_uint8_t buffer[64];
sexp_uint32_t hash[8];
} sha_256;
} data;
}; };
#define sha_256_buffer(c) ((c)->data.sha_256.buffer)
#define sha_256_hash(c) ((c)->data.sha_256.hash)
/* = SHA-224/256 implementation ===================================== */ /* = SHA-224/256 implementation ===================================== */
#define ror32(v, a) (((v) >> (a)) | ((v) << (32 - (a)))) #define ror32(v, a) (((v) >> (a)) | ((v) << (32 - (a))))
@ -146,10 +139,10 @@ sexp sexp_start_sha (sexp ctx, sexp self, unsigned type, struct sha_context* v)
sha->type = type; sha->type = type;
switch (type) { switch (type) {
case SHA_TYPE_224: case SHA_TYPE_224:
memcpy(sha_256_hash(sha), h224, sizeof(h224)); memcpy(sha->hash256, h224, sizeof(h224));
break; break;
case SHA_TYPE_256: case SHA_TYPE_256:
memcpy(sha_256_hash(sha), h256, sizeof(h256)); memcpy(sha->hash256, h256, sizeof(h256));
break; break;
default: default:
break; break;
@ -170,20 +163,20 @@ static sexp sha_224_256_add_bytes (struct sha_context *sha,
sha->len += len; sha->len += len;
if (buf_offset) { if (buf_offset) {
while ((buf_offset < 64) && (src_offset < len)) while ((buf_offset < 64) && (src_offset < len))
sha_256_buffer(sha)[buf_offset++] = src[src_offset++]; sha->buffer[buf_offset++] = src[src_offset++];
if (buf_offset == 64) if (buf_offset == 64)
sha_224_256_round(sha_256_buffer(sha), sha_256_hash(sha)); sha_224_256_round(sha->buffer, sha->hash256);
else else
return SEXP_VOID; return SEXP_VOID;
} }
/* Process whole chunks without copying them */ /* Process whole chunks without copying them */
if (len >= 64) { if (len >= 64) {
for ( ; src_offset <= (len - 64); src_offset += 64) for ( ; src_offset <= (len - 64); src_offset += 64)
sha_224_256_round(src + src_offset, sha_256_hash(sha)); sha_224_256_round(src + src_offset, sha->hash256);
} }
/* Copy the remainder into the buffer */ /* Copy the remainder into the buffer */
if (src_offset < len) if (src_offset < len)
memcpy(sha_256_buffer(sha) + buf_offset, src + src_offset, len - src_offset); memcpy(sha->buffer + buf_offset, src + src_offset, len - src_offset);
return SEXP_VOID; return SEXP_VOID;
} }
@ -239,8 +232,8 @@ sexp sexp_get_sha (sexp ctx, sexp self, struct sha_context *sha) {
switch (sha->type) { switch (sha->type) {
case SHA_TYPE_224: case SHA_TYPE_224:
case SHA_TYPE_256: case SHA_TYPE_256:
sha_224_256_remainder(sha_256_buffer(sha), sha->len % 64, sha_224_256_remainder(sha->buffer, sha->len % 64,
sha->len * 8, sha_256_hash(sha)); sha->len * 8, sha->hash256);
break; break;
default: default:
break; break;
@ -248,9 +241,9 @@ sexp sexp_get_sha (sexp ctx, sexp self, struct sha_context *sha) {
} }
switch (sha->type) { switch (sha->type) {
case SHA_TYPE_224: case SHA_TYPE_224:
return sha_224_256_hash_string(ctx, self, sha_256_hash(sha), 7); return sha_224_256_hash_string(ctx, self, sha->hash256, 7);
case SHA_TYPE_256: case SHA_TYPE_256:
return sha_224_256_hash_string(ctx, self, sha_256_hash(sha), 8); return sha_224_256_hash_string(ctx, self, sha->hash256, 8);
default: default:
return sexp_xtype_exception(ctx, self, "unexpected context type", return sexp_xtype_exception(ctx, self, "unexpected context type",
sexp_make_fixnum(sha->type)); sexp_make_fixnum(sha->type));

View file

@ -41,10 +41,11 @@
(arithmetic-shift n (- k)))) (arithmetic-shift n (- k))))
(define (hex32 num) (define (hex32 num)
(let ((res (make-string 8 #\0)) (let* ((res (number->string num 16))
(num (integer->hex-string num))) (len (string-length res)))
(string-copy! res (- 8 (string-length num)) num) (if (>= len 8)
res)) res
(string-append (make-string (- 8 len) #\0) res))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

View file

@ -1,13 +1,13 @@
(define-library (chibi crypto sha2) (define-library (chibi crypto sha2)
(import (scheme base))
(export sha-224 sha-256) (export sha-224 sha-256)
(cond-expand (cond-expand
(chibi (chibi
(import (scheme base))
(include "sha2-native.scm") (include "sha2-native.scm")
(include-shared "crypto")) (include-shared "crypto"))
(else (else
(import (scheme base) (srfi 33) (chibi bytevector)) (import (srfi 33) (chibi bytevector))
(include "sha2.scm")))) (include "sha2.scm"))))
;;> \procedure{(sha-224 src)} ;;> \procedure{(sha-224 src)}