blob: febe2f93551f5e3f4fd76826d2f16255b47720d7 [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
package crypto
import (
"encoding/hex"
"fmt"
"testing"
"github.com/stretchr/testify/assert"
)
func Test_Mine2(t *testing.T) {
// Generate keys
sikePK, _ := hex.DecodeString("f013ed197f8d2756eb7fb237bfe6714ec0d3f12ddc7431b8881f4bece686cafa67e9cfcfc75d5117114e857b379b1fe6b0e67f11dc7936d4ed4e8c3488b2300a80b12e3bee303b2d1e5d24c2c9b3e5855aeddfa45508e587f71a95c23d643523bf8385a7d830254b6ac7f231cf945795311ad8915da9605ff5e6543a01b923e924b37d7d2e464d7a9d78cc5ad4b456fc735ff7d60bd9225558bbad053a3d724a82d3a77348d4aac4296c6f79e0db21a49695e158abf16724e635b930e2704620eccdc1aab49d0655f7ca1eb36ba8c99129b2de8bee6e843a849b802b90775090a7617dc6e4a9ef289c0eac292cc00a80f9a76df2471695e9c433337c649acacc4ba0a2a5f80ccb594553861161cb4771bceabc4cb430bf233307e54f3ebbc0291e75db9cac6d9760e39cd39f373d8e852cac56585bbdf0167c62f728e2889d8387abc0b25f40f990dc7efd93d17839f04ad1e8f3dbe6b518f4f629d69ac7ce04ea614b977a60deb2148fd8e32dfe690da6bfd2aa614dd60688a86989e80cb718f69fa0d02d1ee9796510a9cb523e03fa3ad2a083fb42d11df0e5584873a80b86725d806fbaee92bd35ba2548a79a1a477ea1b1c5d4e33434db2b25ffd6713c887d25e774a0b7c6ca039fcf9e527739449a918d9c884dadf6ac1f11d9cc235a44ff9f69d568c7e5e1999d0353f37710ce71d5f59f756c9a89cd7fe318ebecb1ba7e408171da3e516a1e0e6bef2379e6b519986d6e75e720be3a8892ade537926760a60b011ef627db482a7edfce13fcc767f1eb1c")
sikeSK, _ := hex.DecodeString("5a8ac3a8704ac0b906f905cbfbf62acf81046b9f7f24e7f95b43a62c37d483c7110fd01e31fe6961421b50a0672a0450153894a9a221bb62d059d7e5589e4765e93c6d5bc713fc822f44276b2eab4700f013ed197f8d2756eb7fb237bfe6714ec0d3f12ddc7431b8881f4bece686cafa67e9cfcfc75d5117114e857b379b1fe6b0e67f11dc7936d4ed4e8c3488b2300a80b12e3bee303b2d1e5d24c2c9b3e5855aeddfa45508e587f71a95c23d643523bf8385a7d830254b6ac7f231cf945795311ad8915da9605ff5e6543a01b923e924b37d7d2e464d7a9d78cc5ad4b456fc735ff7d60bd9225558bbad053a3d724a82d3a77348d4aac4296c6f79e0db21a49695e158abf16724e635b930e2704620eccdc1aab49d0655f7ca1eb36ba8c99129b2de8bee6e843a849b802b90775090a7617dc6e4a9ef289c0eac292cc00a80f9a76df2471695e9c433337c649acacc4ba0a2a5f80ccb594553861161cb4771bceabc4cb430bf233307e54f3ebbc0291e75db9cac6d9760e39cd39f373d8e852cac56585bbdf0167c62f728e2889d8387abc0b25f40f990dc7efd93d17839f04ad1e8f3dbe6b518f4f629d69ac7ce04ea614b977a60deb2148fd8e32dfe690da6bfd2aa614dd60688a86989e80cb718f69fa0d02d1ee9796510a9cb523e03fa3ad2a083fb42d11df0e5584873a80b86725d806fbaee92bd35ba2548a79a1a477ea1b1c5d4e33434db2b25ffd6713c887d25e774a0b7c6ca039fcf9e527739449a918d9c884dadf6ac1f11d9cc235a44ff9f69d568c7e5e1999d0353f37710ce71d5f59f756c9a89cd7fe318ebecb1ba7e408171da3e516a1e0e6bef2379e6b519986d6e75e720be3a8892ade537926760a60b011ef627db482a7edfce13fcc767f1eb1c")
secret, _ := hex.DecodeString("5a8ac3a8704ac0b906f905cbfbf62acf81046b9f7f24e7f95b43a62c37d483c7110fd01e31fe6961421")
final, _ := hex.DecodeString("5a8ac3a8704ac0b906f905cbfbf62acf81046b9f7f24e7f95b43a62c37d483c7110fd01e31fe6961421")
iv, _ := hex.DecodeString("9640061f9e3c29fdd52945feb678de83")
_, cipherText, encapsulatedKey := EncapsulateEncrypt(secret, iv, sikePK)
println(encapsulatedKey)
println(cipherText)
encapsulatedKeyHex := hex.EncodeToString(encapsulatedKey)
cipherTextHex := hex.EncodeToString(cipherText)
fmt.Printf("encapsulatedKey : %s \n", encapsulatedKeyHex)
fmt.Printf("BLSscipherTextk : %s \n", cipherTextHex)
_, aes := DecapsulateDecrypt(cipherText, iv, sikeSK, encapsulatedKey)
print(hex.EncodeToString(aes))
assert.Equal(t, aes, final, "Secret doesnt match")
}
func Test_Mine(t *testing.T) {
SEEDHex := "2c82c5a6b14f6ce0fca9b83e929f6ca091fb25b6648676b3c387e8a13b0f4cee92a54d42e388db3fbb0e906b32e880f4"
SEED, _ := hex.DecodeString(SEEDHex)
// Generate SIKE keys
RC1, SIKEpk, SIKEsk := SIKEKeys(SEED)
if RC1 != 0 {
fmt.Println("Panicking!")
panic("Failed to create SIKE keys")
}
// Generate BLS keys
RC1, BLSpk, BLSsk := BLSKeys(SEED, nil)
if RC1 != 0 {
fmt.Println("Panicking!")
panic("Failed to create BLS keys")
}
SIKEpkHex := hex.EncodeToString(SIKEpk)
SIKEskHex := hex.EncodeToString(SIKEsk)
fmt.Printf("SIKEpk : %s \n", SIKEpkHex)
fmt.Printf("SIKEsk : %s \n", SIKEskHex)
BLSpkHex := hex.EncodeToString(BLSpk)
BLSskHex := hex.EncodeToString(BLSsk)
fmt.Printf("BLSpk : %s \n", BLSpkHex)
fmt.Printf("BLSsk : %s \n", BLSskHex)
secret, _ := hex.DecodeString("79e54957d823668872b41f6bd6394a2132935902bc9c9192474562d58225e129")
iv, _ := hex.DecodeString("f7427ca6749f696c0dab97582b96222f")
_, cipherText, encapsulatedKey := EncapsulateEncrypt(secret, iv, SIKEpk)
println(encapsulatedKey)
println(cipherText)
encapsulatedKeyHex := hex.EncodeToString(encapsulatedKey)
cipherTextHex := hex.EncodeToString(cipherText)
fmt.Printf("encapsulatedKey : %s \n", encapsulatedKeyHex)
fmt.Printf("BLSscipherTextk : %s \n", cipherTextHex)
_, aes := DecapsulateDecrypt(cipherText, iv, SIKEsk, encapsulatedKey)
print(hex.EncodeToString(aes))
assert.Equal(t, aes, secret, "Secret doesnt match")
}
func Test_Smoke_Test(t *testing.T) {
SEEDHex := "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f30"
SEED, _ := hex.DecodeString(SEEDHex)
// AES-256 Key
KHex := "af5f8452d644d131c35164fee8c8300fb29725b03b00eaef411c823293c469d8"
// AES IVs
IV1Hex := "de4724534df5f50160a28cf3b3caec80"
IV2Hex := "a08576336500e79b2593dc4c10b0f36c"
// Messsage to encrypt and sign. Note it is zero padded.
PHex := "48656c6c6f20426f622120546869732069732061206d6573736167652066726f6d20416c696365000000000000000000"
// Generate SIKE keys
RC1, SIKEpk, SIKEsk := SIKEKeys(SEED)
if RC1 != 0 {
fmt.Println("Panicking!")
panic("Failed to create SIKE keys")
}
// Generate BLS keys
RC1, BLSpk, BLSsk := BLSKeys(SEED, nil)
if RC1 != 0 {
fmt.Println("Panicking!")
panic("Failed to create BLS keys")
}
SIKEpkHex := hex.EncodeToString(SIKEpk)
SIKEskHex := hex.EncodeToString(SIKEsk)
fmt.Printf("SIKEpk : %s \n", SIKEpkHex)
fmt.Printf("SIKEsk : %s \n", SIKEskHex)
BLSpkHex := hex.EncodeToString(BLSpk)
BLSskHex := hex.EncodeToString(BLSsk)
fmt.Printf("BLSpk : %s \n", BLSpkHex)
fmt.Printf("BLSsk : %s \n", BLSskHex)
// Encrypt message
K, _ := hex.DecodeString(KHex)
IV1, _ := hex.DecodeString(IV1Hex)
P1, _ := hex.DecodeString(PHex)
fmt.Printf("P1 : %s \n", P1)
C1 := AESCBCEncrypt(K, IV1, P1)
C1Hex := hex.EncodeToString(C1)
fmt.Printf("C1Hex : %s \n", C1Hex)
// Encrypt AES Key, K, and returned encapsulated key used for
// encryption
IV2, _ := hex.DecodeString(IV2Hex)
P2 := K
P2Hex := hex.EncodeToString(P2)
fmt.Printf("P2Hex : %s \n", P2Hex)
RC2, C2, EK := EncapsulateEncrypt(P2, IV2, SIKEpk)
if RC2 != 0 {
fmt.Println("Panicking!")
panic("Failed to encrypt and encapsulate key")
}
C2Hex := hex.EncodeToString(C2)
fmt.Printf("C2Hex : %s \n", C2Hex)
EKHex := hex.EncodeToString(EK)
fmt.Printf("EKHex : %s \n", EKHex)
// Decapsulate the AES Key and use it to decrypt the ciphertext.
// P2 and P3 should be the same. This value is the AES-256 key
// used to encrypt the plaintext P1
RC3, P3 := DecapsulateDecrypt(C2, IV2, SIKEsk, EK)
if RC3 != 0 {
fmt.Println("Panicking!")
panic("Failed to decapsulate key and decrypt ciphertext")
}
P3Hex := hex.EncodeToString(P3)
fmt.Printf("P3Hex : %s \n", P3Hex)
// Decrypt the ciphertext to recover the orignal plaintext
// contained in P1
K2 := P3
P4 := AESCBCDecrypt(K2, IV1, C1)
fmt.Printf("P4 : %s \n", P4)
// BLS Sign a message
RC5, S := BLSSign(P1, BLSsk)
if RC5 != 0 {
fmt.Println("Panicking!")
panic("Failed to sign message")
}
SHex := hex.EncodeToString(S)
fmt.Printf("S : %s \n", SHex)
// BLS Verify signature
RC6 := BLSVerify(P1, BLSpk, S)
if RC6 != 0 {
fmt.Println("Panicking!")
panic("Failed to verify signature")
} else {
fmt.Println("Signature Verified")
}
}
func TestPQNIST_AES_CBC_ENCRYPT(t *testing.T) {
KHex := "6ed76d2d97c69fd1339589523931f2a6cff554b15f738f21ec72dd97a7330907"
IVHex := "851e8764776e6796aab722dbb644ace8"
PHex := "6282b8c05c5c1530b97d4816ca434762"
want := "6acc04142e100a65f51b97adf5172c41"
K, _ := hex.DecodeString(KHex)
IV, _ := hex.DecodeString(IVHex)
P, _ := hex.DecodeString(PHex)
C := AESCBCEncrypt(K, IV, P)
got := hex.EncodeToString(C)
fmt.Printf("C1 : %s \n", want)
fmt.Printf("C2 : %s \n", got)
// verify
assert.Equal(t, want, got, "Should be equal")
}
func TestPQNIST_AES_CBC_DECRYPT(t *testing.T) {
KHex := "43e953b2aea08a3ad52d182f58c72b9c60fbe4a9ca46a3cb89e3863845e22c9e"
IVHex := "ddbbb0173f1e2deb2394a62aa2a0240e"
CHex := "d51d19ded5ca4ae14b2b20b027ffb020"
want := "07270d0e63aa36daed8c6ade13ac1af1"
K, _ := hex.DecodeString(KHex)
IV, _ := hex.DecodeString(IVHex)
C, _ := hex.DecodeString(CHex)
P := AESCBCDecrypt(K, IV, C)
got := hex.EncodeToString(P)
fmt.Printf("P1 : %s \n", want)
fmt.Printf("P2 : %s \n", got)
// verify
assert.Equal(t, want, got, "Should be equal")
}
func TestENCAP_DECAP(t *testing.T) {
SEEDHex := "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f30"
SEED, _ := hex.DecodeString(SEEDHex)
RC1, SIKEpk, SIKEsk := SIKEKeys(SEED)
assert.Equal(t, 0, RC1, "Should be equal")
SIKEpkHex := hex.EncodeToString(SIKEpk)
SIKEskHex := hex.EncodeToString(SIKEsk)
fmt.Printf("BLSpk : %s \n", SIKEpkHex)
fmt.Printf("BLSsk : %s \n", SIKEskHex)
IVHex := "851e8764776e6796aab722dbb644ace8"
want := "6282b8c05c5c1530b97d4816ca434762"
IV, _ := hex.DecodeString(IVHex)
P, _ := hex.DecodeString(want)
RC2, C, EK := EncapsulateEncrypt(P, IV, SIKEpk)
assert.Equal(t, 0, RC2, "Should be equal")
CHex := hex.EncodeToString(C)
fmt.Printf("C : %s \n", CHex)
EKHex := hex.EncodeToString(EK)
fmt.Printf("EK : %s \n", EKHex)
RC3, P2 := DecapsulateDecrypt(C, IV, SIKEsk, EK)
assert.Equal(t, 0, RC3, "Should be equal")
got := hex.EncodeToString(P2)
fmt.Printf("want : %s \n", want)
fmt.Printf("got : %s \n", got)
assert.Equal(t, want, got, "Should be equal")
}
func TestBLS(t *testing.T) {
seedHex := "3370f613c4fe81130b846483c99c032c17dcc1904806cc719ed824351c87b0485c05089aa34ba1e1c6bfb6d72269b150"
seed, _ := hex.DecodeString(seedHex)
messageStr := "test message"
message := []byte(messageStr)
RC1, pk1, sk1 := BLSKeys(seed, nil)
assert.Equal(t, 0, RC1, "Should be equal")
pk1Hex := hex.EncodeToString(pk1)
sk1Hex := hex.EncodeToString(sk1)
fmt.Printf("pk1: %s \n", pk1Hex)
fmt.Printf("sk1: %s \n", sk1Hex)
RC2, sig1 := BLSSign(message, sk1)
assert.Equal(t, 0, RC2, "Should be equal")
sig1Hex := hex.EncodeToString(sig1)
fmt.Printf("sig1: %s \n", sig1Hex)
want := 0
got := BLSVerify(message, pk1, sig1)
assert.Equal(t, want, got, "Should be equal")
}
func TestBLSADD(t *testing.T) {
seed1Hex := "3370f613c4fe81130b846483c99c032c17dcc1904806cc719ed824351c87b0485c05089aa34ba1e1c6bfb6d72269b150"
seed2Hex := "46389f32b7cdebbbc46b7165d8fae888c9de444898390a939977e1a066256a6f465e7d76307178aef81ae0c6841f9b7c"
seed1, _ := hex.DecodeString(seed1Hex)
seed2, _ := hex.DecodeString(seed2Hex)
messageStr := "test message"
message := []byte(messageStr)
pk12GoldenHex := "0fff41dc3b28fee38f564158f9e391a5c6ac42179fcccdf5ee4513030b6d59900a832f9a886b2407dc8b0a3b51921326123d3974bd1864fb22f5a84e83f1f9f611ee082ed5bd6ca896d464f12907ba8acdf15c44f9cff2a2dbb3b32259a1fe4f11d470158066087363df20a11144d6521cf72dca1a7514154a95c7fe73b219989cc40d7fc7e0b97854fc3123c0cf50ae0452730996a5cb24641aff7102fcbb2af705d0f32d5787ca1c3654e4ae6aa59106e1e22e29018ba7c341f1e6472f800f"
sig12GoldenHex := "0203799dc2941b810985d9eb694a5be4a1ad5817f9e5d7c31870bb9fb471f7353eafacdc548544f9e7b78a0a9372c63ab0"
pk12Golden, _ := hex.DecodeString(pk12GoldenHex)
sig12Golden, _ := hex.DecodeString(sig12GoldenHex)
RC1, pktmp, sktmp := BLSKeys(seed1, nil)
assert.Equal(t, 0, RC1, "Should be equal")
RC1, pk1, sk1 := BLSKeys(nil, sktmp)
assert.Equal(t, 0, RC1, "Should be equal")
assert.Equal(t, pktmp, pk1, "Should be equal")
assert.Equal(t, sktmp, sk1, "Should be equal")
RC2, pk2, sk2 := BLSKeys(seed2, nil)
assert.Equal(t, 0, RC2, "Should be equal")
RC3, sig1 := BLSSign(message, sk1)
assert.Equal(t, 0, RC3, "Should be equal")
RC4, sig2 := BLSSign(message, sk2)
assert.Equal(t, 0, RC4, "Should be equal")
RC5 := BLSVerify(message, pk1, sig1)
assert.Equal(t, 0, RC5, "Should be equal")
RC6 := BLSVerify(message, pk2, sig2)
assert.Equal(t, 0, RC6, "Should be equal")
RC7, sig12 := BLSAddG1(sig1, sig2)
assert.Equal(t, 0, RC7, "Should be equal")
RC8, pk12 := BLSAddG2(pk1, pk2)
assert.Equal(t, 0, RC8, "Should be equal")
RC9 := BLSVerify(message, pk12, sig12)
assert.Equal(t, 0, RC9, "Should be equal")
pk12Hex := hex.EncodeToString(pk12)
fmt.Printf("pk12Hex: %s \n", pk12Hex)
fmt.Printf("pk12GoldenHex: %s \n", pk12GoldenHex)
sig12Hex := hex.EncodeToString(sig12)
fmt.Printf("sig12Hex: %s \n", sig12Hex)
fmt.Printf("sig12GoldenHex: %s \n", sig12GoldenHex)
assert.Equal(t, pk12, pk12Golden, "Should be equal")
assert.Equal(t, sig12, sig12Golden, "Should be equal")
}
func TestBLSSSS(t *testing.T) {
seed1Hex := "3370f613c4fe81130b846483c99c032c17dcc1904806cc719ed824351c87b0485c05089aa34ba1e1c6bfb6d72269b150"
seed2Hex := "46389f32b7cdebbbc46b7165d8fae888c9de444898390a939977e1a066256a6f465e7d76307178aef81ae0c6841f9b7c"
seed1, _ := hex.DecodeString(seed1Hex)
seed2, _ := hex.DecodeString(seed2Hex)
messageStr := "test message"
message := []byte(messageStr)
const k int = 3
const n int = 4
sigGoldenHex := "03108b67f20b138e3080208efae105e31868ac34212bf03d80050d01de13a2c52b8bc3eafa3589045aebf11ec00dcf91f3 "
xGoldenHex := "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004"
yGoldenHex := "0000000000000000000000000000000069f67565fd82de218a8b743b5516f948a72500ac3beb3ba072908cad2a146a91000000000000000000000000000000005f6f919d81a63fd53406794ae714b95a705c51de8001ef16f3f869dc515dcb3d000000000000000000000000000000005ce9d01ed92320a6d7aa195ca74db9735cdbe1ed55a3d026b4736792ee08852500000000000000000000000000000000626530ea03f980967576547095c1f9936ca3b0d8bcd0decfb40185d100149849"
ysigsGoldenHex := "0202982b889c082f159a7d8720d8d33a42005f13af0906763383fdce13607d9c0a2672f04c4600b36dd8a7f272c03908760210c06e79b26ee842c31d4ff8ce68d30da4247c7ab1c6162c011dada87b211f7172628ef78a39e61549c9f7b05245a7010316518c690e15de48fdb512bd47180925da7b3320bc52bdb5a239fad77cb975ede4aea20bef0bd570c50dc27240864564030ad08e4a60a0f330588f60f0a6535e79a99dd3c74af22f7b1137a01db65c95bd100745a2c0d5968e1a8ea5b4f3ce3736"
sigGolden, _ := hex.DecodeString(sigGoldenHex)
xGolden, _ := hex.DecodeString(xGoldenHex)
yGolden, _ := hex.DecodeString(yGoldenHex)
ysigsGolden, _ := hex.DecodeString(ysigsGoldenHex)
RC1, pki, ski := BLSKeys(seed1, nil)
assert.Equal(t, 0, RC1, "Should be equal")
RC2, sigi := BLSSign(message, ski)
assert.Equal(t, 0, RC2, "Should be equal")
RC3 := BLSVerify(message, pki, sigi)
assert.Equal(t, 0, RC3, "Should be equal")
// y is an array of BLS secret keys
RC4, x, y, sko := BLSMakeShares(k, n, seed2, ski)
assert.Equal(t, 0, RC4, "Should be equal")
assert.Equal(t, ski, sko, "Should be equal")
xHex := hex.EncodeToString(x)
fmt.Printf("xHex: %s \n", xHex)
fmt.Printf("xGoldenHex: %s \n", xGoldenHex)
yHex := hex.EncodeToString(y)
fmt.Printf("yHex: %s \n", yHex)
fmt.Printf("yGoldenHex: %s \n", yGoldenHex)
assert.Equal(t, x, xGolden, "Should be equal")
assert.Equal(t, y, yGolden, "Should be equal")
var ys [n][]byte
for i := 0; i < n; i++ {
ys[i] = y[(i * BGSBLS381):((i + 1) * BGSBLS381)]
ysHex := hex.EncodeToString(ys[i])
fmt.Printf("ys[%d]: %s \n", i, ysHex)
}
// Generate signatures from shares
var sigs [n][]byte
var RC5 int
var ysigs []byte
for i := 0; i < n; i++ {
RC5, sigs[i] = BLSSign(message, ys[i])
assert.Equal(t, 0, RC5, "Should be equal")
sigsHex := hex.EncodeToString(sigs[i])
fmt.Printf("sigs[%d]: %s \n", i, sigsHex)
ysigs = append(ysigs, sigs[i]...)
}
ysigsHex := hex.EncodeToString(ysigs)
fmt.Printf("ysigs %s \n", ysigsHex)
assert.Equal(t, ysigs, ysigsGolden, "Should be equal")
RC7, sigr := BLSRecoverSignature(k, x, ysigs)
assert.Equal(t, 0, RC7, "Should be equal")
sigrHex := hex.EncodeToString(sigr)
fmt.Printf("sigr: %s \n", sigrHex)
assert.Equal(t, sigr, sigGolden, "Should be equal")
}