| /* |
| * Copyright (C) 2009 The Android Open Source Project |
| * |
| * Licensed 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. |
| */ |
| |
| #include <stdio.h> |
| #include <stdint.h> |
| #include <string.h> |
| #include <sys/types.h> |
| #include <sys/socket.h> |
| |
| #include <cutils/sockets.h> |
| |
| #include "keystore.h" |
| |
| char *responses[256] = { |
| [NO_ERROR] = "No error", |
| [LOCKED] = "Locked", |
| [UNINITIALIZED] = "Uninitialized", |
| [SYSTEM_ERROR] = "System error", |
| [PROTOCOL_ERROR] = "Protocol error", |
| [PERMISSION_DENIED] = "Permission denied", |
| [KEY_NOT_FOUND] = "Key not found", |
| [VALUE_CORRUPTED] = "Value corrupted", |
| [UNDEFINED_ACTION] = "Undefined action", |
| [WRONG_PASSWORD] = "Wrong password (last chance)", |
| [WRONG_PASSWORD + 1] = "Wrong password (2 tries left)", |
| [WRONG_PASSWORD + 2] = "Wrong password (3 tries left)", |
| [WRONG_PASSWORD + 3] = "Wrong password (4 tries left)", |
| }; |
| |
| #define MAX_RESPONSE (WRONG_PASSWORD + 3) |
| |
| int main(int argc, char **argv) |
| { |
| uint8_t bytes[65536]; |
| uint8_t code; |
| int sock, i; |
| |
| if (argc < 2) { |
| printf("Usage: %s action [parameter ...]\n", argv[0]); |
| return 0; |
| } |
| |
| sock = socket_local_client("keystore", ANDROID_SOCKET_NAMESPACE_RESERVED, |
| SOCK_STREAM); |
| if (sock == -1) { |
| puts("Failed to connect"); |
| return 1; |
| } |
| |
| send(sock, argv[1], 1, 0); |
| for (i = 2; i < argc; ++i) { |
| uint16_t length = strlen(argv[i]); |
| bytes[0] = length >> 8; |
| bytes[1] = length; |
| send(sock, &bytes, 2, 0); |
| send(sock, argv[i], length, 0); |
| } |
| shutdown(sock, SHUT_WR); |
| |
| if (recv(sock, &code, 1, 0) != 1) { |
| puts("Failed to receive"); |
| return 1; |
| } |
| printf("%d %s\n", code , responses[code] ? responses[code] : "Unknown"); |
| while ((i = recv(sock, &bytes[0], 1, 0)) == 1) { |
| int length; |
| int offset; |
| if ((i = recv(sock, &bytes[1], 1, 0)) != 1) { |
| puts("Failed to receive"); |
| return 1; |
| } |
| length = bytes[0] << 8 | bytes[1]; |
| for (offset = 0; offset < length; offset += i) { |
| i = recv(sock, &bytes[offset], length - offset, 0); |
| if (i <= 0) { |
| puts("Failed to receive"); |
| return 1; |
| } |
| } |
| fwrite(bytes, 1, length, stdout); |
| puts(""); |
| } |
| return 0; |
| } |