github.com/apache/arrow/go/v14@v14.0.2/parquet/internal/encryption/key_handling.go (about)

     1  // Licensed to the Apache Software Foundation (ASF) under one
     2  // or more contributor license agreements.  See the NOTICE file
     3  // distributed with this work for additional information
     4  // regarding copyright ownership.  The ASF licenses this file
     5  // to you under the Apache License, Version 2.0 (the
     6  // "License"); you may not use this file except in compliance
     7  // with the License.  You may obtain a copy of the License at
     8  //
     9  // http://www.apache.org/licenses/LICENSE-2.0
    10  //
    11  // Unless required by applicable law or agreed to in writing, software
    12  // distributed under the License is distributed on an "AS IS" BASIS,
    13  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    14  // See the License for the specific language governing permissions and
    15  // limitations under the License.
    16  
    17  package encryption
    18  
    19  import (
    20  	"encoding/binary"
    21  	"fmt"
    22  	"unsafe"
    23  )
    24  
    25  // StringKeyIDRetriever implements the KeyRetriever interface GetKey
    26  // to allow setting in keys with a string id.
    27  type StringKeyIDRetriever map[string]string
    28  
    29  // PutKey adds a key with the given string ID that can be retrieved
    30  func (s StringKeyIDRetriever) PutKey(keyID, key string) {
    31  	s[keyID] = key
    32  }
    33  
    34  // GetKey expects the keymetadata to match one of the keys that were added
    35  // with PutKey and panics if the key cannot be found.
    36  func (s StringKeyIDRetriever) GetKey(keyMetadata []byte) string {
    37  	k, ok := s[*(*string)(unsafe.Pointer(&keyMetadata))]
    38  	if !ok {
    39  		panic(fmt.Errorf("parquet: key missing for id %s", keyMetadata))
    40  	}
    41  	return k
    42  }
    43  
    44  // IntegerKeyIDRetriever is used for using unsigned 32bit integers as key ids.
    45  type IntegerKeyIDRetriever map[uint32]string
    46  
    47  // PutKey adds keys with uint32 IDs
    48  func (i IntegerKeyIDRetriever) PutKey(keyID uint32, key string) {
    49  	i[keyID] = key
    50  }
    51  
    52  // GetKey expects the key metadata bytes to be a little endian uint32 which
    53  // is then used to retrieve the key bytes. Panics if the key id cannot be found.
    54  func (i IntegerKeyIDRetriever) GetKey(keyMetadata []byte) string {
    55  	keyID := binary.LittleEndian.Uint32(keyMetadata)
    56  	k, ok := i[keyID]
    57  	if !ok {
    58  		panic(fmt.Errorf("parquet: key missing for id %d", keyID))
    59  	}
    60  	return k
    61  }