-
Notifications
You must be signed in to change notification settings - Fork 141
Open
Description
While encrypting a message M with an AES key A, if generted another AES key B on the same slot. It is possible to decrypt the encrypted message with key B. Am I missing something and this is intended or I'm missusing it? otherwise we need to fix this ASAP!
Here it is the example I'm using to try this out:
package main
import (
"bytes"
"crypto/rand"
"encoding/base64"
"encoding/binary"
"fmt"
"log"
"github.com/miekg/pkcs11"
)
const (
pin = "1234"
)
var ()
func main() {
// Init PKCS
p := pkcs11.New("/usr/local/lib/softhsm/libsofthsm2.so")
err := p.Initialize()
if err != nil {
panic(err)
}
defer p.Destroy()
defer p.Finalize()
slots, err := p.GetSlotList(true)
if err != nil {
panic(err)
}
session, err := p.OpenSession(slots[0], pkcs11.CKF_SERIAL_SESSION|pkcs11.CKF_RW_SESSION)
if err != nil {
panic(err)
}
defer p.CloseSession(session)
err = p.Login(session, pkcs11.CKU_USER, pin)
if err != nil {
panic(err)
}
defer p.Logout(session)
info, err := p.GetInfo()
if err != nil {
panic(err)
}
fmt.Printf("CryptokiVersion.Major %v", info.CryptokiVersion.Major)
fmt.Println()
// 1. Create AES key, test encryption and decryption
// first lookup the key
buf := new(bytes.Buffer)
var num uint16 = 1
err = binary.Write(buf, binary.LittleEndian, num)
if err != nil {
fmt.Println("binary.Write failed:", err)
}
id := buf.Bytes()
fmt.Println("1 id", id)
aesKeyTemplate := []*pkcs11.Attribute{
pkcs11.NewAttribute(pkcs11.CKA_CLASS, pkcs11.CKO_SECRET_KEY),
pkcs11.NewAttribute(pkcs11.CKA_KEY_TYPE, pkcs11.CKK_AES),
pkcs11.NewAttribute(pkcs11.CKA_ENCRYPT, true),
pkcs11.NewAttribute(pkcs11.CKA_DECRYPT, true),
pkcs11.NewAttribute(pkcs11.CKA_WRAP, false),
pkcs11.NewAttribute(pkcs11.CKA_UNWRAP, false),
pkcs11.NewAttribute(pkcs11.CKA_VERIFY, false),
pkcs11.NewAttribute(pkcs11.CKA_TOKEN, true),
pkcs11.NewAttribute(pkcs11.CKA_PRIVATE, true),
pkcs11.NewAttribute(pkcs11.CKA_EXTRACTABLE, false), // we don't need to extract this..
pkcs11.NewAttribute(pkcs11.CKA_SENSITIVE, true),
pkcs11.NewAttribute(pkcs11.CKA_VALUE, make([]byte, 32)), /* KeyLength */
pkcs11.NewAttribute(pkcs11.CKA_LABEL, "AESKey"), /* Name of Key */
pkcs11.NewAttribute(pkcs11.CKA_ID, id),
}
aesKey, err := p.CreateObject(session, aesKeyTemplate)
buf = new(bytes.Buffer)
err = binary.Write(buf, binary.LittleEndian, 243124124)
if err != nil {
fmt.Println("binary.Write failed:", err)
}
id2 := buf.Bytes()
fmt.Println("2 id", id2)
aesKeyTemplate2 := []*pkcs11.Attribute{
pkcs11.NewAttribute(pkcs11.CKA_CLASS, pkcs11.CKO_SECRET_KEY),
pkcs11.NewAttribute(pkcs11.CKA_KEY_TYPE, pkcs11.CKK_AES),
pkcs11.NewAttribute(pkcs11.CKA_ENCRYPT, true),
pkcs11.NewAttribute(pkcs11.CKA_DECRYPT, true),
pkcs11.NewAttribute(pkcs11.CKA_WRAP, false),
pkcs11.NewAttribute(pkcs11.CKA_UNWRAP, false),
pkcs11.NewAttribute(pkcs11.CKA_VERIFY, false),
pkcs11.NewAttribute(pkcs11.CKA_TOKEN, true),
pkcs11.NewAttribute(pkcs11.CKA_PRIVATE, true),
pkcs11.NewAttribute(pkcs11.CKA_EXTRACTABLE, false), // we don't need to extract this..
pkcs11.NewAttribute(pkcs11.CKA_SENSITIVE, true),
pkcs11.NewAttribute(pkcs11.CKA_VALUE, make([]byte, 32)), /* KeyLength */
pkcs11.NewAttribute(pkcs11.CKA_LABEL, "AESKey2"), /* Name of Key */
pkcs11.NewAttribute(pkcs11.CKA_ID, id2),
}
fmt.Println("!")
aesKey2, err := p.CreateObject(session, aesKeyTemplate2)
if err != nil {
panic(fmt.Sprintf("GenerateKey() failed %s\n", err))
}
log.Printf("Created AES Key: %v", aesKey, aesKey2)
ktemplate := []*pkcs11.Attribute{
pkcs11.NewAttribute(pkcs11.CKA_CLASS, pkcs11.CKO_SECRET_KEY),
pkcs11.NewAttribute(pkcs11.CKA_ID, id),
pkcs11.NewAttribute(pkcs11.CKA_LABEL, "AESKey"),
}
if err := p.FindObjectsInit(session, ktemplate); err != nil {
panic(err)
}
kobjs, _, err := p.FindObjects(session, 1)
if err != nil {
panic(err)
}
if err = p.FindObjectsFinal(session); err != nil {
panic(err)
}
iv := make([]byte, 16)
_, err = rand.Read(iv)
if err != nil {
panic(err)
}
err = p.EncryptInit(session, []*pkcs11.Mechanism{pkcs11.NewMechanism(pkcs11.CKM_AES_CBC_PAD, iv)}, kobjs[0])
if err != nil {
panic(fmt.Sprintf("EncryptInit() failed %s\n", err))
}
ct, err := p.Encrypt(session, []byte("foo"))
if err != nil {
panic(fmt.Sprintf("Encrypt() failed %s\n", err))
}
// append the IV to the ciphertext
cdWithIV := append(iv, ct...)
log.Printf("Encrypted IV+Ciphertext %s", base64.RawStdEncoding.EncodeToString(cdWithIV))
ktemplate = []*pkcs11.Attribute{
pkcs11.NewAttribute(pkcs11.CKA_CLASS, pkcs11.CKO_SECRET_KEY),
pkcs11.NewAttribute(pkcs11.CKA_ID, id2),
pkcs11.NewAttribute(pkcs11.CKA_LABEL, "AESKey2"),
}
if err := p.FindObjectsInit(session, ktemplate); err != nil {
panic(err)
}
kobjs2, _, err := p.FindObjects(session, 1)
if err != nil {
panic(err)
}
if err = p.FindObjectsFinal(session); err != nil {
panic(err)
}
fmt.Println(kobjs[0], kobjs2[0])
err = p.DecryptInit(session, []*pkcs11.Mechanism{pkcs11.NewMechanism(pkcs11.CKM_AES_CBC_PAD, cdWithIV[0:16])}, kobjs2[0])
if err != nil {
panic(fmt.Sprintf("EncryptInit() failed %s\n", err))
}
pt, err := p.Decrypt(session, ct[:16])
if err != nil {
panic(fmt.Sprintf("Encrypt() failed %s\n", err))
}
log.Printf("Decrypt %s", string(pt))
}
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels