1+ #include < mysql.h>
2+ #include < iostream>
3+ #include " openfhe.h"
4+
5+ using namespace lbcrypto ;
6+
7+ extern " C" {
8+
9+ // MySQL UDF initialization function (optional)
10+ bool hermes_udf_init (UDF_INIT* initid, UDF_ARGS* args, char * message) {
11+ return 0 ;
12+ }
13+
14+ // Cleanup function (optional)
15+ void hermes_udf_deinit (UDF_INIT* initid) {}
16+
17+ // Main UDF logic
18+ long long hermes_udf (UDF_INIT* initid, UDF_ARGS* args, char * is_null, char * error) {
19+ try {
20+ // Step 1: CryptoContext setup
21+ CCParams<CryptoContextBFVRNS> parameters;
22+ parameters.SetPlaintextModulus (65537 );
23+ parameters.SetMultiplicativeDepth (2 );
24+ CryptoContext<DCRTPoly> cc = GenCryptoContext (parameters);
25+ cc->Enable (PKE);
26+ cc->Enable (LEVELEDSHE);
27+ cc->Enable (ADVANCEDSHE); // 💥关键:EvalSum 等需要这个!
28+
29+ // Step 2: Key generation
30+ auto kp = cc->KeyGen ();
31+ cc->EvalMultKeyGen (kp.secretKey );
32+ cc->EvalSumKeyGen (kp.secretKey ); // Needed for inner product
33+
34+ // Step 3: Plaintext vectors
35+ std::vector<int64_t > v1 = {3 , 4 , 5 }; // Simulated column 1
36+ std::vector<int64_t > v2 = {6 , 7 , 8 }; // Simulated column 2
37+
38+ auto pt1 = cc->MakePackedPlaintext (v1);
39+ auto pt2 = cc->MakePackedPlaintext (v2);
40+
41+ // Step 4: Encrypt
42+ auto ct1 = cc->Encrypt (kp.publicKey , pt1);
43+ auto ct2 = cc->Encrypt (kp.publicKey , pt2);
44+
45+ // Step 5: Multiply elementwise
46+ auto ct_mul = cc->EvalMult (ct1, ct2);
47+
48+ // Step 6: Sum all slots to get inner product
49+ auto ct_inner = cc->EvalSum (ct_mul, v1.size ());
50+
51+ // Step 7: Decrypt
52+ Plaintext pt_result;
53+ cc->Decrypt (kp.secretKey , ct_inner, &pt_result);
54+ pt_result->SetLength (1 ); // All slots contain the same inner product after EvalSum
55+
56+ int64_t result = pt_result->GetPackedValue ()[0 ];
57+
58+ std::cerr << " [hermes_udf] Inner product = " << result << std::endl;
59+
60+ return result;
61+
62+ } catch (const std::exception& e) {
63+ std::cerr << " [hermes_udf] Exception: " << e.what () << std::endl;
64+ *is_null = 1 ;
65+ return 0 ;
66+ } catch (...) {
67+ std::cerr << " [hermes_udf] Unknown error" << std::endl;
68+ *is_null = 1 ;
69+ return 0 ;
70+ }
71+ }
72+
73+ }
0 commit comments