text:
Sonic Youth Gossip > Non-Sonic Sounds
Janet Weiss leaves Sleater-Kinney
07.02.2019, 06:24 PM #1
Kuhb
children of satan
In her statement she cites the band moving in a different direction as a primary reason. Which, given what I've heard from the first couple of singles from the new album, I can hear for sure.
I'm still buying the album for sure, but from what I've heard I have to wonder... why would you listen to the music of the last decade and think that we need MORE '80s retro?
https://www.avclub.com/janet-weiss-i...ter-1836014948
|QUOTE AND REPLY|
Send a private message to Kuhb
Find More Posts by Kuhb
If they wanted a female replacement who can handle the drum parts of the back catalogue, they should give Sara Lund a call.
!@#$%!
invito al cielo
Location: mars attacks
sounds like the center, you know, didn't hold
Send a private message to !@#$%!
Send email to !@#$%!
Visit !@#$%!'s homepage!
Find More Posts by !@#$%!
Originally Posted by !@#$%!
<applause>
Toilet & Bowels
Location: Northern Europe
The new songs are wack, she made the right decision.
Send a private message to Toilet & Bowels
Find More Posts by Toilet & Bowels
07.05.2019, 12:21 AM #6
The Soup Nazi
Location: Del Boca Vista
Christ on a stick, I'm having the worst year of my life. And yes, I'm counting annus horribilis 2016, and also the year my waste-of-oxygen father (now dead, thank goodness - I hope the piece of shit suffered) almost killed my mom. Well, NO, that last one was obviously worse, but I was too little... Lookit, let's move on:
I still worship at the altar of Sleater-Kinney. But the band is over. No "indefinite hiatus" this time; OVER. Even though they existed before Janet (and Call The Doctor is a masterpiece), when she joined they entered the pantheon of the greatest of the fucking greatest of all time. They became a UNIT in which no member was replaceable.
You come around looking 1984
You're such a bore, 1984!
Having listened to the two new songs they've so far "shared", as the kids say these days (yes, goddamn kids, get off my lawn,
), I actually don't think the new material is necessarily another retro-'80s number — in fact, if you listen to the performance of "Hurry On Home" on The Tonight Show from last month, the tune sounds like a solid, atemporal Sleater-Kinney single. But even though what matters will always be the music, what on Earth is going on with the image? Janet, a truly attractive woman who's sexy as all hell behind the drums looks... boxed in somehow, like a Lego version of herself. Look at their promo picture: it's like the St. Vincent influence (and I love Annie) not only went beyond the production to extend to fashion design, it did so on cocaine. Corin is sporting a hairdo that should have indeed died a definitive death in 1984.
Nice words aside, Weiss' departure doesn't quite look amicable. It's unfortunate that they will go ahead with the tour as planned anyway without the best, most exquisitely MUSICAL rock drummer alive.
GADJI BERI BIMBA CLANDRIDI LAULI LONNI CADORI GADJAM A BIM BERI GLASSALA GLANDRIDE E GLASSALA TUFFM I ZIMBRA
Send a private message to The Soup Nazi
Send email to The Soup Nazi
Find More Posts by The Soup Nazi
From Paste Magazine:
Carrie Brownstein Opens up About Janet Weiss' Departure from Sleater-Kinney via Instagram
Carrie Brownstein posted a video to Instagram on Monday [July 15] in which viewers can hear what appears to be a snippet of a Sleater-Kinney recording as a white circle expands and shrinks in the center of a black screen.
In the video's accompanying caption, Brownstein tagged the band's Instagram account and included the hashtag #sleaterkinney.
Earlier this month, the band's longtime drummer Janet Weiss announced she was leaving Sleater-Kinney, just weeks after the group had announced that their forthcoming, St. Vincent-produced record was set to arrive Aug. 16 via Mom + Pop.
In a comment on Monday's post, an Instagram user asked Brownstein why the other Sleater-Kinney members, i.e. Corin Tucker and herself, did not comment further on Weiss' departure, asking them to elaborate on how they are "moving forward." The user noted in an additional comment that they "saw the initial statement," posted by the band on July 1 in response to Weiss leaving, which is located below.
Brownstein responded to the user on Tuesday [July 16], asking, "What am I supposed to say?" She continued in a candid, paragraph-long answer to the question, writing that Tucker and herself asked Weiss to stay, will continue to "pick up the pieces" after she quit, and will "keep going" because they "believe in themselves." Her full response is below, in which she wrote, "it's a privilege to get to play music for people."
@pinkshyguy666 what am I supposed to say? She left. We asked her to stay. We tried. It's hard and sad. Most people would ask me, "hey are you ok?" That's the human response. She's left us with a job to do, a job we also expected and wanted her to be a part of. Her playing on this record is amazing and she's raved about this album to us and to Annie. But we have to keep looking to the future. Things change, even when those changes are hard and unexpected. Four amazing women worked on this record and we are going to honor that work. So, what's up? The usual….Women picking up the pieces when someone quits, because we have to and want to. We're going to keep going because we believe in ourselves and it's a privilege to get to play music for people. It's a new chapter. And all artistic entities have many chapters, if they're lucky. Either the music will resonate or it won't.
To see Brownstein's response to the user and their original comments, refer to the screenshots of their thread below.
Janet wastes no time. From the Kill Rock Stars newsletter:
QUASI ANNOUNCES NEW TOUR DATES
The Portland, OR based indie rock duo, Quasi, featuring the combined musical powers of Sam Coomes and Janet Weiss will be touring the West Coast this Fall of 2019. Tickets go on sale this Friday, July 26th at 10 AM PT.
From The New York Times:
Sleater-Kinney Asked St. Vincent for a Creative Spark. The Trio Blew Up.
"I'm glad that there's this record that has her immense drumming on it," Brownstein said. "But now Corin and I have to kind of clean up the mess of someone leaving after we announced a tour."
Weiss declined to comment for this article.
08.02.2019, 01:30 PM #10
Rob Instigator
Location: In the land of the Instigator
St. Vincent is gonna drum..... maybe?
RXTT's Intellectual Journey - my new blog where I talk about all the books I read.
Send a private message to Rob Instigator
Send email to Rob Instigator
Visit Rob Instigator's homepage!
Find More Posts by Rob Instigator
Janet replaces the rest of Sleater-Kinney with Kermit the Frog.
After hearing the new SK singles, I'm more excited about the prospect of new Quasi music. Quasi fucking rules
Originally Posted by Kuhb
Quasi does fucking rule, but as Robert Christgau wrote about Wild Flag's only album, "for some reason [Janet] never sounds like the greatest drummer in the world with anyone else".
From "An Audience With Robert Forster", Uncut 263, April 2019:
David Tang, via e-mail: How was it working with Sleater-Kinney on The Friends Of Rachel Worth?
Forster: It was good. It's mainly Janet Weiss who plays on the album; Carrie and Corin are only on one song. I'd been introduced to their music through Dig Me Out. It was the first great rock LP I'd heard in a long time — I loved the energy, the lyrics and the sharpness. They're smart, clever, funny people. I saw they're working with St. Vincent... I think that's a great pairing.
Yow.
lol i didn't know there was so much drama and passive aggressive shit going on
thanks for the soap opera updates
gonna go check quasi now...
Carrie's statement to the New York Times is the definition of passive aggression. I'm afraid celebrity has made a monster of my heroine.
Anyone who thinks Janet Weiss is the greatest drummer in the world is insane
08.14.2019, 02:56 AM #18
_tunic_
Location: I could live in eurHope
Janet Weiss Recovering After Car Accident, Cancels Quasi Tour
Tonight, Janet Weiss revealed that she's recovering after being involved in a car accident last weekend that left her with a broken right leg and left collar bone. Her planned upcoming shows with Quasi have been canceled. She says her recovery time is 12 weeks.
"As thoroughly bummed as I am about canceling the shows, I'm also incredibly thankful the accident wasn't worse and so happy to be alive," she wrote. "I am lucky my injuries will heal and I'll be back at it in a couple months." Weiss thanked her surgeon, nurses, and family. "Hug your people and tell them you love them," she wrote. Read her entire note below.
Earlier this year, Weiss announced her departure from Sleater-Kinney. She contributed to their new album The Center Won't Hold, which is out this Friday. Following her announcement, she appeared at Newport Folk Festival and played drums for Kermit.
what comes first,
the music or the words?
Send a private message to _tunic_
Send email to _tunic_
Find More Posts by _tunic_
Originally Posted by Toilet & Bowels
So book me a room at Bellevue ASAP.
Originally Posted by _tunic_
JESUS MOTHER-FUCK! Hopefully a full recovery will follow. If Carla Azar could do it (see the madness of her fixed elbow below), The Mighty Janet sure can.
Haven't heard the album yet, but check out this gorgeous live piano-and-vocals version of "Broken":
http://www.undertheradarmag.com/news/sleater-kinney_share_video_of_them_performing_new_song_bro ken_live/
From Grammy.com:
"For all the changes, The Center Won't Hold is still very much a Sleater-Kinney record—bold and feminist and unrelenting. It ends with a gut-punch, the piano ballad 'Broken,' where Tucker sings, 'Me, me too / My body cried out,' inspired in part by the #MeToo movement and the testimony of Christine Blasey Ford. It's a bleak way to leave listeners, but it's an important one."


text:
<!DOCTYPE html>

<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Ironclad</title>
<meta name="generator" content="Org mode">
<meta name="author" content="The Ironclad developers">

Ironclad

<object type="image/svg+xml" data="https://travis-ci.org/sharplispers/ironclad.svg" class="org-svg" style="width: 0; height: 0; padding: 0; margin: 0; border: 0; overflow: hidden;">
Sorry, your browser does not support SVG.</object>

Ironclad is a cryptography library written entirely in Common Lisp. It
includes support for several popular ciphers, digests, MACs and
public key cryptography algorithms. For several implementations that
support Gray streams, support is included for convenient stream wrappers.

Most of the algorithms were written with efficiency for specific
Common Lisp implementations in mind, although portable code is
provided as an alternative in nearly all instances. The framework
should be flexible enough to accomodate implementation-specific
optimizations when possible.

Test vectors for many of the algorithms are included to provide
a level of confidence in the correctness of the implementations.

Table of Contents

Warning

Installation

License

Ciphers

Digests

Message authentication codes

Authenticated encryption

Key derivation functions

Public key cryptography

Pseudo-random number generation

Gray streams

Utility functions

Conditions

Warning

Ironclad should not be considered safe against side channel attacks.

Some algorithms can be safe against side channel attacks on some
architectures using some Common Lisp implementations, but in the
general case it can't be guaranteed. This is due to the fact that
integers and arithmetic functions of Common Lisp implementations are
usually not safe against side channel attacks.

Ironclad's pseudo random number generation should not be considered thread
safe

If you have a multi-threaded application in which you want to use functions
requiring some random numbers (key derivation, key generation, public key
encryption, signature, etc.) in several threads, each of these threads
must have its own PRNG, or they might generate the same "random" numbers.
There is an example showing how it can be done in the section about make-prng.

Installation

The current version of Ironclad is 0.44. It can be downloaded
at https://github.com/sharplispers/ironclad/archive/v0.44.tar.gz.
If you are feeling adventurous, you can download a bleeding-edge version
at https://github.com/sharplispers/ironclad.

It comes with an ASDF system definition, so (asdf:load-system "ironclad")
should be all that you need to get started. The testsuite can be run
by substituting asdf:test-system for asdf:load-system in the form above.

If you are using Quicklisp to manage your libraries, just use
(ql:quickload "ironclad").

When Ironclad is loaded, its functions are in the ironclad package (e.g.
(ironclad:make-cipher ...)). If you prefer, you can also use the crypto
nickname (e.g. (crypto:make-cipher ...)).

Ironclad has been tested in the following implementations:

SBCL x86/linux, x86-64/linux (primary development platforms)

SBCL x86-64/solaris, x86/darwin

CMUCL x86/linux

ABCL with Sun's 1.5.0 JVM

Lispworks 5.0.1 x86/linux

Lispworks 5.1.2 x86-64/darwin x86/windows

Allegro 8.0 x86/linux

Allegro 8.1 x86/linux, x86-64/linux, sparc/solaris

CLISP 2.41 x86/linux, x86/cygwin

Clozure Common Lisp 1.11 x86-64/Linux

Clozure Common Lisp 1.10 x86-64/darwin

ECL 16.1.3 x86-64/linux

All included tests should pass successfully. If you use a platform not
listed above, please send your platform information so that it can be
added to the above list. If the tests do not all pass, you have found
a bug; please report it.

By default, Ironclad uses some implementation dependent low-level code to make
some functions run much faster (currently, some assembly for SBCL and CCL, some
C code for ECL). If for some reason you want to disable these optimisations and
use the generic Lisp code, it can be achieved by commenting out the
(pushnew :ironclad-assembly *features*) line in the src/package.lisp file.

License

Ironclad is released under a MIT-like license; you can do pretty much
anything you want to with the code except claim that you wrote it.

Ciphers

(make-cipher name &key key mode initialization-vector padding tweak) => cipher

Return a cipher object suitable for use for both encryption and decryption.

name denotes the encryption algorithm to use. list-all-ciphers will tell you
the names of all supported ciphers. They are:

3des

aes

arcfour (rc4)

aria

blowfish

camellia

cast5

chacha

chacha/12

chacha/8

des

idea

kalyna128

kalyna256

kalyna512

kuznyechik

misty1

rc2

rc5

rc6

salsa20

salsa20/12

salsa20/8

seed

serpent

sm4

sosemanuk

square

tea

threefish1024

threefish256

threefish512

twofish

xchacha

xchacha/12

xchacha/8

xor (not a real cipher, use only for testing)

xsalsa20

xsalsa20/12

xsalsa20/8

xtea

name can be a symbol in the keyword package or in the ironclad package;
:aes for AES, ironclad:arcfour for RC4, and so forth.

mode describes the mode of operation for the cipher. Stream ciphers
such as Arcfour can operate in only one mode, stream. Block ciphers
such as AES and DES can operate in several different modes:

ecb

cbc

ofb

cfb (note that Ironclad's CFB mode is n-bit CFB, where n is the block-length of the cipher)

cfb8 (this seems to be the mode other crypto packages call CFB)

ctr

mode should be a symbol in the keyword or ironclad packages;
:stream, ironclad:ofb, and so forth. An error will be signaled if
mode is not appropriate for the cipher name.

initialization-vector (IV) should be supplied only if mode requires one.
initialization-vector should be a (simple-array (unsigned-byte 8) (*)).
The supplied IV should be the same length as the block-length of name.
The Chacha and Salsa20 stream ciphers also use an initialization
vector (nonce). It should be 8 bytes long for Chacha and Salsa20, and
24 bytes long for XChacha and XSalsa20.

key is, of course, the key for the cipher.
key should be a (simple-array (unsigned-byte 8) (*)).

If padding is supplied, the specified padding method will be used by encrypt
and decrypt to handle short blocks when the :handle-final-block argument is
supplied. padding will only be used if the mode is ECB or CBC. The possible
values for padding are :pkcs7, :ansi-x923 and :iso-7816-4.

If the cipher can use a tweak (e.g. threefish), it can be specified
with the tweak key parameter.

(encrypt cipher plaintext ciphertext &key plaintext-start plaintext-end ciphertext-start handle-final-block) => n-bytes-consumed, n-bytes-produced

Encrypts data according to cipher from plaintext starting at
plaintext-start and continuing until plaintext-end. The encrypted
data is placed in ciphertext starting at ciphertext-start.

(decrypt cipher ciphertext plaintext &key ciphertext-start ciphertext-end plaintext-start handle-final-block) => n-bytes-consumed, n-bytes-produced

Decrypts data according to cipher from ciphertext starting at
ciphertext-start and continuing until ciphertext-end. The decrypted
data is placed in plaintext starting at plaintext-start.

(encrypt-in-place cipher text &key start end) => n-bytes-consumed, n-bytes-produced

(decrypt-in-place cipher text &key start end) => n-bytes-consumed, n-bytes-produced

Encrypts or decrypts data in text between start and end "in-place"
according to cipher. These functions are shorthand for:

(encrypt cipher text text :plaintext-start start :plaintext-end end :ciphertext-start start)
(decrypt cipher text text :ciphertext-start start :ciphertext-end end :plaintext-start start)

Note: encrypt-in-place and decrypt-in-place do not support
a handle-final-block parameter as encrypt and decrypt do. If you
need the functionality that handle-final-block provides, then you
need to use encrypt and decrypt.

Note: n-bytes-consumed and n-bytes-produced may not always be
equal to the length of the data specified in the call to
encrypt-in-place or decrypt-in-place. This subtlely is also present in
encrypt or decrypt.

(encrypt-message cipher message &key start end &allow-other-keys) => encrypted-message

Return the message between start and end encrypted with the cipher; the
class of cipher determines the algorithm used to encrypt the message.

(decrypt-message cipher message &key start end &allow-other-keys) => decrypted-message

Return the message between start and end decrypted by the cipher; the
class of cipher determines the algorithm used to decrypt the message.

Inquiry functions

(list-all-ciphers) => list

Returns a list of cipher-names that may be validly passed to make-cipher.

(cipher-supported-p name) => boolean

Returns t if name would be in the list returned by list-all-ciphers,
nil otherwise.

(key-lengths cipher) => list

Return a list of valid key lengths for cipher.

(block-length cipher) => number

Return the number of octets cipher processes at a time. This
function always returns 1 for stream ciphers.

Key stream position

Block ciphers in CTR mode and some stream ciphers have the ability to change the
current position within the key stream in constant time instead of having to
consume all the bytes until the desired position is reached.

(keystream-position cipher &optional position) => number or boolean

Return or change the current position within the key stream of a cipher.
When position is not supplied, keystream-position returns the current position
in the key stream, or nil if it can't be determined. When position is
supplied, the key stream position of the cipher is set to that position if
possible. keystream-position returns t if the repositioning is performed
successfully, or nil otherwise.

keystream-position can be used with the following ciphers:

all the block ciphers (aes, twofish, etc.) in CTR mode

chacha

chacha/12

chacha/8

salsa20

salsa20/12

salsa20/8

xchacha

xchacha/12

xchacha/8

xsalsa20

xsalsa20/12

xsalsa20/8

Digests

Digest functions, also known as hash functions, produce fixed-length
output (a digest or hash) from a variable-length message. The
simplest example of a digest function is one that adds up all the
bytes in the message modulo 256. This digest function fails one test
of a cryptographically secure hash function: it must be difficult to
find a message with a given digest. It also fails the other test: it
must be difficult to find two messages with the same digest.

Ironclad provides several cryptographically secure digest functions
and several non-cryptographically secure digest functions.

Note: In the functions below, messages or parts thereof are provided
as octet vectors; Ironclad has no facilities for producing digests of
strings. If you need to obtain the digest of a string, then you need
to figure out how to convert it to an octet vector first. This is
a deliberate design decision. Characters are not equivalent to bytes.
See your local Unicode guru for more details.

(make-digest digest-name &rest keys &key &allow-other-keys) => digester

Returns a digest object. digest-name is a keyword naming the
algorithm you wish digester to use. The supported digest names can be found
by calling list-all-digests. They are:

adler32

blake2

blake2/160

blake2/256

blake2/384

blake2s

blake2s/128

blake2s/160

blake2s/224

crc24

crc32

groestl

groestl/224

groestl/256

groestl/384

jh

jh/224

jh/256

jh/384

keccak

keccak/224

keccak/256

keccak/384

kupyna

kupyna/256

md2

md4

md5

ripemd-128

ripemd-160

sha1

sha224

sha256

sha3

sha3/224

sha3/256

sha3/384

sha384

sha512

shake128

shake256

skein1024

skein1024/384

skein1024/512

skein256

skein256/128

skein256/160

skein256/224

skein512

skein512/128

skein512/160

skein512/224

skein512/256

skein512/384

sm3

streebog

streebog/256

tiger

tree-hash

whirlpool

Like for make-cipher, digest-name should be a symbol in the
keyword or ironclad packages.

Some algorithms (e.g. shake128 and shake256) can produce digests of
any size. The size of the digest in bytes can be specified with the
output-length key parameter:

(make-digest :shake256 :output-length 123)

(update-digest digester thing &key &allow-other-keys) => (values)

Updates the internal state of digester with the contents of thing.
The exact method is determined by the type of thing.

There are several methods defined on this generic function that take
a particular digester and a (simple-array (unsigned-byte 8) (*)) as
well as the usual start and end keyword arguments. These methods
update the state of digester with the subsequence of the array
denoted by start and end. They are not listed here because there's
one method for every type of digest that Ironclad provides, and
listing them would get very tedious for no benefit. An example should
suffice.

(let ((digester (ironclad:make-digest :sha1))
      (array (make-array 16 :element-type '(unsigned-byte 8) :initial-element 0)))
  ;; Update with 16 zeroes.
  (ironclad:update-digest digester array)
  ;; Update with 8 ones.
  (fill array 1 :start 2 :end 10)
  (ironclad:update-digest digester array :start 2 :end 10))

(update-digest digester (stream stream) &key buffer start end &allow-other-keys) => digester

Update the internal state of digester with the contents of stream,
which must respond to read-byte or read-sequence with
a (simple-array (unsigned-byte 8) (*)) and return digester. It
differs from digest-stream, below, in that you may need to digest data
before or after the contents of stream (this happens, for instance,
when signing the contents of some file).

(produce-digest digester &key digest digest-start) => digest

Return the digest of the data processed by digester so far.

If digest is provided, the computed digest will be placed into
digest starting at digest-start. digest must be a
(simple-array (unsigned-byte 8) (*)). An insufficient-buffer-space
error will be signaled if there is insufficient space in digest.

High-level convenience functions

Several high-level convenience functions that encapsulate common
sequences of make-digest, update-digest and produce-digest are
provided by Ironclad as well. They come in two flavors: the first
takes a digest name as would be provided to make-digest. The second
way to call these functions is to provide an actual digest object as
the first argument. So one can say:

(ironclad:digest-sequence :md5 *buffer*)

or, equivalently:

(let ((digester (ironclad:make-digest :md5)))
  (ironclad:digest-sequence digester *buffer*))

The second form comes in handy if you plan on reusing the digest object.

(digest-sequence digest-spec sequence &rest args &key start end digest digest-start) => digest

Returns the digest of the subsequence of sequence bounded by start
and end, according to digest-name. sequence must be
a (simple-array (unsigned-byte 8) (*)). digest and digest-start
are as in produce-digest.

(digest-stream digest-spec stream &rest args &key buffer start end digest digest-start) => digest

Returns the digest of the contents of the stream specified by
stream. read-byte must be a legal operation on stream and return
an (unsigned-byte 8). In a similar fashion, read-sequence on
stream must support reading into a (simple-array (unsigned-byte 8) (*)).
digest and digest-start are as in produce-digest.

If buffer is provided, it must be a (simple-array (unsigned-byte 8) (*));
the portion of buffer between start and end will be used to read
the data from the stream.

(digest-file digest-spec pathname &rest args &key buffer start end digest digest-start) => digest

Returns the digest of the contents of the file named by pathname.
digest and digest-start are as in produce-digest.

If buffer is provided, it must be a (simple-array (unsigned-byte 8) (*));
the portion of buffer between start and end will be used to read
the data from the stream.

Inquiry functions

(list-all-digests) => list

Returns a list whose elements may be validly passed to make-digest.

(digest-supported-p name) => boolean

Returns t if name would be in the list returned by list-all-digests,
nil otherwise.

(digest-length digest) => number

Returns the length of the digest computed by digest, which may be
a digest-name or a digest instance.

Miscellaneous

Ironclad digests are CLOS objects; the interesting thing about this
for most purposes is that functions like reinitialize-instance are
supported. This means one can write a fairly efficient clone of the
md5sum program like so:

(defun digest-sum-files (digest-name &rest files)
  (unless files
    (error "no files given to digest"))
  (loop with buffer = (make-array 8192 :element-type '(unsigned-byte 8))
        with digest = (make-array (ironclad:digest-length digest-name)
                                  :element-type '(unsigned-byte 8))
       for file in files
       for digester = (ironclad:make-digest digest-name)
       then (reinitialize-instance digester)
       do (ironclad:digest-file digester file :buffer buffer :digest digest)
          (format t "~A ~A~%" (file-namestring file)
                  (ironclad:byte-array-to-hex-string digest))))

Tree hashes

Ironclad supports tree hashes, as described in Tree Hash EXchange format.
You create tree hashes as if you were creating a digest:

(ironclad:make-digest :tree-hash)

By default, this creates a tree hash that uses the Tiger digest
algorithm internally and a segment size of 1024. Since using the Tiger
digest algorithm is so common, a convenience function that makes your
intent obvious has also been provided:

(ironclad:make-tiger-tree-hash)

You may indicate that you wish to use a different algorithm than
Tiger:

(ironclad:make-digest '(:treehash :digest :sha256))

Or you might wish to use a different segment size:

(ironclad:make-digest '(:tree-hash :block-length 16384))

There is currently no interface for obtaining the intermediate hashes
computed while computing the final tree hash.

Message authentication codes

A message authentication code is a cryptographic function of some data
and a user-specified key. Only a person knowing the key can recompute
the MAC for the given message. A MAC is useful where maintaining data
integrity is required, but the secrecy of the data is not paramount.

Ironclad provides different kinds of MACs:

HMAC, specified in RFC 2104

CMAC, specified in RFC 4493 and NIST document 800-38B

GMAC, specified in NIST document 800-38D

Blake2 and Blake2s MAC

Poly1305

SipHash

Skein MAC

(make-mac mac-name key &rest args) => mac

Return a MAC object initialized with a secret key. mac-name is
a keyword naming the algorithm you wish mac to use. The supported
MACs can be found by calling list-all-macs. They are:

blake2-mac

blake2s-mac

cmac

gmac

hmac

poly1305

siphash

skein-mac

Like for make-digest, mac-name should be a symbol in the keyword
or ironclad packages.

Some MACs take extra arguments that can be specified in args.

(make-mac :blake2-mac key &key digest-length)
(make-mac :blake2s-mac key &key digest-length)
(make-mac :cmac key cipher-name)
(make-mac :gmac key cipher-name initialization-vector)
(make-mac :hmac key digest-name)
(make-mac :poly1305 key)
(make-mac :siphash key &key compression-rounds finalization-rounds digest-length)
(make-mac :skein-mac key &key block-length digest-length)

When making a Blake2 MAC, the length of the key passed to make-mac
must be 64 bytes.

When making a Blake2s MAC, the length of the key passed to make-mac
must be 32 bytes.

When making a CMAC, cipher-name must have a block-length of either 8, 16, 32,
64 or 128; this restriction is satisfied by many ciphers in Ironclad with the
notable exception of stream ciphers. key must be an acceptable key for
cipher-name.

When making a GMAC, cipher-name must have a block-length of 16. key must be
an acceptable key for cipher-name. The length of initialization-vector must
be 12 bytes.

When making a Poly1305 MAC, the length of the key passed to make-mac must be
32 bytes.

When making a SipHash MAC, the length of the key passed to make-mac must be 16
bytes. digest-length is 8 by default, but it can also be set to 16. By
default, compression-rounds is 2 and finalization-rounds is 4.

When making a Skein MAC, block-length can be 32 (to use the Skein256
hash function internally), 64 (to use Skein512) or 128 (to use
Skein1024). digest-length can be any length you want the computed
digest to be. By default, block-length is 64 and digest-length
is 64.

MAC objects support reinitialize-instance:

(reinitialize-instance mac &rest initargs &key key &allow-other-keys) => mac

The :key argument is the secret key, as provided to make-mac.

(update-mac mac thing &key &allow-other-keys) => (values)

Updates the internal state of mac with the contents of thing.
The exact method is determined by the type of thing.

There are several methods defined on this generic function that take
a particular MAC and a (simple-array (unsigned-byte 8) (*)) as
well as the usual start and end keyword arguments. These methods
update the state of mac with the subsequence of the array
denoted by start and end. They are not listed here because there's
one method for every type of MAC that Ironclad provides, and
listing them would get very tedious for no benefit. An example should
suffice.

(let* ((key (random-data 32))
       (mac (ironclad:make-mac :hmac key :sha256))
       (array (make-array 16 :element-type '(unsigned-byte 8) :initial-element 0)))
  ;; Update with 16 zeroes.
  (ironclad:update-mac mac array)
  ;; Update with 8 ones.
  (fill array 1 :start 2 :end 10)
  (ironclad:update-mac mac array :start 2 :end 10))

(produce-mac mac &key digest digest-start) => digest

Return the digest of the data processed by mac so far. The internal
state of mac is not modified; this feature makes it possible to
compute a "rolling MAC" of a document.

If digest is provided, the computed digest will be placed into
digest starting at digest-start. digest must be a
(simple-array (unsigned-byte 8) (*)). An insufficient-buffer-space
error will be signaled if there is insufficient space in digest.

The length of the digest returned by produce-mac is determined by the
kind of MAC and the extra arguments passed to make-mac:

blake2-mac: from 1 to 64 bytes (64 by default)

blake2s-mac: from 1 to 32 bytes (32 by default)

cmac: block-length of the cipher-name passed to make-mac

gmac: 16 bytes

hmac: digest-length of the digest-name passed to make-mac

poly1305: 16 bytes

siphash: digest-length passed to make-mac (8 by default)

skein-mac: digest-length passed to make-mac (64 by default)

Inquiry functions

(list-all-macs) => list

Returns a list whose elements may be validly passed to make-mac.

(mac-supported-p name) => boolean

Returns t if name would be in the list returned by list-all-macs,
nil otherwise.

Authenticated encryption

(make-authenticated-encryption-mode name &rest args) => mode

Return an authenticated encryption object suitable for use for both encryption
and decryption.

name denotes the mode to use. list-all-authenticated-encryption-modes will
tell you the names of all the supported modes. They are:

eax (Encrypt then authenticate then translate)

etm (Encrypt then MAC)

gcm (Galois counter mode)

name can be a symbol in the keyword  or ironclad packages.

args depends on the chosen authenticated encryption mode.

(make-authenticated-encryption-mode :eax &key tag cipher-name key initialization-vector)
(make-authenticated-encryption-mode :etm &key tag cipher mac)
(make-authenticated-encryption-mode :gcm &key tag cipher-name key initialization-vector)

If tag is specified, it will be used at the end of decryption (when the
handle-final-block flag is t) to check the authenticity of the data.
A bad-authentication-tag error will be signaled if the data is not authentic.
If you don't specify it, you will have to call produce-tag after decryption and
check that the tags match (e.g. using constant-time-equal).

When using EAX, key must be a suitable key for the chosen cipher-name.

When using ETM, cipher must be a cipher object created by make-cipher.
mac must be a mac object created by make-mac.

When using GCM, cipher-name must have a block-length of 16 bytes. key must be a suitable key
for the chosen cipher. The length of initialization-vector must be 12 bytes.

(process-associated-data mode data &key start end) => (values)

Update the internal state of mode with the contents of data between start
and end so that they are taken into consideration in the authentication tag.

An authenticated encryption object can be used with the encrypt, decrypt,
encrypt-message and decrypt-message functions.

(encrypt mode plaintext ciphertext &key plaintext-start plaintext-end ciphertext-start handle-final-block)
(decrypt mode ciphertext plaintext &key ciphertext-start ciphertext-end plaintext-start handle-final-block)
(encrypt-message mode message &key start end associated-data associated-data-start associated-data-end)
(decrypt-message mode message &key start end associated-data associated-data-start associated-data-end)

(produce-tag mode &key tag tag-start) => tag

Return the authentication tag of the data processed by mode so far. If tag
is provided, the computed tag will be placed into tag starting at tag-start.
tag must be a (simple-array (unsigned-byte 8) (*)). An
insufficient-buffer-space error will be signaled if there is insufficient space
in tag.

Inquiry functions

(list-all-authenticated-encryption-modes) => list

Returns a list whose elements may be validly passed to
make-authenticated-encryption-mode.

(authenticated-encryption-mode-supported-p name) => boolean

Returns t if name would be in the list returned by
list-all-authenticated-encryption-modes nil otherwise.

Key derivation functions

Ironclad comes with a few key derivation functions:

Argon2i

PBKDF1

PBKDF2

Scrypt

(derive-key kdf passphrase salt iteration-count key-length) => digest

Given a key derivation function object (produced by make-kdf),
a password and salt (both must be of type
(simple-array (unsigned-byte 8) (*))), and number of iterations,
returns the password digest as a byte array of length key-length.

Scrypt ignores the iteration-count parameter.

(make-kdf kind &key digest n r p block-count additional-key additional-data) => kdf

Returns a key derivation function instance (kind must either be
ARGON2I, PBKDF1, PBKDF2 or SCRYPT-KDF).
The Argon2i key derivation uses the block-count, additional-key
and additional-data parameters (block-count is the number of 1 KiB
memory blocks used by the function and it must be at least 8,
additional-key and additional-data are optional).
The PBKDF algorithms use digest.
The Scrypt key derivation uses cost parameters N, r and p (N
is a CPU cost parameter that must be a power of 2, r and p are
memory cost parameters that must be defined such that
r * p <= 230).

The default Scrypt parameters are N = 4096, r = 8, and p = 2.
Please note that depending on the values of N and r,
derive-key may not be able to allocate sufficient space for its
temporary arrays.

PBKDF convenience functions

Ironclad comes with convenience functions for using PBKDF1 and PBKDF2
to store passwords.

(pbkdf2-hash-password password &key salt digest iterations) => password

Convenience function for hashing passwords using the PBKDF2 algorithm.
Returns the derived hash of the password, and the original salt, as
byte vectors.

(pbkdf2-hash-password-to-combined-string password &key salt digest iterations) => password

Convenience function for hashing passwords using the PBKDF2 algorithm.
Returns the derived hash of the password as a single string that
encodes the given salt and PBKDF2 algorithm parameters.

(pbkdf2-check-password password combined-salt-and-digest) => boolean

Given a password byte vector and a combined salt and digest string
produced by pbkdf2-hash-password-to-combined-string, checks whether
the password is valid.

Public key cryptography

Ironclad includes support for a few public key cryptography algorithms.

Encryption algorithms:

Elgamal

RSA

Signature algorithms:

DSA

Ed25519

Ed448

Elgamal

RSA

Diffie-Hellman key exchange:

Curve25519

Curve448

Elgamal

Key pair generation

(generate-key-pair kind &key num-bits &allow-other-keys) => private-key, public-key

Return a key pair according to kind. The generation of DSA, Elgamal
and RSA key pairs can take some time. If kind is :dsa or :rsa,
the num-bits key argument indicating the size of the keys to
generate must be specified. If kind is :elgamal, num-bits must
be specified unless compatible-with-key is specified, in which case
the group parameters are taken from the specified key instead of being
generated.

For example, if Alice wants to generate a key pair for
a Diffie-Hellman exchange with Bob's Elgamal key pair:

(generate-key-pair :elgamal :compatible-with-key bob-public-key)

Key construction

(make-public-key kind &key &allow-other-keys) => public-key

Return a public key according to kind. The &key
arguments vary according to kind. The interesting bits are in the
methods that specialize on kind, below.

(make-public-key :curve25519 &key y) => public-key
(make-public-key :curve448 &key y) => public-key
(make-public-key :dsa &key p q g y) => public-key
(make-public-key :ed25519 &key y) => public-key
(make-public-key :ed448 &key y) => public-key
(make-public-key :elgamal &key p g y) => public-key
(make-public-key :rsa &key e n) => public-key

(make-private-key kind &key &allow-other-keys) => private-key

Return a private key according to kind. The &key arguments vary
according to kind. The interesting bits are in the methods that
specialize on kind, below.

(make-private-key :curve25519 &key x y) => private-key
(make-private-key :curve448 &key x y) => private-key
(make-private-key :dsa &key p q g y x) => private-key
(make-private-key :ed25519 &key x y) => private-key
(make-private-key :ed448 &key x y) => private-key
(make-private-key :elgamal &key p g y x) => private-key
(make-private-key :rsa &key d n) => private-key

For Curve25519, Curve448, Ed25519 and Ed448 keys, the type of the
parameters is (simple-array (unsigned-byte 8) (*)):

x, the secret key

y, the public key

For DSA and Elgamal keys, the type of the parameters is integer:

p, the prime number defining the DL group

q, the prime number defining the DL sub-group

g, the generator

y, the public key

x, the private key

For RSA keys, the type of the parameters is integer:

n, the modulus

e, the public key

d, the private key

Key destructuring

The destructure-public-key and destructure-private-key functions can
be useful if you need to store keys somewhere for future use.

(destructure-public-key public-key) => plist

Return the elements of a public key in a plist. The indicators of the
plist match the &key arguments of the make-public-key method.

(destructure-private-key private-key) => plist

Return the elements of a private key in a plist. The indicators of the
plist match the &key arguments of the make-private-key method.

Digital signatures

(sign-message key message &key start end &allow-other-keys) => signature

Return a signature of message between start and end signed with
key; the class of key determines the algorithm used to create the
signature.

Note: The sign-message does not perform the hashing of the data. You
should hash your data using your favorite hash function, and then use
this hash as the message passed to sign-message.

(verify-signature key message signature &key start end &allow-other-keys) => boolean

Verify whether signature is a valid signature of message between
start and end using key. Return t is the signature is valid
and nil otherwise.

Padding

To be secure, RSA signature requires the message to be padded.
The pss key parameter is provided to pad (or unpad) the message
during signature (or verification) with the PSS scheme of PKCS-1.
The value of the pss key parameter can be either a digest name
or t (which will use the sha1 digest).

(sign-message rsa-private-key message :pss t) => signature
(verify-signature rsa-public-key message signature :pss t) => boolean

The functions pss-encode and pss-decode can also be used by hand if
necessary.

Format of signatures

sign-message returns signatures as octet vectors. When the signature
contains several values (e.g. the R and S values of DSA signatures),
the octet vector is the concatenation of these values (e.g. the first
half of the vector is the R value, the second half is the S value).
You can use the make-signature and destructure-signature functions if
you need access to the elements of a signature (e.g. to use
a different kind of serialization).

(make-signature kind &key &allow-other-keys) => signature

Return an octet vector representing a signature. The &key arguments
vary according to kind. The interesting bits are in the methods that
specialize on kind, below.

(make-signature :dsa &key r s n-bits) => signature
(make-signature :ed25519 &key r s) => signature
(make-signature :ed448 &key r s) => signature
(make-signature :elgamal &key r s n-bits) => signature
(make-signature :rsa &key s n-bits) => signature

For Ed25519 and Ed448 signatures, the type of the parameters r and
s is (simple-array (unsigned-byte 8) (*)).

For DSA and Elgamal signatures, the type of the parameters r, s
and n-bits is integer.

For RSA signatures, the type of the parameters s and n-bits is
integer.

(destructure-signature kind signature) => plist

Return the elements of a signature in a plist. The indicators of the
plist match the &key arguments of the make-signature method.

Encryption and decryption

(encrypt-message key message &key start end &allow-other-keys) => encrypted-message

Return the message between start and end encrypted with the key;
the class of key determines the algorithm used to encrypt the message.

(decrypt-message key message &key start end n-bits &allow-other-keys) => decrypted-message

Return the message between start and end decrypted by the key;
the class of key determines the algorithm used to decrypt the message.
n-bits can be used to indicate the expected size of the decrypted
message (e.g. a small byte vector starting with zeros encrypted
without padding, which is probably a bad idea, c.f. Padding section).

Padding

To be secure, RSA encryption requires the message to be padded. The
oaep key parameter is provided to pad (or unpad) the message during
encryption (or decryption) with the OAEP scheme of PKCS-1.
The value of the oaep key parameter can be either a digest name
or t (which will use the sha1 digest).

(encrypt-message rsa-public-key message :oaep t) => encrypted-message
(decrypt-message rsa-private-key message :oaep t) => decrypted-message

The functions oaep-encode and oaep-decode can also be used by hand if
necessary.

Format of messages

encrypt-message returns encrypted messages as octet vectors. When the
message contains several values (e.g. the C1 and C2 values of Elgamal
messages), the octet vector is the concatenation of these values (e.g.
the first half of the vector is the big-endian representation of the
C1 value, the second half is the C2 value). You can use the
make-message and destructure-message functions if you need access to
the elements of a message (e.g. to use a different kind of
serialization).

(make-message kind &key &allow-other-keys) => message

Return an octet vector representing a message. The &key arguments
vary according to kind. The interesting bits are in the methods that
specialize on kind, below.

(make-message :elgamal &key c1 c2 n-bits) => message
(make-message :rsa &key m n-bits) => message

For Elgamal messages, the type of the parameters c1, c2 and
n-bits is integer.

For RSA signatures, the type of the parameters m and n-bits is
integer.

(destructure-message kind message) => plist

Return the elements of a message in a plist. The indicators of the
plist match the &key arguments of the make-message method.

Diffie-Hellman key exchange

(diffie-hellman private-key public-key) => bytes

Return a secret shared by two users Alice and Bob, computed from
Alice's private key and Bob's public key (these keys must be
compatible, i.e. have the same group parameters).

Pseudo-random number generation

The *prng* special variable indicates which pseudo-random number
generator is used by default by functions that need to generate some
random data. It defaults to a sensible OS-specific value.

The vast, vast vast number of users should just use the default
os-prng (which uses /dev/urandom on Unix and CryptGenRandom on
Windows). For users who need deterministic,
high-quality-random-seeming numbers (e.g. for Monte Carlo
simulations), fortuna-generator is provided. Finally, if you're
running on a platform without a decent PRNG (these are few and far
between now), you may require the full fortuna-prng. When in doubt,
use os-prng, which is the default.

(make-prng name &key seed) => prng

Create a pseudo-random number generator.

name denotes the style of PRNG to use. list-all-prngs will tell you
the names of all supported PRNGs. Currently supported PRNGs are:

OS

Fortuna

Fortuna-generator

name can be a symbol in the keyword package or in the ironclad
package.

seed is a seed descriptor. If nil, the PRNG will not be seeded
(which may prevent it from generating output until it is seeded,
depending on the PRNG in question). If :random then the PRNG will be
seeded with the OS's cryptographically-secure PRNG. If :urandom then
the PRNG will be seeded with the OS's fast-but-potentially-less-secure
PRNG, if available (if not, will fallback to :random). If it is
a pathname indicator, a seed will be read from the indicated file,
then a new seed will be generated and written back to the file
(over-writing the old seed). Finally, if it is a byte vector, it will
be used to seed the PRNG.

In single-threaded applications, you should very rarely need to call make-prng;
the default OS-provided PRNG should be appropriate in nearly all cases.

In multi-threaded applications, each thread that will use functions requiring
random data must have its own PRNG, or several threads might generate the same
"random" data. This can be done by binding the *prng* special variable just
after creating the threads, for example:

(make-thread (lambda ()
               (let ((crypto:*prng* (crypto:make-prng :os)))
                 (forms-for-thread-1))))

(make-thread (lambda ()
               (let ((crypto:*prng* (crypto:make-prng :os)))
                 (forms-for-thread-2))))

(list-all-prngs) => list

List all known PRNG types.

(random-data num-bytes &optional prng) => bytes

Generate num-bytes bytes of random data from prng. Updates the
state of the generator.

(random-bits num-bits &optional prng) => integer

Generate an integer with num-bits bits.

(strong-random limit &optional prng) => number

A drop-in replacement for common-lisp:random, strong-random
generates a number (an integer if limit is an integer and a float if
it is a float) between 0 and limit - 1 in an unbiased fashion.

(read-os-random-seed source &optional prng) => reseed-count

Read an OS-provided random seed (from /dev/urandom or /dev/random
on Unix; CryptGenRandom on Windows) and reseed prng.

source may be :random, which indicates /dev/random or
:urandom, which indicates /dev/urandom. On Windows,
CryptGenRandom is always used.

(read-seed path &optional prng) => t

Read enough bytes from path to reseed prng, then generate
a pseudo-random seed and write it back to path. If path doesn't
exist, calls read-os-random-seed to get a truly random seed from the
OS. Note that reseeding does not reset the generator's state to the
seed value; rather, it combines the generator's state with the seed
to form a new state.

(write-seed path &optional prng) => t

Generate enough random data to reseed prng, then write it to path.

Example

(crypto:random-data 16)
=> #(61 145 133 130 220 200 90 86 0 101 62 169 0 40 101 78)

(crypto:strong-random 16)
=> 3

(crypto:random-bits 16)
=> 41546

Fortuna

You should only use the Fortuna PRNG if your OS does not provided
a sufficiently-good PRNG. If you use a Unix or Unix-like OS (e.g.
Linux), macOS or Windows, it does. Only use the Fortuna PRNG if you
know for certain that you need it.

Fortuna is a cryptographically-secure random number presented by
Ferguson, Schneier and Kohno in Cryptography Engineering. It is
built around 32 entropy pools, which are used with decreasing
frequency for each reseed (e.g. pool 0 is used in each reseed, pool
1 in every other reseed, pool 2 in every fourth reseed and so forth).
Pools are seeded with data from up to 256 sources.

Each application should have one or more entropy sources (say, one for
each OS random number source, one for the low bits of the current
time, one for the output of a particular command or group of commands
and so forth). A source should be used to add randomness to each pool
in order, so source 0 should top up pool 0, then pool 1, and so forth
up to pool 31, then loop back to pool 1 again. Be very careful to
spread entropy across all 32 pools.

Fortuna automatically feeds entropy from the pools back into its
random state when random-data is called, using a method designed to
make it resistant to various avenues of attack; even in case of
generator compromise it will return to a safe state within a bounded
time.

For purposes of reseeding, Fortuna will not reseed until the first
pool contains 128 bits of entropy; +min-pool-size+ sets the number
of bytes this is; it defaults to a very conservative 128, meaning that
by default each byte of event is assumed to contain a single bit of
randomness.

It also will not reseed more than ten times per second.

(add-random-event source pool-id event &optional prng) => pool-length

Add entropy to prng.

source is an integer in the range 0-255 specifiying the event's
application-defined source.

pool-id is an integer in the range 0-31 specifying the pool to top
up.

event is up to 32 bytes of data (for longer events, hash them down
or break them up into chunks).

Gray streams

Ironclad includes support for several convenient stream abstractions
based on Gray streams. Gray streams support in Ironclad is included
for SBCL, CMUCL, OpenMCL/CCL, Lispworks, ABCL, ECL, Clisp and Allegro.

Octet streams

Octet streams are very similar to Common Lisp's string-stream except
they deal in octets instead of characters.

(make-octet-input-stream buffer &optional start end) => octet-input-stream

As make-string-input-stream, only with octets instead of characters.

(make-octet-output-stream) => octet-output-stream

As make-string-output-stream, only with octets instead of characters.

(get-output-stream-octets stream) => octet-vector

As get-output-stream-string, only with an octet output-steam instead
of a string output-stream.

(with-octet-input-stream ((var buffer &optional (start 0) end) &body body))

Within body, var is bound to an octet input stream. Reading from
var gives the bytes between the indexes start and end of
buffer. The result of the last form of body is returned.

(with-octet-output-stream ((var) &body body)) => bytes

Within body, var is bound to an octet output stream. After all the
forms in body have been executed, the data that has been written to
var (and that hasn't been consumed by a call to
get-output-stream-octets within body) is returned.

Digest streams

Digest streams compute a digest of the data written to them according
to a specific digest algorithm.

Example:

(defun frobbing-function (stream)
  ;; We want to compute a digest of the data being written to STREAM
  ;; without involving our callees in the process.
  (let* ((digesting-stream (crypto:make-digesting-stream :sha1))
         (stream (make-broadcast-stream stream digesting-stream)))
    ;; Feed data to STREAM.
    (frob-guts stream)
    ;; Do something with the digest computed.
    (... (crypto:produce-digest digesting-stream) ...)
    ...))

(make-digesting-stream digest &rest args) => stream

Make a stream that computes a digest of the data written to it
according to the algorithm digest. The parameters that can be used
by some algorithms can be specified as args.
produce-digest may be used to obtain a digest of all the data written
to the stream.

Note: Calling produce-digest on a digest stream does not alter
the internal state of the digest.

(with-digesting-stream (var digest-name &rest args) &body body) => digest

Within body, var is bound to a digesting stream for the
digest-name algorithm. After all the forms in body have been
executed, the digest of the data that has been written to var is
returned.

Cipher streams

Cipher streams encrypt or decrypt the data written to or read from
them according to a specific cipher algorithm.

(make-encrypting-stream stream cipher mode key &key initialization-vector direction) => stream

Make a stream wrapped around the binary stream stream that encrypts
data according to the algorithm cipher initialized with a mode,
a key and an initialization-vector.
If direction is :input, the data read from the created input
stream is the encryption of the data coming from stream.
If direction is :output, the data written to the created output
stream is encrypted before being sent to stream.

(make-decrypting-stream stream cipher mode key &key initialization-vector direction) => stream

Make a stream wrapped around the binary stream stream that decrypts
data according to the algorithm cipher initialized with a mode,
a key and an initialization-vector.
If direction is :input, the data read from the created input
stream is the decryption of the data coming from stream.
If direction is :output, the data written to the created output
stream is decrypted before being sent to stream.

Note: Only stream ciphers and block ciphers in CTR, CFB, CFB8 or OFB mode are
supported by make-encrypting-stream and make-decrypting-stream.

(with-encrypting-stream ((var stream cipher mode key &key initialization-vector direction) &body body))

Within body, var is bound to an encrypting stream. The result of
the last form of body is returned.

(with-decrypting-stream ((var stream cipher mode key &key initialization-vector direction) &body body))

Within body, var is bound to a decrypting stream. The result of
the last form of body is returned.

MAC streams

MAC streams compute a message authentication code of the data written
to them according to a specific MAC algorithm.

(make-authenticating-stream mac key &rest args) => stream

Make a stream that computes a MAC of the data written to it according
to the algorithm mac initialized with a key. The parameters used
to create the MAC can be specified as args.
produce-mac may be used to obtain a MAC of all the data written to the
stream.

Note: Calling produce-mac on a MAC stream does not alter the
internal state of the MAC.

Example: encrypt some data and compute a MAC of the ciphertext

(let* ((data ...)
       (output-stream ...)
       (encryption-key ...)
       (authentication-key ...)
       (iv ...)
       (mac-stream (make-authenticating-stream :hmac
                                               authentication-key
                                               :sha3))
       (stream (make-broadcast-stream output-stream mac-stream))
       (cipher-stream (make-encrypting-stream stream
                                              :chacha
                                              :stream
                                              encryption-key
                                              :initialization-vector iv)))
  (write-sequence data cipher-stream)
  ...
  (let ((mac (produce-mac mac-stream)))
    ...))

(with-authenticating-stream (var mac-name key &rest args) &body body) => mac

Within body, var is bound to an authenticating stream for the
mac-name algorithm. After all the forms in body have been
executed, the message authentication code of the data that has been
written to var is returned.

Utility functions

(ub16ref/le vector index) => value
(ub32ref/le vector index) => value
(ub64ref/le vector index) => value

This family of functions accesses an unsigned 16-bit, 32-bit or 64-bit
value stored in little-endian order starting at index in vector.
vector must be a (simple-array (unsigned-byte 8) (*)). These
functions are SETFable.

(ub16ref/be vector index) => value
(ub32ref/be vector index) => value
(ub64ref/be vector index) => value

As the above, only the value is stored in big-endian order.

(byte-array-to-hex-string vector &key start end element-type) => string
(hex-string-to-byte-array string &key start end) => string
(ascii-string-to-byte-array string &key start end) => vector

byte-array-to-hex-string converts the bytes of vector between
start and end into a hexadecimal string. It is useful for
converting digests to a more readable form. element-type indicates
the element-type of the returned string.

hex-string-to-byte-array parses a substring of string delimited
start and end of hexadecimal digits into a byte array.

ascii-string-to-byte-array is provided as a quick and dirty way to
convert a string to a byte array suitable for feeding to update-digest
or encrypt. Care should be taken to ensure that the provided string is
actually an ASCII string. start and end have their usual
interpretations.

(octets-to-integer octet-vec &key start end big-endian n-bits) => number
(integer-to-octets bignum &key n-bits big-endian) => vector

octets-to-integer converts the bytes of octet-vec between start
and end to an integer as though the bytes denoted a number in
base 256. big-endian is a boolean indicating whether the bytes are
to be read in big-endian or little-endian order. n-bits specifies
how many bits should be considered as significant in the resulting
number.

integer-to-octets is the reverse operation.

(expt-mod n exponent modulus) => number
(expt-mod/unsafe n exponent modulus) => number

Raises n to the exponent power modulo modulus in a more
efficient fashion than (mod (expt n exponent) modulus).
expt-mod is using the Montgomery ladder algorithm to be more robust
against timing attacks.
expt-mod/unsafe runs faster than expt-mod but is not safe against
timing attacks; don't use it on secret data.

make-random-salt &optional size => bytes

Generate a byte vector of size (default 16) random bytes, suitable
for use as a password salt.

constant-time-equal data1 data2 => boolean

Check whether the contents of the byte arrays data1 and data2 are
the same. This function runs in constant time (for a given array
length) to prevent timing attacks. It can be used to compare passwords
or MACs.

Conditions

ironclad-error

All errors signaled by Ironclad are of this type. This type is
a direct subtype of simple-error without any extra slots or options.

initialization-vector-not-supplied

This error is signaled by make-cipher when an initialization vector is
not provided and the requested mode requires an initialization vector.

invalid-initialization-vector

This error is signaled when an invalid initialization vector is
supplied to make-cipher (e.g. when the length of the initialization
vector does not match the block length of the cipher).

invalid-key-length

This error is signaled when the key provided to make-cipher is not of
an acceptable length for the requested cipher.

unsupported-cipher

This error is signaled when the cipher-name provided to make-cipher
is not cipher-supported-p.

unsupported-mode

This error is signaled when the mode provided to
make-cipher is not mode-supported-p.

unsupported-padding

This error is signaled when the padding provided to make-cipher is not
supported.

unsupported-digest

This error is signaled when the digest-name provided to
make-digest is not digest-supported-p.

unsupported-mac

This error is signaled when the mac-name provided to
make-mac is not mac-supported-p.

insufficient-buffer-space

This error is signaled when Ironclad needs to stuff some data into
a buffer (e.g. when the user provides digest to produce-digest and
there is insufficient space).

key-not-supplied

This error is signaled when a :key argument is not provided
to make-cipher.

unsupported-kdf

This error is signaled when an invalid KDF name is provided
to make-kdf.

unsupported-scrypt-cost-factors

This error is signaled when invalid Scrypt cost factors are provided
to make-kdf.

unsupported-argon2i-cost-factors

This error is signaled when invalid Argon2i parameters are provided
to make-kdf.

invalid-padding

This error is signaled when padding in a block is determined to be
invalid.

invalid-mac-parameter

This error is signaled when an invalid parameter is provided
to make-mac.

invalid-signature-length

This error is signaled when a signature with an invalid length is provided
to verify-signature or destructure-signature.

invalid-message-length

This error is signaled when a message with an invalid length is provided
to encrypt-message, decrypt-message or destructure-message.

missing-key-parameter

This error is signaled when it is determined that a parameter is
missing in a call to make-public-key or make-private-key.

missing-message-parameter

This error is signaled when it is determined that a parameter is
missing in a call to make-message.

missing-signature-parameter

This error is signaled when it is determined that a parameter is
missing in a call to make-signature.

incompatible-keys

This error is signaled when incompatible keys are provided to
diffie-hellman.

invalid-curve-point

This error is signaled when trying to use an invalid curve point.

invalid-public-key-length

This error is signaled when a public key with an invalid length is
provided to verify-signature.

oaep-decoding-error

This error is signaled when the OAEP decoding of a message fails.

unsupported-authenticated-encryption-mode

This error is signaled when an invalid mode name is provided to
make-authenticated-encryption-mode.

bad-authentication-tag

This error is signaled when the verification of authenticity of a message fails.

redpajama_set_name: RedPajamaGithub


text:
Noonan Isabelle
Art does not reproduce the visible. It makes it visible" wrote Paul Klee.
Isabelle Noonan
Isabelle Noonan, a graduate of the Louvre School, worked for several years in the Conservation and Restoration Workshop at the Whitney Museum in New York and then in Paris, where she currently lives. This dual training, historical and technical, remains a constant reference for her.
Isabelle Noonan's painting is a figurative painting that has its source in the motif and mainly in the open air. A true passion for this painter who loves nothing more than to leave with her easel, her brushes and her colours. Whether it is landscapes, urban views… it is not a question of reproducing what she sees but of reinterpreting it, of retransmitting the particular emotion she receives from it.
Perhaps the most characteristic feature of his painting is light. It is it that gives life to shapes, brings strength and beauty to even the most banal compositions, gives colours their true value…
Trained in contact with the best painters, Isabelle Noonan often participates in painting festivals in Europe or the United States. She thus feeds on encounters with other artists who share the same passion. Back in his studio, his research remains identical whether it is on still lifes, portraits, landscapes started outside or on his own compositions.
Contact: Isabelle Noonan, noonan.isabelle@gmail.com
https://isabellenoonan.com/
Melmoux Carole
by Anna Filimonova · Published 5 May 2021 · Last modified 25 May 2021
Matthews Linda
by Anna Filimonova · Published 8 April 2021 · Last modified 30 April 2021
Passemard Antonin
Next story palisin.art : We organize art-journeys in France
Previous story Sennelier ©

redpajama_set_name: RedPajamaCommonCrawl


A man, believed to be in his early 30s, was fatally stabbed and three others suffered injuries not believed to be life-threatening.
The Prime Minister has used her New Year message to say 2019 could be 'the year we put our differences aside and move forward together'.
London, Edinburgh and New York are among the cities ready to usher in the New Year with style.
Millions of people across the UK celebrated the start of the new year.
Australia and New Zealand have ushered in 2018 with spectacular firework displays as New Year celebrations begin across the globe.
New Year celebrations have begun as the clock strikes midnight in islands in Polynesia and the Central Pacific.
Cities in Samoa, Tonga and Kiribati were the first to welcome in the new year as it hit 10am on New Year's Eve in London.
The end of 2016 will be marked in parts of New Zealand shortly afterwards, while celebrations are due to begin in Sydney at 1pm London time.
Extra firearms officers will be among thousands of police on the streets of London as revellers welcome in the New Year.
People from all over the world line the streets to see the annual New Year's Day parade in London which this year was celebrating transport.


text:
Celebrity chef champions courage of children in Wales with cancer
Celebrity chef, Jean-Christophe Novelli, supporting children and young people in Wales with cancer
By Sophie Edwards @SophieEdwards_9 Trainee Community Reporter
Celebrity chef, Jean-Christophe Novelli
AN AWARD scheme recognising the courage of children and young people diagnosed with cancer has been launched.
Supported by celebrity chef, Jean-Christophe Novelli, who knows first-hand the devastating impact of cancer after his youngest son, Valentino, was diagnosed with the disease in 2016 at just six-weeks-old.
The experience is driving the dad-of-four to back the Cancer Research UK for Children and Young People Star Awards, in partnership with TK Maxx.
With around 85 children diagnosed with cancer every year in Wales, he and his partner Michelle are calling on families across the nation to nominate young cancer patients and survivors in the run up to Christmas.
The Star Awards are open to under-18s who have been diagnosed with the disease in the last five years.
There will be no judging panel due to Cancer Research UK for Children and Young People believing that every child diagnosed with cancer deserves special recognition.
Everyone nominated receives a trophy, £50 TK Maxx gift card, t-shirt and a certificate signed by a host of famous faces, including Jean-Christophe Novelli, Nanny McPheeactress Dame Emma Thompson, This Morning's Dr Ranj and children's TV favourite Mister Maker. Their siblings also receive a certificate.
Jean-Christophe watched little Valentino endure two years of intense treatment.
After Michelle spotted a lump on his neck during feeding, he was diagnosed with neuroblastoma, which is a rare cancer of nerve cells that mainly affects children under the age of five.
The cancer was stage four meaning it had spread around Valentino's body.
The four-year-old is now cancer-free, but his terrifying journey has made his parents determined to do everything they can to raise vital awareness of what children with cancer face and the importance of research into new treatments.
Chef Jean-Christophe, said: "Michelle and I were not really aware of children's cancers – it was a new area for us, but then you hear the word and it gets locked in your mind, you don't know what is going to come next.
"We were in bits and almost four years on, things will come to me and I will have a flashback even now.
"But we have been fortunate and we thank God we live in the UK with the amazing NHS.
"Knowing what Valentino went through when we heard about the Star Awards we had no hesitation to get involved immediately.
"They are such a great way to show these amazing children how special they are. "Now we want to help spread the word, so that across Wales as many children affected by cancer as possible have the opportunity to be nominated and can receive the acknowledgement they so richly deserve."
Cancer in children and young people is different to cancer in adults, from the types of cancer, to the impact of treatment, which is why Cancer Research UK for Children and Young People is supporting dedicated research to improve survival.
Cassandra Miles, Cancer Research UK spokesperson for Wales, said: "A cancer diagnosis is heart-breaking at any age, but it can be particularly difficult for a child or young person and their families, especially when many of those who survive may experience serious long-term side effects from their treatment.
"Our Star Awards shine an important light on these inspirational youngsters, so we're urging people to get nominating now so we can celebrate their incredible courage."
The Star Awards are run in partnership with TK Maxx, the biggest corporate supporter of Cancer Research UK's work into children's and young people's cancers.
Since 2004, the retailer has raised over £40 million for the charity.
Over £37m of this total has supported research to help ensure more children and young people survive cancer with a good quality of life.
To nominate a Star, visit cruk.org/starawards.


text:
Homeschool.com Advisors
Frequently Asked Questions About...
Frequently Asked Questions About Carschooling – Your Homeschooling Advisors
Frequently Asked Questions About
Carschooling®
with Diane Flynn Keith
Meet the Carschooling Expert
Diane Flynn Keith
Before she became a carschooling expert, Diane Flynn Keith was a homeschooling parent with a pair of antsy kids in the car. Now, 12 years later, Diane is a recognized voice nationally and internationally in education outside the traditional classroom walls.
When she and her husband, Cliff, decided to homeschool their two sons 12 years ago, there was a definitive void of information in this new field. She quickly sought out the "experts" in this field and, as she developed material and coached other parents, she began publishing www.Homefires.com – The Journal of Homeschooling, an online publication for parents and curriculum seekers at any level of homeschooling experience.
A featured writer for The Link, a national homeschool newspaper, Diane also is a popular speaker at education conferences and seminars where she often presents her Carschooling workshop.
Her book, Carschooling: Over 350 Entertaining Games & Activities to Turn Travel Time into Learning Time – For Kids Ages 4 to 17, is available at your local bookstore or through http://www.carschooling.com.
Here are three examples of fun Carschool curriculum!
GEOGRAPHY – Game
The first player picks the starting geographical site, usually where your trip commences. If you start in Los Angeles, that ends with the letter S, so the next player has to think of a geographical location or thing (like a city, country, mountain range or a river) that begins with S. So perhaps then, she would say, San Francisco. That ends in an O, so the third geographical item then must begin with O. So the next player might say Oregon Trail. That ends with an L, so the next player says something beginning with an L — perhaps Lima, etc. The game ends when you run out of E's and A's or when you arrive at your destination. Anything geographical is fair game. You just can't repeat items. Use mountain ranges, cities, landmarks, places (e.g. Arctic Circle, Antarctica,) continents, etc.
LANGUAGE ARTS – Game
Let your kids go fishing in the car! Give them a short dowel with a long string that has a magnet attached to it. Place magnetized letters and words into a shoebox under their feet. Tell them to fish for whatever will stick to the magnet on their dowel. When they catch a letter or word – tell them to read it out loud or use it in a sentence.
FOREIGN LANGUAGES – Game
We are studying Spanish so we like to practice when we are in the car. We pick a category like animals, numbers, colors, etc. Then we call out what we see in Spanish. For example, the category is "numbers." We take turns spotting road signs with numbers on them (like mileage or speed limit signs) and saying the number in Spanish instead of English. Or if the category is "animals" and someone sees a cow – they say vaca instead of cow. It's unbelievably fast moving, is worth a giggle or two, and has really helped us all improve.
There's more at: http://www.carschooling.com/side-c.html
What is Carschooling®?
Do you have any suggestions for books-on-tape that will appeal to a wide age range (my kids are 5, 8, and 14)?
Can you suggest a car travel game for Math?
Can you recommend a product to use in the car for storage of kids pencils, paper, games, snacks, etc.?
Q: What is Carschooling®?
A: Carschooling® is utilizing the time you spend traveling in the car to enhance your children's education. By employing travel games, audio cassettes and CD's, books-on-tape, and other resources you can practice spelling, hear classic literature, review math drills, learn state capitals and geography, listen to music, recite poetry, contemplate philosophy, improve vocabulary, tour the solar system, and much, much more. Engaging in Carschooling® leads to wonderful discussions while on the road with your family about shared learning experiences. Carschooling® provides a terrific alternative to car games like "Slug Bug" that drive parents crazy in zero to sixty seconds. So start Carschooling® and get on the real "Information Superhighway"!
Q: Do you have any suggestions for books-on-tape that will appeal to a wide age range (my kids are 5, 8, and 14)?
A: Oh, there are so many wonderful choices! My all-time favorite is Hank, The Cow Dog, a series of books-on-tape by John R. Erickson. There are over 30 stories on cassette (each available individually) about a cow dog named Hank who is the Head of Security on a Texas cattle ranch. Hank gets involved in one mysterious caper after another – like The Case of the One-Eyed Killer Stud Horse, The Case of the Fiddle-Playing Fox, and The Case of The Car-Barkaholic Dog. He regularly has run-ins with villainous types like Rip and Snort, two worthless coyotes who ply him with silage until he loses his senses and howls shamelessly at the moon. Pete, the Barn Cat, regularly steals Hanks food scraps rationed by the ranch owner's wife, Sally Mae. She tolerates Hank because he once took a rattlesnake bite to the ear — saving her little boy. The ranch owner, Hi Loper, doesn't seem to understand just how important Hank thinks he is to the smooth operation of ranch affairs – if he did, he'd certainly give him a new, non-flea-infested burlap bag to sleep on! As you can see, the cast of characters is vast and entertaining. You'll actually look forward to: the country-western singing of Junior, the buzzard; the curious charms of Madame Moonshine, the owl gypsy best known for curing Hank's case of eye-crosserosis; and the non-heroic antics of Drover, Hank's less-than-steadfast dog pal. All characterizations and narration on these tapes are performed by the author, who brings his hilarious creations to life in side-splitting episode after episode. Kids of all ages love Hank because he's funny. Adults appreciate the subtle humor and down-home insight each story provides. Tapes are $15.95/each and available from Audio Editions at 1-800-231-4261. May also be available at your local library.
Q: Can you suggest a car travel game for Math?
A: Wraps is new from Klutz Press! It's an innovative and fun way to practice math skills. Kids match up math pairs by connecting them with a string that wraps around an entire booklet filled with pages of math problems that build skills in the various math strands while improving problem solving skills. To check answers you flip the book over to see if the wrapped string lines up with the answer key printed there. Wraps are grade-specific for Math (and Reading) for K-2. There's an "Ouchless Multiplication" edition for ages 5-10 too.
Some of the best games, of course, are those that parents and kids invent themselves. Leslie Pitts, a homeschool mom in California offered this suggestion:
We used license plates in learning to round numbers. As we saw a car go by I challenged my son to " Round that number to the nearest ten (hundred, etc)." He enjoys this form of practice because it's like a game, and a speedy response is required because the cars go away so quickly.
Q: Can you recommend a product to use in the car for storage of kids pencils, paper, games, snacks, etc.?
A: One homeschool mom told me that she bought inexpensive, big, clear (see-through) plastic tubs with lids for each of her children to fill with their favorite car toys, games, cassettes, etc. She put their names on them and stored them in the trunk of her car. Each time they went on a road trip, before they got in the car, the kids looked through their tubs and pulled out the items they wanted to play with in the car. When they arrived at their destination, they put everything back in the tubs, so it would be there for the next trip.
Another parent recommended the Car Organizer offered by the Lillian Vernon catalog. This is a sturdy, nylon bag with 10 sealable pockets to fill with necessities for car trips that attaches to the back of the front seats of the car – so that the organizer faces riders in the back seat. They come in primary colors, wipe clean, and if you want to get fancy – you can even have them personalized. Cost: $12.98 Order them online at www.LillianVernon.com
Advisor's Suggested Resources
Carschooling: Over 350 Entertaining Games & Activities To Turn Travel Time Into Learning Time
Take the whine out of drive time with this collection of inventive and innovative car games that teach at the same time! Enhance your kids' education with genuinely fun and enticing activities, resources and crazy games designed to improve their skills in math, science, history, reading, grammar, and more.
"You'll be staggered by the ingenuity and imagination Diane Keith has captured in these pages. What a brain bath! What a wonderfully wacky book!"
– John Taylor Gatto, author of "Dumbing Us Down" & "The Underground History of American Education."
"Carschooling takes the humdrum world beyond the windshield and turns it into math, history, languages, science and fun, creative games. You'll never hear, 'Are we there yet?' again."
– Odds Bodkin, Storyteller and Author
Carschooling E-Mail List
This free discussion group provides an opportunity to share and discuss resources for Carschooling. Each week, parents, kids and teachers check in to the Carschooling Group to build new highways of resources and games; accelerate activity implementation; and create fun detours on existing games within the Carschooling book. Even other educative modes and homeschooling issues and questions are discussed. To Join send a blank email to: [email protected]
Carschooling Website (www.Carschooling.com)
Visit the Carschooling Website for free games and resources to use in your carschooling road trips! While Carschooling is about using ideas and resources to help children and teens learn while on the road, it is also about doing activities that help families spend meaningful time together. At the Carschooling website you'll find ideas for improving communication, building trust and good will, and bonding your family together in profound and heartfelt ways.
Carschooling is a federally Registered mark and is used with permission of the owner, Diane Flynn Keith.


text:
Q: Correcting a webhook: Zoho People to Freshbooks This is my first time posting on Stackoverflow so apologies if what I post is head-slappingly simple.
I've been trying to set-up a webhook between Zoho People and Freshbooks for the past few days. The aim is to push the email address and name of new employees from Zoho to Freshbooks. This data will populate a form emailed to the user inviting them to join me on Freshbooks as a contractor.
I've done this correctly as far as I can tell and Freshbooks and Zoho both say that the webhook is correct. They can't seem to work out why it isn't working.
The details set-up on Zoho People are:
URL to Notify - https://teachtutti.freshbooks.com/api/2.1/xml-in
Method - Post
Form Name - Music Teacher (this is where the email address and name are taken from originally by Zoho)
Entity Parameters:
   - Parameter name = email  |  Parameter value = ${email_address}
Parameters in the User Defined Format:
   - Parameter name - XML
   - Value Description:

<request method="contractor.create">
     <contractor>
        <name>${First_name} ${Last_name}</name>
        <email>${email_address}</email>
        <task_id>190354</task_id>
        <projects>

            <project>
                <project_id>49537</project_id>
            </project>
        </projects>
    </contractor>
</request>

Custom Parameters:
- authtoken = 27a8ad5004154bf19f0a6805ee8154a6
- task_id = 190354
- project_id = 49537
The preview URL that is created from all the above information is https://teachtutti.freshbooks.com/api/2.1/xml-in?email=${email_address}&XML=&authtoken=27a8ad5004154bf19f0a6805ee8154a6&task_id=190354&project_id=49537
If you type in the above URL, you'll receive the following reply:
This XML file does not appear to have any style information associated with it. The document tree is shown below.
<response xmlns="http://www.freshbooks.com/api/" status="fail">
<error>Your XML is not formatted correctly.</error>
40010
</response>

I have done everything I can think of to fix this. The project ID, task ID, authentication token, and URL to notify are all correct. I'm completely stumped!
If someone could help me fix this, I'd be eternally grateful! For what it's worth, Zoho seems to think the problem stems at Freshbooks end because they have confirmed that the data is being sent to Freshbooks. Annoyingly, I tried to go around the problem by creating the webhook at Freshbooks end, only to find out that the contractor.create api call isn't available from their end...

redpajama_set_name: RedPajamaStackExchange


text:
Q: How to assign user is a local admin of corresponding computer through GPO? I'm trying to assign user is a local admin of corresponding computer through GPO.
My case is I have 3 computers: A, B, C. And 3 users : a, b, c.
I need assign a, b, c is local admin of corresponding computer A, B, C.
I cant do for each computer, because I just can assign for all computer in one OU. Thats mean A, B, C have a general user.
So what should I do to assign each user for each computer ?
Tks all.

A: There are a couple of possiblities:

*

*Put the GPO into an OU with only one computer, it will only be applied to that machine

*Under 'security filtering', only chose the computer you want to apply it to.

*Write a script that does the assignment, this is probably the best solution.

net localgroup administrators /add Domain\User


Tribe - - Kendrick Lamar Raw Remix - FREE DOWNLOAD : https://goo.gl/71gdTr - - OB1 : https://soundcloud.com/obi1one.
Obi1- K Whore (unmastered) https://soundcloud.com/obi1one.
Beat Dj Silent Text Obi 1 Studio Smoke 2012 Obi 1 http://www.facebook.com/jazz.matazz.180 Dj Silent http://www.facebook.com/nebojsa84kg.
BEST VIEWED IN WIDE VERTICAL POSITION!!— Hi everybody! Welcome back at 23th TNL DIGITAL RELEASE :D to listen this new Tekno massive Smash!


The Alzheimer Society of Durham Region, in partnership with Impact Ajax, Town of Ajax and the Town of Whitby Mayor's Community Development Fund, is pleased to launch the Blue Umbrella Program in the municipalities of Ajax and Whitby in 2017. There are approximately 10,000 people living with dementia in Durham Region. This project aims to provide local businesses and organizations with education about dementia, and strategies to provide good customer service to people living with dementia.
the inclusion and independence of people living with dementia.
people living with dementia in the most appropriate and helpful ways.
and welcomes people living with dementia in their businesses and establishments.
LET'S MAKE OUR PARISH A "DEMENTIA FRIENDLY" COMMUNITY!


Maybe I'm getting old. I really like sensei for some reason? I'll put up a popularity vote after Yui meets everyone!
We quickly catch up as sensei's waiting some distance away at the corridor.
Confirming that we've come, sensei begins to walk.
Chako laughs "Hehehe" as we hold a light conversation.
The spring sunlight softly shines on sensei's hair.
Sensei glances in our direction while I'm captivated by his hair.
I exchange a look with Chako at his question.
To get closer to you, sensei.
Naturally, there's no way I can say that.
At sensei's words, I rack my brain in search for an answer.
Chako's eyes widen at my words.
Sensei appears thoughtful as he walks before us.
To pull the wool over these two's eyes, I chuckle.
"Haha," sensei laughs as he stops in front of the door.
This is the chemistry prep room.
Kuo-sensei teaches science so it seems he's usually here.
Following sensei who opens the door and enters, Chako and I enter the chemistry prep room.
There are 3 large office desks in the room, cluttered with things like documents and files.
It seems that all the senseis are out at the moment.
Sensei points to the two-seater leather sofa that's in close proximity once you enter the room.
Feeling somewhat fidgety, Chako and I looking around as we sit down.
As the two of us whisper to one another, sensei sits on the folding chair facing us, across a small tea table.
"How was it?", "Wasn't it cool?", Chako snorts proudly.
Her jesting appearance is cute but I feel suffocated somehow.
Looking at me like this, Chako tilts her head.
Sensei gives a deep nod at Chako's sheepish words.
Sensei, seated on the foldable chair, lets slip a laugh.
His amber eyes appear terribly lonely.
Sensei immediately erases the colour dwelling in those eyes and looks at Chako with the smile of an adult.
Chako goes, "Erm…" in surprise as she returns sensei's gaze.
She wanted to reject but the conversation progressed steadily.
Chako's eyes dart about at the unexpected development.
Sensei looks at Chako with kind eyes.
As Chako looks at me in a troubled manner, I move my head up and down, implying it's okay to borrow.
Chako alternates between looking at sensei and I for a while. After facing upwards once, she looks at sensei.
It's a smile that seems to be a mixture of gratitude and apology.
The word unconsciously leaks out when I look at that smile.
Towards I, who was captivated, Chako gives the usual "Hehehe" laugh.
Yea, that smile is cute too.
Yep yep, Chako nods all on her own.
It's a secret between the 3 of us—she laughs playfully.
Somehow, seeing Chako's various expressions warms my heart.
In this third round, I got to see expressions of Chako that I never saw before.
To capture things that don't change, the way they are.
――So that Chako can always continue smiling.
To capture things that change, after they change.
――Releasing Chako from being a familiar, giving her freedom.
Please read at the original site.
Kuo-sensei is a kind sensei who thinks of his students.
He's doing a splendid job as the homeroom teacher of Year 1 Class 2. He's also reliable, be it as a science teacher or an advisor of the club.
With this, there's no way he's not popular. Female students are always around him.
However, sensei draws a clear-cut line between himself and the students.
Even if one becomes close to sensei, you won't see her becoming close to Kuo Teppei.
Even then, I think Chako is different.
Putting aside the lending of the camera, it appears that sensei is concerned about Chako.
He probably feels that, as a phantom like her, he has to assist the parentless Chako.
Rather than as a sensei, he's watching over Chako as the phantom Kuo Teppei.
It's like a wish come true for me.
Sensei should be more concerned about Chako.
The more he knows about Chako, the more he'd want to help her.
The Strongest Phantom In This World will help Chako.
I live a school life with Chako while participating in Photography Club activities.
Before I knew it, the inter-class matches ended.
Kousuke-kun's team was in a bad condition. In this third round, he lost to Kuo-sensei's Year 1 Class 2 for the first time.
Kousuke-kun was extremely mortified but as the current Chako and I aren't very close to him, I only comforted him with a "It really was a pity".
As we're on cordial terms with sensei, the distance between Kousuke-kun and us now is the widest so far.
Because to Kousuke-kun, the existence of Chako and I who're on cordial terms with sensei merely stimulates his complex.
The month of fresh leaves, the Photography Club is hiking today to shoot the mountain scenery.
We went for several off-campus shoots but it's the first time coming to a mountain.
However, Chako seems to be in thought for some reason and isn't very excited.
Saying so, she follows behind sensei fearfully.
Even though it's just going up a mountain road, she looks around the surroundings and seems to be terribly vigilant.
Despite hearing sensei's words, it seems she can't settle down; she's stuck to sensei's back, refusing to leave.
The entire Photography Club is shocked at her state, that's unthinkable of the usual Chako.
At Chako's rare state, sensei goes: "Good grief," with a sigh. Even then, he climbs slowly for her.
I stay beside Chako for a while but she continues to be so fearful that I quickly overtake her.
With that, I turn back and wave.
Chako, who'd been walking slowly, jumps out from sensei's back and pounces towards me.
As expected of a phantom.
Reaching me in a single bound, she hugs me tightly.
Still hugging me tightly, she looks fixedly at the top of the mountain.
Those eyes are terribly vigilant.
I also look in the direction Chako's looking at. However, I only see verdant greenery there.
Perhaps she's calmed down a little; Chako lets out a soft whisper.
Her voice seems kind of hoarse so I reflexively pat her back with a tap, tap.
A Chako different from usual.
Everyone seems to be worried too. Sensei quietly kneels by Chako's side.
With her face still buried on my shoulder, Chako laughs shyly.
Chako isn't afraid of bugs.
Slightly troubled at the too obvious lie, I look at sensei. Sensei nods.
He then places his hand on her head.
The denim work cap Chako's wearing lets out a 'oof' sound.
When I slowly stand up, Chako stands too.
Then, as though nothing happened, sensei walks in front of Chako.
I hold Chako's hand and follow behind him.
Along the way, Chako grows somewhat more energetic and we climb as we chat about various things.
It's idle chatter like how the pink checkered shirt I'm wearing is cute or the striped trekking tights Chako's wearing is fashionable.
In this manner, Chako gets extremely excited when we finally reach the summit.
She raises a joyful voice at the summit.
She's so excited that it's as though it's a lie that she had been fearful thus far.
『We finally succeeded!』unconcerned that it was a simple hiking you can clear in a day, she acts as though she's reached the summit of a rather tall mountain.
Sensei and I laugh, looking at such a Chako.
Following that, we each take our own photographs.
I, too, had been taking things like the top view of the town and scenery and ladybugs on the grass, but I suddenly realise that Chako's not around.
The others are also scattered around as they take photos and sensei seems busy as he guides them.
I look around restlessly in search of Chako.
Chako doesn't seem to be nearby so I ask the other club members as I search.
When I head towards the direction I think Chako went, there's an open space once you descend a little from the summit using an animal trail.
Going there in search of Chako, she's looking up absentmindedly at a huge mountain cherry tree there.
She'd taken off the cap she was wearing just now. The two silky ponytails tied near her ears are fluttering in the wind.
Among the verdant greenery, a black-haired girl stands beneath a large mountain cherry tree.
Her deep blue eyes have a gentle colour I've never seen before.
As though I'm drawn in, I shoot that figure with the camera hanging from my neck.
The photo of Chako touching a branch of the mountain cherry tree with a gentle side profile, becomes my treasure.
just remembering (crushing an imagination) from outside chako sees as bishoujo but chako had live for several years as man.